Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Prochoice
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
// This is an NFT for Dusko https://twitter.com/duskoworld
// Smart contract developed by Ian Cherkowski https://twitter.com/IanCherkowski
// Thanks to chiru-labs for their gas friendly ERC721A implementation.
//
import "./ERC721A.sol";
import "./Ownable.sol";
import "./IERC20.sol";
import "./ReentrancyGuard.sol";
import "./ERC2981.sol";
import "./MerkleProof.sol";
contract Prochoice is
ERC721A,
ReentrancyGuard,
Ownable,
ERC2981
{
event PaymentReceived(address from, uint256 amount);
string private constant _name = "Pro Choice NFT";
string private constant _symbol = "PRO";
string public baseURI = "https://ipfs.io/ipfs/QmPnbNRjn4bSL7rsuiX8hAvkwd8CKjB7jZYzcvRXNuDTWk/";
uint256 public cost = 0.0165 ether;
uint256 public maxSupply = 5000;
bool public freezeURI = false;
bool public freezeSupply = false;
bool public paused = true;
bool public presale = true;
mapping(uint256 => bool) public tokenToIsStaked;
mapping(address => bool) private hasMinted;
bytes32 private whitelistMerkleRoot;
address[] private firstPayees = [msg.sender];
uint16[] private firstShares = [100];
constructor() ERC721A(_name, _symbol) payable {
_setDefaultRoyalty(address(this), 500);
}
// @dev needed to enable receiving to test withdrawls
receive() external payable virtual {
emit PaymentReceived(_msgSender(), msg.value);
}
//to check if the address is an nft
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, ERC2981) returns (bool) {
return super.supportsInterface(interfaceId);
}
// @dev owner can mint to a list of addresses with the quantity entered
function gift(address[] calldata recipients, uint256[] calldata amounts) external onlyOwner {
uint256 numTokens = 0;
uint256 i;
require(recipients.length == amounts.length, "Prochoice: The number of addresses is not matching the number of amounts");
unchecked{
//find total to be minted
for (i = 0; i < recipients.length; i++) {
require(Address.isContract(recipients[i]) == false, "Prochoice: no contracts");
numTokens += amounts[i];
}
require(totalSupply() + numTokens <= maxSupply, "Prochoice: Can't mint more than the max supply");
//mint to the list
for (i = 0; i < amounts.length; i++) {
_safeMint(recipients[i], amounts[i]);
}
}
}
// @dev public minting, accepts affiliate address
function mint(bytes32[] calldata merkleProof) external payable nonReentrant {
bool approved;
require(Address.isContract(msg.sender) == false, "Prochoice: no contracts");
require(paused == false, "Prochoice: Minting not started yet");
require(hasMinted[msg.sender] == false, "Prochoice: this wallet has already minted");
require(totalSupply() + 1 <= maxSupply, "Prochoice: Can't mint more than max supply");
if (presale) {
approved = isValidMerkleProof(msg.sender, merkleProof);
require(approved || msg.value >= cost, "Prochoice: You must register on heymint or pay for the nft");
} else {
require(msg.value >= cost, "Prochoice: You must pay for the nft");
}
_safeMint(msg.sender, 1);
hasMinted[msg.sender] = true;
}
function isValidMerkleProof(address to, bytes32[] calldata merkleProof) public view returns (bool) {
return MerkleProof.verify(merkleProof, whitelistMerkleRoot, keccak256(abi.encodePacked(to)));
}
function setWhitelistMerkleRoot(bytes32 merkleRoot) external onlyOwner {
whitelistMerkleRoot = merkleRoot;
}
//@dev prevent transfer or burn of staked id
function _beforeTokenTransfers(address /*from*/, address /*to*/, uint256 startTokenId, uint256 /*quantity*/) internal virtual override {
require(tokenToIsStaked[startTokenId] == false, "Prochoice, cannot transfer - currently locked");
}
/**
* @dev returns whether a token is currently staked
*/
function isStaked(uint256 tokenId) public view returns (bool) {
return tokenToIsStaked[tokenId];
}
/**
* @dev marks a token as staked, calling this function
* you disable the ability to transfer the token.
*/
function stake(uint256 tokenId) external nonReentrant {
require(msg.sender == ownerOf(tokenId), "Color: caller is not the owner");
tokenToIsStaked[tokenId] = true;
}
/**
* @dev marks a token as unstaked. By calling this function
* you re-enable the ability to transfer the token.
*/
function unstake(uint256 tokenId) external nonReentrant {
require(msg.sender == ownerOf(tokenId), "Color: caller is not the owner");
tokenToIsStaked[tokenId] = false;
}
// @dev set cost of minting
function setCost(uint256 _newCost) external onlyOwner {
cost = _newCost;
}
// @dev unpause main minting stage
function setPaused(bool _status) external onlyOwner {
paused = _status;
}
// @dev unpause main minting stage
function setPresale(bool _status) external onlyOwner {
presale = _status;
}
// @dev Set the base url path to the metadata used by opensea
function setBaseURI(string memory _baseTokenURI) external onlyOwner {
require(freezeURI == false, "Prochoice: uri is frozen");
baseURI = _baseTokenURI;
}
// @dev freeze the URI
function setFreezeURI() external onlyOwner {
freezeURI = true;
}
// @dev show the baseuri
function _baseURI() internal view virtual override returns (string memory) {
return baseURI;
}
// @dev Add payee for payment splitter
function FreezeSupply() external onlyOwner {
freezeSupply = true;
}
//reduce max supply if needed
function reduceMaxSupply(uint16 newMax) external onlyOwner {
require(freezeSupply == false, "Prochoice: Max supply is frozen");
require(newMax < maxSupply, "Prochoice: New maximum must be less than existing maximum");
require(newMax >= totalSupply(), "Prochoice: New maximum can't be less than minted count");
maxSupply = newMax;
}
/**
* @dev External onlyOwner version of {ERC2981-_setDefaultRoyalty}.
*/
function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyOwner {
_setDefaultRoyalty(receiver, feeNumerator);
}
// @dev used to withdraw erc20 tokens like DAI
function withdrawERC20(IERC20 token, address to) external onlyOwner {
token.transfer(to, token.balanceOf(address(this)));
}
// @dev used to withdraw eth
function withdraw(address payable to) external onlyOwner {
Address.sendValue(to,address(this).balance);
}
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)
pragma solidity 0.8.15;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity 0.8.15;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity 0.8.15;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/common/ERC2981.sol)
pragma solidity 0.8.15;
import "./IERC2981.sol";
import "./ERC165.sol";
/**
* @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
*
* Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
* specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
*
* Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
* fee is specified in basis points by default.
*
* IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
* https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
* voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
*
* _Available since v4.5._
*/
abstract contract ERC2981 is IERC2981, ERC165 {
struct RoyaltyInfo {
address receiver;
uint96 royaltyFraction;
}
RoyaltyInfo private _defaultRoyaltyInfo;
mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {
return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @inheritdoc IERC2981
*/
function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];
if (royalty.receiver == address(0)) {
royalty = _defaultRoyaltyInfo;
}
uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();
return (royalty.receiver, royaltyAmount);
}
/**
* @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
* fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
* override.
*/
function _feeDenominator() internal pure virtual returns (uint96) {
return 10000;
}
/**
* @dev Sets the royalty information that all ids in this contract will default to.
*
* Requirements:
*
* - `receiver` cannot be the zero address.
* - `feeNumerator` cannot be greater than the fee denominator.
*/
function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
require(receiver != address(0), "ERC2981: invalid receiver");
_defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
}
/**
* @dev Removes default royalty information.
*/
function _deleteDefaultRoyalty() internal virtual {
delete _defaultRoyaltyInfo;
}
/**
* @dev Sets the royalty information for a specific token id, overriding the global default.
*
* Requirements:
*
* - `receiver` cannot be the zero address.
* - `feeNumerator` cannot be greater than the fee denominator.
*/
function _setTokenRoyalty(
uint256 tokenId,
address receiver,
uint96 feeNumerator
) internal virtual {
require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
require(receiver != address(0), "ERC2981: Invalid parameters");
_tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
}
/**
* @dev Resets royalty information for the token id back to the global default.
*/
function _resetTokenRoyalty(uint256 tokenId) internal virtual {
delete _tokenRoyaltyInfo[tokenId];
}
}// SPDX-License-Identifier: MIT
// Creator: Chiru Labs
//https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol
pragma solidity 0.8.15;
import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";
error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension. Built to optimize for lower gas during batch mints.
*
* Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
*
* Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
*
* Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
*/
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Compiler will pack this into a single 256bit word.
struct TokenOwnership {
// The address of the owner.
address addr;
// Keeps track of the start time of ownership with minimal overhead for tokenomics.
uint64 startTimestamp;
// Whether the token has been burned.
bool burned;
}
// Compiler will pack this into a single 256bit word.
struct AddressData {
// Realistically, 2**64-1 is more than enough.
uint64 balance;
// Keeps track of mint count with minimal overhead for tokenomics.
uint64 numberMinted;
// Keeps track of burn count with minimal overhead for tokenomics.
uint64 numberBurned;
// For miscellaneous variable(s) pertaining to the address
// (e.g. number of whitelist mint slots used).
// If there are multiple variables, please pack them into a uint64.
uint64 aux;
}
// The tokenId of the next token to be minted.
uint256 internal _currentIndex;
// The number of tokens burned.
uint256 internal _burnCounter;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to ownership details
// An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
mapping(uint256 => TokenOwnership) internal _ownerships;
// Mapping owner address to address data
mapping(address => AddressData) private _addressData;
// 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;
// Mapping of tokenId storing its staked status
//mapping(uint256 => bool) public tokenToIsStaked;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
_currentIndex = _startTokenId();
}
/**
* To change the starting tokenId, please override this function.
*/
function _startTokenId() internal view virtual returns (uint256) {
return 1;
}
/**
* @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
*/
function totalSupply() public view returns (uint256) {
// Counter underflow is impossible as _burnCounter cannot be incremented
// more than _currentIndex - _startTokenId() times
unchecked {
return _currentIndex - _burnCounter - _startTokenId();
}
}
/**
* 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(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view override returns (uint256) {
if (owner == address(0)) revert BalanceQueryForZeroAddress();
return uint256(_addressData[owner].balance);
}
/**
* Returns the number of tokens minted by `owner`.
*/
function _numberMinted(address owner) internal view returns (uint256) {
return uint256(_addressData[owner].numberMinted);
}
/**
* Returns the number of tokens burned by or on behalf of `owner`.
*/
function _numberBurned(address owner) internal view returns (uint256) {
return uint256(_addressData[owner].numberBurned);
}
/**
* Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
*/
function _getAux(address owner) internal view returns (uint64) {
return _addressData[owner].aux;
}
/**
* Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
* If there are multiple variables, please pack them into a uint64.
*/
function _setAux(address owner, uint64 aux) internal {
_addressData[owner].aux = aux;
}
/**
* 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) {
uint256 curr = tokenId;
unchecked {
if (_startTokenId() <= curr && curr < _currentIndex) {
TokenOwnership memory ownership = _ownerships[curr];
if (!ownership.burned) {
if (ownership.addr != address(0)) {
return ownership;
}
// 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.
while (true) {
curr--;
ownership = _ownerships[curr];
if (ownership.addr != address(0)) {
return ownership;
}
}
}
}
}
revert OwnerQueryForNonexistentToken();
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view override returns (address) {
return _ownershipOf(tokenId).addr;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
string memory baseURI = _baseURI();
return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString(),".json")) : '';
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overriden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return '';
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public override {
address owner = ERC721A.ownerOf(tokenId);
if (to == owner) revert ApprovalToCurrentOwner();
if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
revert ApprovalCallerNotOwnerNorApproved();
}
_approve(to, tokenId, owner);
}
/**
* @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 == _msgSender()) revert ApproveToCaller();
_operatorApprovals[_msgSender()][operator] = approved;
emit ApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, '');
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public virtual override {
_transfer(from, to, tokenId);
if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
*/
function _exists(uint256 tokenId) internal view returns (bool) {
return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
}
function _safeMint(address to, uint256 quantity) internal {
_safeMint(to, quantity, '');
}
/**
* @dev Safely mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
* - `quantity` must be greater than 0.
*
* Emits a {Transfer} event.
*/
function _safeMint(
address to,
uint256 quantity,
bytes memory _data
) internal {
_mint(to, quantity, _data, true);
}
/**
* @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,
bytes memory _data,
bool safe
) internal {
uint256 startTokenId = _currentIndex;
if (to == address(0)) revert MintToZeroAddress();
if (quantity == 0) revert MintZeroQuantity();
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
// Overflows are incredibly unrealistic.
// balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
// updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
unchecked {
_addressData[to].balance += uint64(quantity);
_addressData[to].numberMinted += uint64(quantity);
_ownerships[startTokenId].addr = to;
_ownerships[startTokenId].startTimestamp = uint64(block.timestamp);
uint256 updatedIndex = startTokenId;
uint256 end = updatedIndex + quantity;
if (safe && to.isContract()) {
do {
emit Transfer(address(0), to, updatedIndex);
if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
revert TransferToNonERC721ReceiverImplementer();
}
} while (updatedIndex != end);
// Reentrancy protection
if (_currentIndex != startTokenId) revert();
} else {
do {
emit Transfer(address(0), to, updatedIndex++);
} while (updatedIndex != end);
}
_currentIndex = updatedIndex;
}
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
/**
* @dev 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 {
TokenOwnership memory prevOwnership = _ownershipOf(tokenId);
if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
bool isApprovedOrOwner = (_msgSender() == from ||
isApprovedForAll(from, _msgSender()) ||
getApproved(tokenId) == _msgSender());
if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
if (to == address(0)) revert TransferToZeroAddress();
_beforeTokenTransfers(from, to, tokenId, 1);
// Clear approvals from the previous owner
_approve(address(0), tokenId, from);
// 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 {
_addressData[from].balance -= 1;
_addressData[to].balance += 1;
TokenOwnership storage currSlot = _ownerships[tokenId];
currSlot.addr = to;
currSlot.startTimestamp = uint64(block.timestamp);
// If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
// Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
uint256 nextTokenId = tokenId + 1;
TokenOwnership storage nextSlot = _ownerships[nextTokenId];
if (nextSlot.addr == address(0)) {
// This will suffice for checking _exists(nextTokenId),
// as a burned slot cannot contain the zero address.
if (nextTokenId != _currentIndex) {
nextSlot.addr = from;
nextSlot.startTimestamp = prevOwnership.startTimestamp;
}
}
}
emit Transfer(from, to, tokenId);
_afterTokenTransfers(from, to, tokenId, 1);
}
/**
* @dev This is equivalent to _burn(tokenId, false)
*/
function _burn(uint256 tokenId) internal virtual {
_burn(tokenId, false);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
TokenOwnership memory prevOwnership = _ownershipOf(tokenId);
address from = prevOwnership.addr;
if (approvalCheck) {
bool isApprovedOrOwner = (_msgSender() == from ||
isApprovedForAll(from, _msgSender()) ||
getApproved(tokenId) == _msgSender());
if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
}
_beforeTokenTransfers(from, address(0), tokenId, 1);
// Clear approvals from the previous owner
_approve(address(0), tokenId, from);
// 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 {
AddressData storage addressData = _addressData[from];
addressData.balance -= 1;
addressData.numberBurned += 1;
// Keep track of who burned the token, and the timestamp of burning.
TokenOwnership storage currSlot = _ownerships[tokenId];
currSlot.addr = from;
currSlot.startTimestamp = uint64(block.timestamp);
currSlot.burned = true;
// If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
// Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
uint256 nextTokenId = tokenId + 1;
TokenOwnership storage nextSlot = _ownerships[nextTokenId];
if (nextSlot.addr == address(0)) {
// This will suffice for checking _exists(nextTokenId),
// as a burned slot cannot contain the zero address.
if (nextTokenId != _currentIndex) {
nextSlot.addr = from;
nextSlot.startTimestamp = prevOwnership.startTimestamp;
}
}
}
emit Transfer(from, address(0), tokenId);
_afterTokenTransfers(from, address(0), tokenId, 1);
// Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
unchecked {
_burnCounter++;
}
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(
address to,
uint256 tokenId,
address owner
) private {
_tokenApprovals[tokenId] = to;
emit Approval(owner, to, tokenId);
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param _data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkContractOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert TransferToNonERC721ReceiverImplementer();
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
}
/**
* @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
* And also called before burning one token.
*
* startTokenId - the first token id to be transferred
* quantity - the amount to be transferred
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, `tokenId` will be burned by `from`.
* - `from` and `to` are never both zero.
*/
function _beforeTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {
//only check the 1st id because transfer and burn use quantity 1
//require(tokenToIsStaked[startTokenId] == false, "Cannot transfer - currently locked");
}
/**
* @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 {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity 0.8.15;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)
pragma solidity 0.8.15;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol)
pragma solidity 0.8.15;
import "./IERC165.sol";
/**
* @dev Interface for the NFT Royalty Standard.
*
* A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
* support for royalty payments across all NFT marketplaces and ecosystem participants.
*
* _Available since v4.5._
*/
interface IERC2981 is IERC165 {
/**
* @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
* exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
*/
function royaltyInfo(uint256 tokenId, uint256 salePrice)
external
view
returns (address receiver, uint256 royaltyAmount);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)
pragma solidity 0.8.15;
import "./IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity 0.8.15;
import "./IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)
pragma solidity 0.8.15;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)
pragma solidity 0.8.15;
/**
* @dev These functions deal with verification of Merkle Trees proofs.
*
* The proofs can be generated using the JavaScript library
* https://github.com/miguelmota/merkletreejs[merkletreejs].
* Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
*
* See `test/utils/cryptography/MerkleProof.test.js` for some examples.
*
* WARNING: You should avoid using leaf values that are 64 bytes long prior to
* hashing, or use a hash function other than keccak256 for hashing leaves.
* This is because the concatenation of a sorted pair of internal nodes in
* the merkle tree could be reinterpreted as a leaf value.
*/
library MerkleProof {
/**
* @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
* defined by `root`. For this, a `proof` must be provided, containing
* sibling hashes on the branch from the leaf to the root of the tree. Each
* pair of leaves and each pair of pre-images are assumed to be sorted.
*/
function verify(
bytes32[] memory proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
/**
* @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
* from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
* hash matches the root of the tree. When processing the proof, the pairs
* of leafs & pre-images are assumed to be sorted.
*
* _Available since v4.4._
*/
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
bytes32 proofElement = proof[i];
if (computedHash <= proofElement) {
// Hash(current computed hash + current element of the proof)
computedHash = _efficientHash(computedHash, proofElement);
} else {
// Hash(current element of the proof + current computed hash)
computedHash = _efficientHash(proofElement, computedHash);
}
}
return computedHash;
}
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity 0.8.15;
import "./Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)
pragma solidity 0.8.15;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)
pragma solidity 0.8.15;
import "./IERC20.sol";
import "./Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity 0.8.15;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","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":"FreezeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeSupply","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeURI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"isValidMerkleProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"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":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"newMax","type":"uint16"}],"name":"reduceMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setFreezeURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stake","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":"","type":"uint256"}],"name":"tokenToIsStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
6101006040526044608081815290620032ff60a039600c9062000023908262000438565b50663a9ea99ecb4000600d55611388600e55600f805463ffffffff191663010100001790556040805160208101909152338152620000669060139060016200026d565b5060408051602081019091526064815262000086906014906001620002d7565b506040518060400160405280600e81526020016d141c9bc810da1bda58d94813919560921b8152506040518060400160405280600381526020016250524f60e81b8152508160029081620000db919062000438565b506003620000ea828262000438565b50600160005550506001600855620001023362000116565b62000110306101f462000168565b62000504565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b0382161115620001dc5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b038216620002345760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401620001d3565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b828054828255906000526020600020908101928215620002c5579160200282015b82811115620002c557825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200028e565b50620002d39291506200037c565b5090565b82805482825590600052602060002090600f01601090048101928215620002c55791602002820160005b838211156200034257835183826101000a81548161ffff021916908360ff160217905550926020019260020160208160010104928301926001030262000301565b8015620003725782816101000a81549061ffff021916905560020160208160010104928301926001030262000342565b5050620002d39291505b5b80821115620002d357600081556001016200037d565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003be57607f821691505b602082108103620003df57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200043357600081815260208120601f850160051c810160208610156200040e5750805b601f850160051c820191505b818110156200042f578281556001016200041a565b5050505b505050565b81516001600160401b0381111562000454576200045462000393565b6200046c81620004658454620003a9565b84620003e5565b602080601f831160018114620004a457600084156200048b5750858301515b600019600386901b1c1916600185901b1785556200042f565b600085815260208120601f198616915b82811015620004d557888601518255948401946001909101908401620004b4565b5085821015620004f45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612deb80620005146000396000f3fe6080604052600436106102605760003560e01c80637705f9b511610144578063b88d4fde116100b6578063c87b56dd1161007a578063c87b56dd14610773578063d5abeb0114610793578063def50f6c146107a9578063e985e9c5146107c9578063f2fde38b14610812578063fdea8e0b1461083257600080fd5b8063b88d4fde146106c9578063baa51f86146106e9578063bd32fb6614610719578063c54e73e314610739578063c793803c1461075957600080fd5b806398fa6c451161010857806398fa6c4514610611578063a22cb46514610631578063a694fc3a14610651578063a96533e914610671578063b440ff7a146106a1578063b77a147b146106b657600080fd5b80637705f9b51461057f5780637ec2402f1461059f5780638da5cb5b146105be5780639456fbcc146105dc57806395d89b41146105fc57600080fd5b80632a55205a116101dd57806355f804b3116101a157806355f804b3146104d55780635c975abb146104f55780636352211e146105155780636c0360eb1461053557806370a082311461054a578063715018a61461056a57600080fd5b80632a55205a146104165780632e17de781461045557806342842e0e1461047557806344a0d68a1461049557806351cff8d9146104b557600080fd5b806311d4bc9a1161022457806311d4bc9a1461037f57806313faede61461039457806316c38b3c146103b857806318160ddd146103d857806323b872dd146103f657600080fd5b806301ffc9a7146102ae57806304634d8d146102e357806306fdde0314610305578063081812fc14610327578063095ea7b31461035f57600080fd5b366102a9577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156102ba57600080fd5b506102ce6102c9366004612582565b610853565b60405190151581526020015b60405180910390f35b3480156102ef57600080fd5b506103036102fe3660046125b4565b610864565b005b34801561031157600080fd5b5061031a6108a5565b6040516102da9190612651565b34801561033357600080fd5b50610347610342366004612664565b610937565b6040516001600160a01b0390911681526020016102da565b34801561036b57600080fd5b5061030361037a36600461267d565b61097b565b34801561038b57600080fd5b50610303610a08565b3480156103a057600080fd5b506103aa600d5481565b6040519081526020016102da565b3480156103c457600080fd5b506103036103d33660046126b7565b610a41565b3480156103e457600080fd5b506103aa600154600054036000190190565b34801561040257600080fd5b506103036104113660046126d4565b610a87565b34801561042257600080fd5b50610436610431366004612715565b610a92565b604080516001600160a01b0390931683526020830191909152016102da565b34801561046157600080fd5b50610303610470366004612664565b610b40565b34801561048157600080fd5b506103036104903660046126d4565b610bed565b3480156104a157600080fd5b506103036104b0366004612664565b610c08565b3480156104c157600080fd5b506103036104d0366004612737565b610c37565b3480156104e157600080fd5b506103036104f03660046127df565b610c6e565b34801561050157600080fd5b50600f546102ce9062010000900460ff1681565b34801561052157600080fd5b50610347610530366004612664565b610cf7565b34801561054157600080fd5b5061031a610d09565b34801561055657600080fd5b506103aa610565366004612737565b610d97565b34801561057657600080fd5b50610303610de5565b34801561058b57600080fd5b5061030361059a36600461286b565b610e1b565b3480156105ab57600080fd5b50600f546102ce90610100900460ff1681565b3480156105ca57600080fd5b506009546001600160a01b0316610347565b3480156105e857600080fd5b506103036105f73660046128d6565b611058565b34801561060857600080fd5b5061031a611163565b34801561061d57600080fd5b5061030361062c366004612904565b611172565b34801561063d57600080fd5b5061030361064c366004612928565b6112fb565b34801561065d57600080fd5b5061030361066c366004612664565b611390565b34801561067d57600080fd5b506102ce61068c366004612664565b60106020526000908152604090205460ff1681565b3480156106ad57600080fd5b50610303611441565b6103036106c4366004612956565b61147c565b3480156106d557600080fd5b506103036106e4366004612997565b611776565b3480156106f557600080fd5b506102ce610704366004612664565b60009081526010602052604090205460ff1690565b34801561072557600080fd5b50610303610734366004612664565b6117c7565b34801561074557600080fd5b506103036107543660046126b7565b6117f6565b34801561076557600080fd5b50600f546102ce9060ff1681565b34801561077f57600080fd5b5061031a61078e366004612664565b61183e565b34801561079f57600080fd5b506103aa600e5481565b3480156107b557600080fd5b506102ce6107c4366004612a16565b6118c2565b3480156107d557600080fd5b506102ce6107e43660046128d6565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561081e57600080fd5b5061030361082d366004612737565b611942565b34801561083e57600080fd5b50600f546102ce906301000000900460ff1681565b600061085e826119da565b92915050565b6009546001600160a01b031633146108975760405162461bcd60e51b815260040161088e90612a6a565b60405180910390fd5b6108a182826119ff565b5050565b6060600280546108b490612a9f565b80601f01602080910402602001604051908101604052809291908181526020018280546108e090612a9f565b801561092d5780601f106109025761010080835404028352916020019161092d565b820191906000526020600020905b81548152906001019060200180831161091057829003601f168201915b5050505050905090565b600061094282611afc565b61095f576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061098682610cf7565b9050806001600160a01b0316836001600160a01b0316036109ba5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906109da57506109d881336107e4565b155b156109f8576040516367d9dca160e11b815260040160405180910390fd5b610a03838383611b35565b505050565b6009546001600160a01b03163314610a325760405162461bcd60e51b815260040161088e90612a6a565b600f805460ff19166001179055565b6009546001600160a01b03163314610a6b5760405162461bcd60e51b815260040161088e90612a6a565b600f8054911515620100000262ff000019909216919091179055565b610a03838383611b91565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610b07575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610b26906001600160601b031687612aef565b610b309190612b24565b91519350909150505b9250929050565b600260085403610b625760405162461bcd60e51b815260040161088e90612b38565b6002600855610b7081610cf7565b6001600160a01b0316336001600160a01b031614610bd05760405162461bcd60e51b815260206004820152601e60248201527f436f6c6f723a2063616c6c6572206973206e6f7420746865206f776e65720000604482015260640161088e565b6000908152601060205260409020805460ff191690556001600855565b610a0383838360405180602001604052806000815250611776565b6009546001600160a01b03163314610c325760405162461bcd60e51b815260040161088e90612a6a565b600d55565b6009546001600160a01b03163314610c615760405162461bcd60e51b815260040161088e90612a6a565b610c6b8147611d8c565b50565b6009546001600160a01b03163314610c985760405162461bcd60e51b815260040161088e90612a6a565b600f5460ff1615610ceb5760405162461bcd60e51b815260206004820152601860248201527f50726f63686f6963653a207572692069732066726f7a656e0000000000000000604482015260640161088e565b600c6108a18282612bb5565b6000610d0282611ea5565b5192915050565b600c8054610d1690612a9f565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4290612a9f565b8015610d8f5780601f10610d6457610100808354040283529160200191610d8f565b820191906000526020600020905b815481529060010190602001808311610d7257829003601f168201915b505050505081565b60006001600160a01b038216610dc0576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6009546001600160a01b03163314610e0f5760405162461bcd60e51b815260040161088e90612a6a565b610e196000611fcc565b565b6009546001600160a01b03163314610e455760405162461bcd60e51b815260040161088e90612a6a565b600080848314610ece5760405162461bcd60e51b815260206004820152604860248201527f50726f63686f6963653a20546865206e756d626572206f66206164647265737360448201527f6573206973206e6f74206d61746368696e6720746865206e756d626572206f6660648201526720616d6f756e747360c01b608482015260a40161088e565b5060005b84811015610f7957610f0a868683818110610eef57610eef612c74565b9050602002016020810190610f049190612737565b3b151590565b15610f515760405162461bcd60e51b815260206004820152601760248201527650726f63686f6963653a206e6f20636f6e74726163747360481b604482015260640161088e565b838382818110610f6357610f63612c74565b6020029190910135929092019150600101610ed2565b600e5482610f8e600154600054036000190190565b011115610ff45760405162461bcd60e51b815260206004820152602e60248201527f50726f63686f6963653a2043616e2774206d696e74206d6f7265207468616e2060448201526d746865206d617820737570706c7960901b606482015260840161088e565b5060005b828110156110505761104886868381811061101557611015612c74565b905060200201602081019061102a9190612737565b85858481811061103c5761103c612c74565b9050602002013561201e565b600101610ff8565b505050505050565b6009546001600160a01b031633146110825760405162461bcd60e51b815260040161088e90612a6a565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa1580156110d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f49190612c8a565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561113f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a039190612ca3565b6060600380546108b490612a9f565b6009546001600160a01b0316331461119c5760405162461bcd60e51b815260040161088e90612a6a565b600f54610100900460ff16156111f45760405162461bcd60e51b815260206004820152601f60248201527f50726f63686f6963653a204d617820737570706c792069732066726f7a656e00604482015260640161088e565b600e548161ffff161061126f5760405162461bcd60e51b815260206004820152603960248201527f50726f63686f6963653a204e6577206d6178696d756d206d757374206265206c60448201527f657373207468616e206578697374696e67206d6178696d756d00000000000000606482015260840161088e565b611280600154600054036000190190565b8161ffff1610156112f25760405162461bcd60e51b815260206004820152603660248201527f50726f63686f6963653a204e6577206d6178696d756d2063616e2774206265206044820152751b195cdcc81d1a185b881b5a5b9d19590818dbdd5b9d60521b606482015260840161088e565b61ffff16600e55565b336001600160a01b038316036113245760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6002600854036113b25760405162461bcd60e51b815260040161088e90612b38565b60026008556113c081610cf7565b6001600160a01b0316336001600160a01b0316146114205760405162461bcd60e51b815260206004820152601e60248201527f436f6c6f723a2063616c6c6572206973206e6f7420746865206f776e65720000604482015260640161088e565b6000908152601060205260409020805460ff19166001908117909155600855565b6009546001600160a01b0316331461146b5760405162461bcd60e51b815260040161088e90612a6a565b600f805461ff001916610100179055565b60026008540361149e5760405162461bcd60e51b815260040161088e90612b38565b60026008556000333b156114ee5760405162461bcd60e51b815260206004820152601760248201527650726f63686f6963653a206e6f20636f6e74726163747360481b604482015260640161088e565b600f5462010000900460ff16156115525760405162461bcd60e51b815260206004820152602260248201527f50726f63686f6963653a204d696e74696e67206e6f7420737461727465642079604482015261195d60f21b606482015260840161088e565b3360009081526011602052604090205460ff16156115c45760405162461bcd60e51b815260206004820152602960248201527f50726f63686f6963653a20746869732077616c6c65742068617320616c726561604482015268191e481b5a5b9d195960ba1b606482015260840161088e565b600e546115d8600154600054036000190190565b6115e3906001612cc0565b11156116445760405162461bcd60e51b815260206004820152602a60248201527f50726f63686f6963653a2043616e2774206d696e74206d6f7265207468616e206044820152696d617820737570706c7960b01b606482015260840161088e565b600f546301000000900460ff16156116e8576116613384846118c2565b905080806116715750600d543410155b6116e35760405162461bcd60e51b815260206004820152603a60248201527f50726f63686f6963653a20596f75206d757374207265676973746572206f6e2060448201527f6865796d696e74206f722070617920666f7220746865206e6674000000000000606482015260840161088e565b611746565b600d543410156117465760405162461bcd60e51b815260206004820152602360248201527f50726f63686f6963653a20596f75206d7573742070617920666f7220746865206044820152621b999d60ea1b606482015260840161088e565b61175133600161201e565b5050336000908152601160205260409020805460ff1916600190811790915560085550565b611781848484611b91565b6001600160a01b0383163b151580156117a357506117a184848484612038565b155b156117c1576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6009546001600160a01b031633146117f15760405162461bcd60e51b815260040161088e90612a6a565b601255565b6009546001600160a01b031633146118205760405162461bcd60e51b815260040161088e90612a6a565b600f805491151563010000000263ff00000019909216919091179055565b606061184982611afc565b61186657604051630a14c4b560e41b815260040160405180910390fd5b6000611870612123565b9050805160000361189057604051806020016040528060008152506118bb565b8061189a84612132565b6040516020016118ab929190612cd8565b6040516020818303038152906040525b9392505050565b600061193a838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506012546040516bffffffffffffffffffffffff1960608b901b166020820152909250603401905060405160208183030381529060405280519060200120612232565b949350505050565b6009546001600160a01b0316331461196c5760405162461bcd60e51b815260040161088e90612a6a565b6001600160a01b0381166119d15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161088e565b610c6b81611fcc565b60006001600160e01b0319821663152a902d60e11b148061085e575061085e82612248565b6127106001600160601b0382161115611a6d5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b606482015260840161088e565b6001600160a01b038216611ac35760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640161088e565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b600081600111158015611b10575060005482105b801561085e575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b9c82611ea5565b9050836001600160a01b031681600001516001600160a01b031614611bd35760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611bf15750611bf185336107e4565b80611c0c575033611c0184610937565b6001600160a01b0316145b905080611c2c57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611c5357604051633a954ecd60e21b815260040160405180910390fd5b611c608585856001612298565b611c6c60008487611b35565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611d40576000548214611d4057805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b80471015611ddc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161088e565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611e29576040519150601f19603f3d011682016040523d82523d6000602084013e611e2e565b606091505b5050905080610a035760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161088e565b60408051606081018252600080825260208201819052918101919091528180600111158015611ed5575060005481105b15611fb357600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290611fb15780516001600160a01b031615611f48579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215611fac579392505050565b611f48565b505b604051636f96cda160e11b815260040160405180910390fd5b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6108a182826040518060200160405280600081525061230d565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061206d903390899088908890600401612d17565b6020604051808303816000875af19250505080156120a8575060408051601f3d908101601f191682019092526120a591810190612d54565b60015b612106573d8080156120d6576040519150601f19603f3d011682016040523d82523d6000602084013e6120db565b606091505b5080516000036120fe576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6060600c80546108b490612a9f565b6060816000036121595750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612183578061216d81612d71565b915061217c9050600a83612b24565b915061215d565b6000816001600160401b0381111561219d5761219d612754565b6040519080825280601f01601f1916602001820160405280156121c7576020820181803683370190505b5090505b841561193a576121dc600183612d8a565b91506121e9600a86612da1565b6121f4906030612cc0565b60f81b81838151811061220957612209612c74565b60200101906001600160f81b031916908160001a90535061222b600a86612b24565b94506121cb565b60008261223f858461231a565b14949350505050565b60006001600160e01b031982166380ac58cd60e01b148061227957506001600160e01b03198216635b5e139f60e01b145b8061085e57506301ffc9a760e01b6001600160e01b031983161461085e565b60008281526010602052604090205460ff16156117c15760405162461bcd60e51b815260206004820152602d60248201527f50726f63686f6963652c2063616e6e6f74207472616e73666572202d2063757260448201526c1c995b9d1b1e481b1bd8dad959609a1b606482015260840161088e565b610a03838383600161238e565b600081815b845181101561238657600085828151811061233c5761233c612c74565b602002602001015190508083116123625760008381526020829052604090209250612373565b600081815260208490526040902092505b508061237e81612d71565b91505061231f565b509392505050565b6000546001600160a01b0385166123b757604051622e076360e81b815260040160405180910390fd5b836000036123d85760405163b562e8dd60e01b815260040160405180910390fd5b6123e56000868387612298565b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561249657506001600160a01b0387163b15155b1561251e575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46124e76000888480600101955088612038565b612504576040516368d2bf6b60e11b815260040160405180910390fd5b80820361249c57826000541461251957600080fd5b612563565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480820361251f575b50600055611d85565b6001600160e01b031981168114610c6b57600080fd5b60006020828403121561259457600080fd5b81356118bb8161256c565b6001600160a01b0381168114610c6b57600080fd5b600080604083850312156125c757600080fd5b82356125d28161259f565b915060208301356001600160601b03811681146125ee57600080fd5b809150509250929050565b60005b838110156126145781810151838201526020016125fc565b838111156117c15750506000910152565b6000815180845261263d8160208601602086016125f9565b601f01601f19169290920160200192915050565b6020815260006118bb6020830184612625565b60006020828403121561267657600080fd5b5035919050565b6000806040838503121561269057600080fd5b823561269b8161259f565b946020939093013593505050565b8015158114610c6b57600080fd5b6000602082840312156126c957600080fd5b81356118bb816126a9565b6000806000606084860312156126e957600080fd5b83356126f48161259f565b925060208401356127048161259f565b929592945050506040919091013590565b6000806040838503121561272857600080fd5b50508035926020909101359150565b60006020828403121561274957600080fd5b81356118bb8161259f565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b038084111561278457612784612754565b604051601f8501601f19908116603f011681019082821181831017156127ac576127ac612754565b816040528093508581528686860111156127c557600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156127f157600080fd5b81356001600160401b0381111561280757600080fd5b8201601f8101841361281857600080fd5b61193a8482356020840161276a565b60008083601f84011261283957600080fd5b5081356001600160401b0381111561285057600080fd5b6020830191508360208260051b8501011115610b3957600080fd5b6000806000806040858703121561288157600080fd5b84356001600160401b038082111561289857600080fd5b6128a488838901612827565b909650945060208701359150808211156128bd57600080fd5b506128ca87828801612827565b95989497509550505050565b600080604083850312156128e957600080fd5b82356128f48161259f565b915060208301356125ee8161259f565b60006020828403121561291657600080fd5b813561ffff811681146118bb57600080fd5b6000806040838503121561293b57600080fd5b82356129468161259f565b915060208301356125ee816126a9565b6000806020838503121561296957600080fd5b82356001600160401b0381111561297f57600080fd5b61298b85828601612827565b90969095509350505050565b600080600080608085870312156129ad57600080fd5b84356129b88161259f565b935060208501356129c88161259f565b92506040850135915060608501356001600160401b038111156129ea57600080fd5b8501601f810187136129fb57600080fd5b612a0a8782356020840161276a565b91505092959194509250565b600080600060408486031215612a2b57600080fd5b8335612a368161259f565b925060208401356001600160401b03811115612a5157600080fd5b612a5d86828701612827565b9497909650939450505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612ab357607f821691505b602082108103612ad357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612b0957612b09612ad9565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612b3357612b33612b0e565b500490565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b601f821115610a0357600081815260208120601f850160051c81016020861015612b965750805b601f850160051c820191505b8181101561105057828155600101612ba2565b81516001600160401b03811115612bce57612bce612754565b612be281612bdc8454612a9f565b84612b6f565b602080601f831160018114612c175760008415612bff5750858301515b600019600386901b1c1916600185901b178555611050565b600085815260208120601f198616915b82811015612c4657888601518255948401946001909101908401612c27565b5085821015612c645787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612c9c57600080fd5b5051919050565b600060208284031215612cb557600080fd5b81516118bb816126a9565b60008219821115612cd357612cd3612ad9565b500190565b60008351612cea8184602088016125f9565b835190830190612cfe8183602088016125f9565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d4a90830184612625565b9695505050505050565b600060208284031215612d6657600080fd5b81516118bb8161256c565b600060018201612d8357612d83612ad9565b5060010190565b600082821015612d9c57612d9c612ad9565b500390565b600082612db057612db0612b0e565b50069056fea2646970667358221220c93e2697f63731cc5c21b5bfd85288f73f98d573fc3f4b963a392454bdbe17cf64736f6c634300080f003368747470733a2f2f697066732e696f2f697066732f516d506e624e526a6e3462534c377273756958386841766b776438434b6a42376a5a597a637652584e754454576b2f
Deployed Bytecode
0x6080604052600436106102605760003560e01c80637705f9b511610144578063b88d4fde116100b6578063c87b56dd1161007a578063c87b56dd14610773578063d5abeb0114610793578063def50f6c146107a9578063e985e9c5146107c9578063f2fde38b14610812578063fdea8e0b1461083257600080fd5b8063b88d4fde146106c9578063baa51f86146106e9578063bd32fb6614610719578063c54e73e314610739578063c793803c1461075957600080fd5b806398fa6c451161010857806398fa6c4514610611578063a22cb46514610631578063a694fc3a14610651578063a96533e914610671578063b440ff7a146106a1578063b77a147b146106b657600080fd5b80637705f9b51461057f5780637ec2402f1461059f5780638da5cb5b146105be5780639456fbcc146105dc57806395d89b41146105fc57600080fd5b80632a55205a116101dd57806355f804b3116101a157806355f804b3146104d55780635c975abb146104f55780636352211e146105155780636c0360eb1461053557806370a082311461054a578063715018a61461056a57600080fd5b80632a55205a146104165780632e17de781461045557806342842e0e1461047557806344a0d68a1461049557806351cff8d9146104b557600080fd5b806311d4bc9a1161022457806311d4bc9a1461037f57806313faede61461039457806316c38b3c146103b857806318160ddd146103d857806323b872dd146103f657600080fd5b806301ffc9a7146102ae57806304634d8d146102e357806306fdde0314610305578063081812fc14610327578063095ea7b31461035f57600080fd5b366102a9577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156102ba57600080fd5b506102ce6102c9366004612582565b610853565b60405190151581526020015b60405180910390f35b3480156102ef57600080fd5b506103036102fe3660046125b4565b610864565b005b34801561031157600080fd5b5061031a6108a5565b6040516102da9190612651565b34801561033357600080fd5b50610347610342366004612664565b610937565b6040516001600160a01b0390911681526020016102da565b34801561036b57600080fd5b5061030361037a36600461267d565b61097b565b34801561038b57600080fd5b50610303610a08565b3480156103a057600080fd5b506103aa600d5481565b6040519081526020016102da565b3480156103c457600080fd5b506103036103d33660046126b7565b610a41565b3480156103e457600080fd5b506103aa600154600054036000190190565b34801561040257600080fd5b506103036104113660046126d4565b610a87565b34801561042257600080fd5b50610436610431366004612715565b610a92565b604080516001600160a01b0390931683526020830191909152016102da565b34801561046157600080fd5b50610303610470366004612664565b610b40565b34801561048157600080fd5b506103036104903660046126d4565b610bed565b3480156104a157600080fd5b506103036104b0366004612664565b610c08565b3480156104c157600080fd5b506103036104d0366004612737565b610c37565b3480156104e157600080fd5b506103036104f03660046127df565b610c6e565b34801561050157600080fd5b50600f546102ce9062010000900460ff1681565b34801561052157600080fd5b50610347610530366004612664565b610cf7565b34801561054157600080fd5b5061031a610d09565b34801561055657600080fd5b506103aa610565366004612737565b610d97565b34801561057657600080fd5b50610303610de5565b34801561058b57600080fd5b5061030361059a36600461286b565b610e1b565b3480156105ab57600080fd5b50600f546102ce90610100900460ff1681565b3480156105ca57600080fd5b506009546001600160a01b0316610347565b3480156105e857600080fd5b506103036105f73660046128d6565b611058565b34801561060857600080fd5b5061031a611163565b34801561061d57600080fd5b5061030361062c366004612904565b611172565b34801561063d57600080fd5b5061030361064c366004612928565b6112fb565b34801561065d57600080fd5b5061030361066c366004612664565b611390565b34801561067d57600080fd5b506102ce61068c366004612664565b60106020526000908152604090205460ff1681565b3480156106ad57600080fd5b50610303611441565b6103036106c4366004612956565b61147c565b3480156106d557600080fd5b506103036106e4366004612997565b611776565b3480156106f557600080fd5b506102ce610704366004612664565b60009081526010602052604090205460ff1690565b34801561072557600080fd5b50610303610734366004612664565b6117c7565b34801561074557600080fd5b506103036107543660046126b7565b6117f6565b34801561076557600080fd5b50600f546102ce9060ff1681565b34801561077f57600080fd5b5061031a61078e366004612664565b61183e565b34801561079f57600080fd5b506103aa600e5481565b3480156107b557600080fd5b506102ce6107c4366004612a16565b6118c2565b3480156107d557600080fd5b506102ce6107e43660046128d6565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561081e57600080fd5b5061030361082d366004612737565b611942565b34801561083e57600080fd5b50600f546102ce906301000000900460ff1681565b600061085e826119da565b92915050565b6009546001600160a01b031633146108975760405162461bcd60e51b815260040161088e90612a6a565b60405180910390fd5b6108a182826119ff565b5050565b6060600280546108b490612a9f565b80601f01602080910402602001604051908101604052809291908181526020018280546108e090612a9f565b801561092d5780601f106109025761010080835404028352916020019161092d565b820191906000526020600020905b81548152906001019060200180831161091057829003601f168201915b5050505050905090565b600061094282611afc565b61095f576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061098682610cf7565b9050806001600160a01b0316836001600160a01b0316036109ba5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906109da57506109d881336107e4565b155b156109f8576040516367d9dca160e11b815260040160405180910390fd5b610a03838383611b35565b505050565b6009546001600160a01b03163314610a325760405162461bcd60e51b815260040161088e90612a6a565b600f805460ff19166001179055565b6009546001600160a01b03163314610a6b5760405162461bcd60e51b815260040161088e90612a6a565b600f8054911515620100000262ff000019909216919091179055565b610a03838383611b91565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610b07575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610b26906001600160601b031687612aef565b610b309190612b24565b91519350909150505b9250929050565b600260085403610b625760405162461bcd60e51b815260040161088e90612b38565b6002600855610b7081610cf7565b6001600160a01b0316336001600160a01b031614610bd05760405162461bcd60e51b815260206004820152601e60248201527f436f6c6f723a2063616c6c6572206973206e6f7420746865206f776e65720000604482015260640161088e565b6000908152601060205260409020805460ff191690556001600855565b610a0383838360405180602001604052806000815250611776565b6009546001600160a01b03163314610c325760405162461bcd60e51b815260040161088e90612a6a565b600d55565b6009546001600160a01b03163314610c615760405162461bcd60e51b815260040161088e90612a6a565b610c6b8147611d8c565b50565b6009546001600160a01b03163314610c985760405162461bcd60e51b815260040161088e90612a6a565b600f5460ff1615610ceb5760405162461bcd60e51b815260206004820152601860248201527f50726f63686f6963653a207572692069732066726f7a656e0000000000000000604482015260640161088e565b600c6108a18282612bb5565b6000610d0282611ea5565b5192915050565b600c8054610d1690612a9f565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4290612a9f565b8015610d8f5780601f10610d6457610100808354040283529160200191610d8f565b820191906000526020600020905b815481529060010190602001808311610d7257829003601f168201915b505050505081565b60006001600160a01b038216610dc0576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6009546001600160a01b03163314610e0f5760405162461bcd60e51b815260040161088e90612a6a565b610e196000611fcc565b565b6009546001600160a01b03163314610e455760405162461bcd60e51b815260040161088e90612a6a565b600080848314610ece5760405162461bcd60e51b815260206004820152604860248201527f50726f63686f6963653a20546865206e756d626572206f66206164647265737360448201527f6573206973206e6f74206d61746368696e6720746865206e756d626572206f6660648201526720616d6f756e747360c01b608482015260a40161088e565b5060005b84811015610f7957610f0a868683818110610eef57610eef612c74565b9050602002016020810190610f049190612737565b3b151590565b15610f515760405162461bcd60e51b815260206004820152601760248201527650726f63686f6963653a206e6f20636f6e74726163747360481b604482015260640161088e565b838382818110610f6357610f63612c74565b6020029190910135929092019150600101610ed2565b600e5482610f8e600154600054036000190190565b011115610ff45760405162461bcd60e51b815260206004820152602e60248201527f50726f63686f6963653a2043616e2774206d696e74206d6f7265207468616e2060448201526d746865206d617820737570706c7960901b606482015260840161088e565b5060005b828110156110505761104886868381811061101557611015612c74565b905060200201602081019061102a9190612737565b85858481811061103c5761103c612c74565b9050602002013561201e565b600101610ff8565b505050505050565b6009546001600160a01b031633146110825760405162461bcd60e51b815260040161088e90612a6a565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa1580156110d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f49190612c8a565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561113f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a039190612ca3565b6060600380546108b490612a9f565b6009546001600160a01b0316331461119c5760405162461bcd60e51b815260040161088e90612a6a565b600f54610100900460ff16156111f45760405162461bcd60e51b815260206004820152601f60248201527f50726f63686f6963653a204d617820737570706c792069732066726f7a656e00604482015260640161088e565b600e548161ffff161061126f5760405162461bcd60e51b815260206004820152603960248201527f50726f63686f6963653a204e6577206d6178696d756d206d757374206265206c60448201527f657373207468616e206578697374696e67206d6178696d756d00000000000000606482015260840161088e565b611280600154600054036000190190565b8161ffff1610156112f25760405162461bcd60e51b815260206004820152603660248201527f50726f63686f6963653a204e6577206d6178696d756d2063616e2774206265206044820152751b195cdcc81d1a185b881b5a5b9d19590818dbdd5b9d60521b606482015260840161088e565b61ffff16600e55565b336001600160a01b038316036113245760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6002600854036113b25760405162461bcd60e51b815260040161088e90612b38565b60026008556113c081610cf7565b6001600160a01b0316336001600160a01b0316146114205760405162461bcd60e51b815260206004820152601e60248201527f436f6c6f723a2063616c6c6572206973206e6f7420746865206f776e65720000604482015260640161088e565b6000908152601060205260409020805460ff19166001908117909155600855565b6009546001600160a01b0316331461146b5760405162461bcd60e51b815260040161088e90612a6a565b600f805461ff001916610100179055565b60026008540361149e5760405162461bcd60e51b815260040161088e90612b38565b60026008556000333b156114ee5760405162461bcd60e51b815260206004820152601760248201527650726f63686f6963653a206e6f20636f6e74726163747360481b604482015260640161088e565b600f5462010000900460ff16156115525760405162461bcd60e51b815260206004820152602260248201527f50726f63686f6963653a204d696e74696e67206e6f7420737461727465642079604482015261195d60f21b606482015260840161088e565b3360009081526011602052604090205460ff16156115c45760405162461bcd60e51b815260206004820152602960248201527f50726f63686f6963653a20746869732077616c6c65742068617320616c726561604482015268191e481b5a5b9d195960ba1b606482015260840161088e565b600e546115d8600154600054036000190190565b6115e3906001612cc0565b11156116445760405162461bcd60e51b815260206004820152602a60248201527f50726f63686f6963653a2043616e2774206d696e74206d6f7265207468616e206044820152696d617820737570706c7960b01b606482015260840161088e565b600f546301000000900460ff16156116e8576116613384846118c2565b905080806116715750600d543410155b6116e35760405162461bcd60e51b815260206004820152603a60248201527f50726f63686f6963653a20596f75206d757374207265676973746572206f6e2060448201527f6865796d696e74206f722070617920666f7220746865206e6674000000000000606482015260840161088e565b611746565b600d543410156117465760405162461bcd60e51b815260206004820152602360248201527f50726f63686f6963653a20596f75206d7573742070617920666f7220746865206044820152621b999d60ea1b606482015260840161088e565b61175133600161201e565b5050336000908152601160205260409020805460ff1916600190811790915560085550565b611781848484611b91565b6001600160a01b0383163b151580156117a357506117a184848484612038565b155b156117c1576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6009546001600160a01b031633146117f15760405162461bcd60e51b815260040161088e90612a6a565b601255565b6009546001600160a01b031633146118205760405162461bcd60e51b815260040161088e90612a6a565b600f805491151563010000000263ff00000019909216919091179055565b606061184982611afc565b61186657604051630a14c4b560e41b815260040160405180910390fd5b6000611870612123565b9050805160000361189057604051806020016040528060008152506118bb565b8061189a84612132565b6040516020016118ab929190612cd8565b6040516020818303038152906040525b9392505050565b600061193a838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506012546040516bffffffffffffffffffffffff1960608b901b166020820152909250603401905060405160208183030381529060405280519060200120612232565b949350505050565b6009546001600160a01b0316331461196c5760405162461bcd60e51b815260040161088e90612a6a565b6001600160a01b0381166119d15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161088e565b610c6b81611fcc565b60006001600160e01b0319821663152a902d60e11b148061085e575061085e82612248565b6127106001600160601b0382161115611a6d5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b606482015260840161088e565b6001600160a01b038216611ac35760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640161088e565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b600081600111158015611b10575060005482105b801561085e575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b9c82611ea5565b9050836001600160a01b031681600001516001600160a01b031614611bd35760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611bf15750611bf185336107e4565b80611c0c575033611c0184610937565b6001600160a01b0316145b905080611c2c57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611c5357604051633a954ecd60e21b815260040160405180910390fd5b611c608585856001612298565b611c6c60008487611b35565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611d40576000548214611d4057805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b80471015611ddc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161088e565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611e29576040519150601f19603f3d011682016040523d82523d6000602084013e611e2e565b606091505b5050905080610a035760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161088e565b60408051606081018252600080825260208201819052918101919091528180600111158015611ed5575060005481105b15611fb357600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290611fb15780516001600160a01b031615611f48579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215611fac579392505050565b611f48565b505b604051636f96cda160e11b815260040160405180910390fd5b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6108a182826040518060200160405280600081525061230d565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061206d903390899088908890600401612d17565b6020604051808303816000875af19250505080156120a8575060408051601f3d908101601f191682019092526120a591810190612d54565b60015b612106573d8080156120d6576040519150601f19603f3d011682016040523d82523d6000602084013e6120db565b606091505b5080516000036120fe576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6060600c80546108b490612a9f565b6060816000036121595750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612183578061216d81612d71565b915061217c9050600a83612b24565b915061215d565b6000816001600160401b0381111561219d5761219d612754565b6040519080825280601f01601f1916602001820160405280156121c7576020820181803683370190505b5090505b841561193a576121dc600183612d8a565b91506121e9600a86612da1565b6121f4906030612cc0565b60f81b81838151811061220957612209612c74565b60200101906001600160f81b031916908160001a90535061222b600a86612b24565b94506121cb565b60008261223f858461231a565b14949350505050565b60006001600160e01b031982166380ac58cd60e01b148061227957506001600160e01b03198216635b5e139f60e01b145b8061085e57506301ffc9a760e01b6001600160e01b031983161461085e565b60008281526010602052604090205460ff16156117c15760405162461bcd60e51b815260206004820152602d60248201527f50726f63686f6963652c2063616e6e6f74207472616e73666572202d2063757260448201526c1c995b9d1b1e481b1bd8dad959609a1b606482015260840161088e565b610a03838383600161238e565b600081815b845181101561238657600085828151811061233c5761233c612c74565b602002602001015190508083116123625760008381526020829052604090209250612373565b600081815260208490526040902092505b508061237e81612d71565b91505061231f565b509392505050565b6000546001600160a01b0385166123b757604051622e076360e81b815260040160405180910390fd5b836000036123d85760405163b562e8dd60e01b815260040160405180910390fd5b6123e56000868387612298565b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561249657506001600160a01b0387163b15155b1561251e575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46124e76000888480600101955088612038565b612504576040516368d2bf6b60e11b815260040160405180910390fd5b80820361249c57826000541461251957600080fd5b612563565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480820361251f575b50600055611d85565b6001600160e01b031981168114610c6b57600080fd5b60006020828403121561259457600080fd5b81356118bb8161256c565b6001600160a01b0381168114610c6b57600080fd5b600080604083850312156125c757600080fd5b82356125d28161259f565b915060208301356001600160601b03811681146125ee57600080fd5b809150509250929050565b60005b838110156126145781810151838201526020016125fc565b838111156117c15750506000910152565b6000815180845261263d8160208601602086016125f9565b601f01601f19169290920160200192915050565b6020815260006118bb6020830184612625565b60006020828403121561267657600080fd5b5035919050565b6000806040838503121561269057600080fd5b823561269b8161259f565b946020939093013593505050565b8015158114610c6b57600080fd5b6000602082840312156126c957600080fd5b81356118bb816126a9565b6000806000606084860312156126e957600080fd5b83356126f48161259f565b925060208401356127048161259f565b929592945050506040919091013590565b6000806040838503121561272857600080fd5b50508035926020909101359150565b60006020828403121561274957600080fd5b81356118bb8161259f565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b038084111561278457612784612754565b604051601f8501601f19908116603f011681019082821181831017156127ac576127ac612754565b816040528093508581528686860111156127c557600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156127f157600080fd5b81356001600160401b0381111561280757600080fd5b8201601f8101841361281857600080fd5b61193a8482356020840161276a565b60008083601f84011261283957600080fd5b5081356001600160401b0381111561285057600080fd5b6020830191508360208260051b8501011115610b3957600080fd5b6000806000806040858703121561288157600080fd5b84356001600160401b038082111561289857600080fd5b6128a488838901612827565b909650945060208701359150808211156128bd57600080fd5b506128ca87828801612827565b95989497509550505050565b600080604083850312156128e957600080fd5b82356128f48161259f565b915060208301356125ee8161259f565b60006020828403121561291657600080fd5b813561ffff811681146118bb57600080fd5b6000806040838503121561293b57600080fd5b82356129468161259f565b915060208301356125ee816126a9565b6000806020838503121561296957600080fd5b82356001600160401b0381111561297f57600080fd5b61298b85828601612827565b90969095509350505050565b600080600080608085870312156129ad57600080fd5b84356129b88161259f565b935060208501356129c88161259f565b92506040850135915060608501356001600160401b038111156129ea57600080fd5b8501601f810187136129fb57600080fd5b612a0a8782356020840161276a565b91505092959194509250565b600080600060408486031215612a2b57600080fd5b8335612a368161259f565b925060208401356001600160401b03811115612a5157600080fd5b612a5d86828701612827565b9497909650939450505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612ab357607f821691505b602082108103612ad357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612b0957612b09612ad9565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612b3357612b33612b0e565b500490565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b601f821115610a0357600081815260208120601f850160051c81016020861015612b965750805b601f850160051c820191505b8181101561105057828155600101612ba2565b81516001600160401b03811115612bce57612bce612754565b612be281612bdc8454612a9f565b84612b6f565b602080601f831160018114612c175760008415612bff5750858301515b600019600386901b1c1916600185901b178555611050565b600085815260208120601f198616915b82811015612c4657888601518255948401946001909101908401612c27565b5085821015612c645787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612c9c57600080fd5b5051919050565b600060208284031215612cb557600080fd5b81516118bb816126a9565b60008219821115612cd357612cd3612ad9565b500190565b60008351612cea8184602088016125f9565b835190830190612cfe8183602088016125f9565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d4a90830184612625565b9695505050505050565b600060208284031215612d6657600080fd5b81516118bb8161256c565b600060018201612d8357612d83612ad9565b5060010190565b600082821015612d9c57612d9c612ad9565b500390565b600082612db057612db0612b0e565b50069056fea2646970667358221220c93e2697f63731cc5c21b5bfd85288f73f98d573fc3f4b963a392454bdbe17cf64736f6c634300080f0033
Deployed Bytecode Sourcemap
442:6701:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1477:40;736:10:1;1477:40:13;;;-1:-1:-1;;;;;206:32:17;;;188:51;;1507:9:13;270:2:17;255:18;;248:34;161:18;1477:40:13;;;;;;;442:6701;;;;;1574:171;;;;;;;;;;-1:-1:-1;1574:171:13;;;;;:::i;:::-;;:::i;:::-;;;844:14:17;;837:22;819:41;;807:2;792:18;1574:171:13;;;;;;;;6636:146;;;;;;;;;;-1:-1:-1;6636:146:13;;;;;:::i;:::-;;:::i;:::-;;7734:100:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9245:204::-;;;;;;;;;;-1:-1:-1;9245:204:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2547:32:17;;;2529:51;;2517:2;2502:18;9245:204:4;2383:203:17;8808:371:4;;;;;;;;;;-1:-1:-1;8808:371:4;;;;;:::i;:::-;;:::i;5765:78:13:-;;;;;;;;;;;;;:::i;797:34::-;;;;;;;;;;;;;;;;;;;3057:25:17;;;3045:2;3030:18;797:34:13;2911:177:17;5268:81:13;;;;;;;;;;-1:-1:-1;5268:81:13;;;;;:::i;:::-;;:::i;3870:303:4:-;;;;;;;;;;;;3727:1;4124:12;3914:7;4108:13;:28;-1:-1:-1;;4108:46:4;;3870:303;10110:170;;;;;;;;;;-1:-1:-1;10110:170:4;;;;;:::i;:::-;;:::i;1674:442:3:-;;;;;;;;;;-1:-1:-1;1674:442:3;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;206:32:17;;;188:51;;270:2;255:18;;248:34;;;;161:18;1674:442:3;14:274:17;4910:191:13;;;;;;;;;;-1:-1:-1;4910:191:13;;;;;:::i;:::-;;:::i;10351:185:4:-;;;;;;;;;;-1:-1:-1;10351:185:4;;;;;:::i;:::-;;:::i;5139:82:13:-;;;;;;;;;;-1:-1:-1;5139:82:13;;;;;:::i;:::-;;:::i;7021:119::-;;;;;;;;;;-1:-1:-1;7021:119:13;;;;;:::i;:::-;;:::i;5553:176::-;;;;;;;;;;-1:-1:-1;5553:176:13;;;;;:::i;:::-;;:::i;948:25::-;;;;;;;;;;-1:-1:-1;948:25:13;;;;;;;;;;;7542:125:4;;;;;;;;;;-1:-1:-1;7542:125:4;;;;;:::i;:::-;;:::i;696:94:13:-;;;;;;;;;;;;;:::i;4990:206:4:-;;;;;;;;;;-1:-1:-1;4990:206:4;;;;;:::i;:::-;;:::i;1714:103:12:-;;;;;;;;;;;;;:::i;1824:841:13:-;;;;;;;;;;-1:-1:-1;1824:841:13;;;;;:::i;:::-;;:::i;912:32::-;;;;;;;;;;-1:-1:-1;912:32:13;;;;;;;;;;;1063:87:12;;;;;;;;;;-1:-1:-1;1136:6:12;;-1:-1:-1;;;;;1136:6:12;1063:87;;6842:137:13;;;;;;;;;;-1:-1:-1;6842:137:13;;;;;:::i;:::-;;:::i;7903:104:4:-;;;;;;;;;;;;;:::i;6165:372:13:-;;;;;;;;;;-1:-1:-1;6165:372:13;;;;;:::i;:::-;;:::i;9521:287:4:-;;;;;;;;;;-1:-1:-1;9521:287:4;;;;;:::i;:::-;;:::i;4572:188:13:-;;;;;;;;;;-1:-1:-1;4572:188:13;;;;;:::i;:::-;;:::i;1013:47::-;;;;;;;;;;-1:-1:-1;1013:47:13;;;;;:::i;:::-;;;;;;;;;;;;;;;;6041:81;;;;;;;;;;;;;:::i;2725:852::-;;;;;;:::i;:::-;;:::i;10607:369:4:-;;;;;;;;;;-1:-1:-1;10607:369:4;;;;;:::i;:::-;;:::i;4317:112:13:-;;;;;;;;;;-1:-1:-1;4317:112:13;;;;;:::i;:::-;4373:4;4397:24;;;:15;:24;;;;;;;;;4317:112;3803:122;;;;;;;;;;-1:-1:-1;3803:122:13;;;;;:::i;:::-;;:::i;5395:83::-;;;;;;;;;;-1:-1:-1;5395:83:13;;;;;:::i;:::-;;:::i;876:29::-;;;;;;;;;;-1:-1:-1;876:29:13;;;;;;;;8078:326:4;;;;;;;;;;-1:-1:-1;8078:326:4;;;;;:::i;:::-;;:::i;838:31:13:-;;;;;;;;;;;;;;;;3585:210;;;;;;;;;;-1:-1:-1;3585:210:13;;;;;:::i;:::-;;:::i;9879:164:4:-;;;;;;;;;;-1:-1:-1;9879:164:4;;;;;:::i;:::-;-1:-1:-1;;;;;10000:25:4;;;9976:4;10000:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;9879:164;1972:201:12;;;;;;;;;;-1:-1:-1;1972:201:12;;;;;:::i;:::-;;:::i;980:26:13:-;;;;;;;;;;-1:-1:-1;980:26:13;;;;;;;;;;;1574:171;1677:4;1701:36;1725:11;1701:23;:36::i;:::-;1694:43;1574:171;-1:-1:-1;;1574:171:13:o;6636:146::-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;;;;;;;;;6732:42:13::1;6751:8;6761:12;6732:18;:42::i;:::-;6636:146:::0;;:::o;7734:100:4:-;7788:13;7821:5;7814:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7734:100;:::o;9245:204::-;9313:7;9338:16;9346:7;9338;:16::i;:::-;9333:64;;9363:34;;-1:-1:-1;;;9363:34:4;;;;;;;;;;;9333:64;-1:-1:-1;9417:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;9417:24:4;;9245:204::o;8808:371::-;8881:13;8897:24;8913:7;8897:15;:24::i;:::-;8881:40;;8942:5;-1:-1:-1;;;;;8936:11:4;:2;-1:-1:-1;;;;;8936:11:4;;8932:48;;8956:24;;-1:-1:-1;;;8956:24:4;;;;;;;;;;;8932:48;736:10:1;-1:-1:-1;;;;;8997:21:4;;;;;;:63;;-1:-1:-1;9023:37:4;9040:5;736:10:1;9879:164:4;:::i;9023:37::-;9022:38;8997:63;8993:138;;;9084:35;;-1:-1:-1;;;9084:35:4;;;;;;;;;;;8993:138;9143:28;9152:2;9156:7;9165:5;9143:8;:28::i;:::-;8870:309;8808:371;;:::o;5765:78:13:-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;5819:9:13::1;:16:::0;;-1:-1:-1;;5819:16:13::1;5831:4;5819:16;::::0;;5765:78::o;5268:81::-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;5328:6:13::1;:16:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;5328:16:13;;::::1;::::0;;;::::1;::::0;;5268:81::o;10110:170:4:-;10244:28;10254:4;10260:2;10264:7;10244:9;:28::i;1674:442:3:-;1771:7;1829:27;;;:17;:27;;;;;;;;1800:56;;;;;;;;;-1:-1:-1;;;;;1800:56:3;;;;;-1:-1:-1;;;1800:56:3;;;-1:-1:-1;;;;;1800:56:3;;;;;;;;1771:7;;1869:92;;-1:-1:-1;1920:29:3;;;;;;;;;1930:19;1920:29;-1:-1:-1;;;;;1920:29:3;;;;-1:-1:-1;;;1920:29:3;;-1:-1:-1;;;;;1920:29:3;;;;;1869:92;2011:23;;;;1973:21;;2482:5;;1998:36;;-1:-1:-1;;;;;1998:36:3;:10;:36;:::i;:::-;1997:58;;;;:::i;:::-;2076:16;;;-1:-1:-1;1973:82:3;;-1:-1:-1;;1674:442:3;;;;;;:::o;4910:191:13:-;1778:1:14;2376:7;;:19;2368:63;;;;-1:-1:-1;;;2368:63:14;;;;;;;:::i;:::-;1778:1;2509:7;:18;4999:16:13::1;5007:7:::0;4999::::1;:16::i;:::-;-1:-1:-1::0;;;;;4985:30:13::1;:10;-1:-1:-1::0;;;;;4985:30:13::1;;4977:73;;;::::0;-1:-1:-1;;;4977:73:13;;12402:2:17;4977:73:13::1;::::0;::::1;12384:21:17::0;12441:2;12421:18;;;12414:30;12480:32;12460:18;;;12453:60;12530:18;;4977:73:13::1;12200:354:17::0;4977:73:13::1;5088:5;5061:24:::0;;;:15:::1;:24;::::0;;;;:32;;-1:-1:-1;;5061:32:13::1;::::0;;;2688:7:14;:22;4910:191:13:o;10351:185:4:-;10489:39;10506:4;10512:2;10516:7;10489:39;;;;;;;;;;;;:16;:39::i;5139:82:13:-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;5201:4:13::1;:15:::0;5139:82::o;7021:119::-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;7089:43:13::1;7107:2;7110:21;7089:17;:43::i;:::-;7021:119:::0;:::o;5553:176::-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;5640:9:13::1;::::0;::::1;;:18;5632:55;;;::::0;-1:-1:-1;;;5632:55:13;;12761:2:17;5632:55:13::1;::::0;::::1;12743:21:17::0;12800:2;12780:18;;;12773:30;12839:26;12819:18;;;12812:54;12883:18;;5632:55:13::1;12559:348:17::0;5632:55:13::1;5698:7;:23;5708:13:::0;5698:7;:23:::1;:::i;7542:125:4:-:0;7606:7;7633:21;7646:7;7633:12;:21::i;:::-;:26;;7542:125;-1:-1:-1;;7542:125:4:o;696:94:13:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4990:206:4:-;5054:7;-1:-1:-1;;;;;5078:19:4;;5074:60;;5106:28;;-1:-1:-1;;;5106:28:4;;;;;;;;;;;5074:60;-1:-1:-1;;;;;;5160:19:4;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;5160:27:4;;4990:206::o;1714:103:12:-;1136:6;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;1779:30:::1;1806:1;1779:18;:30::i;:::-;1714:103::o:0;1824:841:13:-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;1927:17:13::1;::::0;1997:35;;::::1;1989:120;;;::::0;-1:-1:-1;;;1989:120:13;;15318:2:17;1989:120:13::1;::::0;::::1;15300:21:17::0;15357:2;15337:18;;;15330:30;15396:34;15376:18;;;15369:62;15467:34;15447:18;;;15440:62;-1:-1:-1;;;15518:19:17;;;15511:39;15567:19;;1989:120:13::1;15116:476:17::0;1989:120:13::1;-1:-1:-1::0;2194:1:13::1;2185:195;2197:21:::0;;::::1;2185:195;;;2252:33;2271:10;;2282:1;2271:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;1120:20:0::0;1168:8;;;797:387;2252:33:13::1;:42;2244:78;;;::::0;-1:-1:-1;;;2244:78:13;;15931:2:17;2244:78:13::1;::::0;::::1;15913:21:17::0;15970:2;15950:18;;;15943:30;-1:-1:-1;;;15989:18:17;;;15982:53;16052:18;;2244:78:13::1;15729:347:17::0;2244:78:13::1;2354:7;;2362:1;2354:10;;;;;;;:::i;:::-;;;::::0;;;::::1;;2341:23:::0;;;::::1;::::0;-1:-1:-1;2220:3:13::1;;2185:195;;;2433:9;;2420;2404:13;3727:1:4::0;4124:12;3914:7;4108:13;:28;-1:-1:-1;;4108:46:4;;3870:303;2404:13:13::1;:25;:38;;2396:97;;;::::0;-1:-1:-1;;;2396:97:13;;16283:2:17;2396:97:13::1;::::0;::::1;16265:21:17::0;16322:2;16302:18;;;16295:30;16361:34;16341:18;;;16334:62;-1:-1:-1;;;16412:18:17;;;16405:44;16466:19;;2396:97:13::1;16081:410:17::0;2396:97:13::1;-1:-1:-1::0;2551:1:13::1;2542:108;2554:18:::0;;::::1;2542:108;;;2598:36;2608:10;;2619:1;2608:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2623:7;;2631:1;2623:10;;;;;;;:::i;:::-;;;;;;;2598:9;:36::i;:::-;2574:3;;2542:108;;;1916:749;;1824:841:::0;;;;:::o;6842:137::-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;6940:30:13::1;::::0;-1:-1:-1;;;6940:30:13;;6964:4:::1;6940:30;::::0;::::1;2529:51:17::0;-1:-1:-1;;;;;6921:14:13;::::1;::::0;::::1;::::0;6936:2;;6921:14;;6940:15:::1;::::0;2502:18:17;;6940:30:13::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6921:50;::::0;-1:-1:-1;;;;;;6921:50:13::1;::::0;;;;;;-1:-1:-1;;;;;206:32:17;;;6921:50:13::1;::::0;::::1;188:51:17::0;255:18;;;248:34;161:18;;6921:50:13::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;7903:104:4:-:0;7959:13;7992:7;7985:14;;;;;:::i;6165:372:13:-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;6243:12:13::1;::::0;::::1;::::0;::::1;;;:21;6235:65;;;::::0;-1:-1:-1;;;6235:65:13;;17137:2:17;6235:65:13::1;::::0;::::1;17119:21:17::0;17176:2;17156:18;;;17149:30;17215:33;17195:18;;;17188:61;17266:18;;6235:65:13::1;16935:355:17::0;6235:65:13::1;6328:9;;6319:6;:18;;;6311:88;;;::::0;-1:-1:-1;;;6311:88:13;;17497:2:17;6311:88:13::1;::::0;::::1;17479:21:17::0;17536:2;17516:18;;;17509:30;17575:34;17555:18;;;17548:62;17646:27;17626:18;;;17619:55;17691:19;;6311:88:13::1;17295:421:17::0;6311:88:13::1;6428:13;3727:1:4::0;4124:12;3914:7;4108:13;:28;-1:-1:-1;;4108:46:4;;3870:303;6428:13:13::1;6418:6;:23;;;;6410:90;;;::::0;-1:-1:-1;;;6410:90:13;;17923:2:17;6410:90:13::1;::::0;::::1;17905:21:17::0;17962:2;17942:18;;;17935:30;18001:34;17981:18;;;17974:62;-1:-1:-1;;;18052:18:17;;;18045:52;18114:19;;6410:90:13::1;17721:418:17::0;6410:90:13::1;6511:18;;:9;:18:::0;6165:372::o;9521:287:4:-;736:10:1;-1:-1:-1;;;;;9620:24:4;;;9616:54;;9653:17;;-1:-1:-1;;;9653:17:4;;;;;;;;;;;9616:54;736:10:1;9683:32:4;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;9683:42:4;;;;;;;;;;;;:53;;-1:-1:-1;;9683:53:4;;;;;;;;;;9752:48;;819:41:17;;;9683:42:4;;736:10:1;9752:48:4;;792:18:17;9752:48:4;;;;;;;9521:287;;:::o;4572:188:13:-;1778:1:14;2376:7;;:19;2368:63;;;;-1:-1:-1;;;2368:63:14;;;;;;;:::i;:::-;1778:1;2509:7;:18;4659:16:13::1;4667:7:::0;4659::::1;:16::i;:::-;-1:-1:-1::0;;;;;4645:30:13::1;:10;-1:-1:-1::0;;;;;4645:30:13::1;;4637:73;;;::::0;-1:-1:-1;;;4637:73:13;;12402:2:17;4637:73:13::1;::::0;::::1;12384:21:17::0;12441:2;12421:18;;;12414:30;12480:32;12460:18;;;12453:60;12530:18;;4637:73:13::1;12200:354:17::0;4637:73:13::1;4721:24;::::0;;;:15:::1;:24;::::0;;;;:31;;-1:-1:-1;;4721:31:13::1;4748:4;4721:31:::0;;::::1;::::0;;;2688:7:14;:22;4572:188:13:o;6041:81::-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;6095:12:13::1;:19:::0;;-1:-1:-1;;6095:19:13::1;;;::::0;;6041:81::o;2725:852::-;1778:1:14;2376:7;;:19;2368:63;;;;-1:-1:-1;;;2368:63:14;;;;;;;:::i;:::-;1778:1;2509:7;:18;2812:13:13::1;2865:10;1120:20:0::0;1168:8;2838:75:13::1;;;::::0;-1:-1:-1;;;2838:75:13;;15931:2:17;2838:75:13::1;::::0;::::1;15913:21:17::0;15970:2;15950:18;;;15943:30;-1:-1:-1;;;15989:18:17;;;15982:53;16052:18;;2838:75:13::1;15729:347:17::0;2838:75:13::1;2932:6;::::0;;;::::1;;;:15;2924:62;;;::::0;-1:-1:-1;;;2924:62:13;;18346:2:17;2924:62:13::1;::::0;::::1;18328:21:17::0;18385:2;18365:18;;;18358:30;18424:34;18404:18;;;18397:62;-1:-1:-1;;;18475:18:17;;;18468:32;18517:19;;2924:62:13::1;18144:398:17::0;2924:62:13::1;3015:10;3005:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;:30;2997:84;;;::::0;-1:-1:-1;;;2997:84:13;;18749:2:17;2997:84:13::1;::::0;::::1;18731:21:17::0;18788:2;18768:18;;;18761:30;18827:34;18807:18;;;18800:62;-1:-1:-1;;;18878:18:17;;;18871:39;18927:19;;2997:84:13::1;18547:405:17::0;2997:84:13::1;3121:9;;3100:13;3727:1:4::0;4124:12;3914:7;4108:13;:28;-1:-1:-1;;4108:46:4;;3870:303;3100:13:13::1;:17;::::0;3116:1:::1;3100:17;:::i;:::-;:30;;3092:85;;;::::0;-1:-1:-1;;;3092:85:13;;19292:2:17;3092:85:13::1;::::0;::::1;19274:21:17::0;19331:2;19311:18;;;19304:30;19370:34;19350:18;;;19343:62;-1:-1:-1;;;19421:18:17;;;19414:40;19471:19;;3092:85:13::1;19090:406:17::0;3092:85:13::1;3194:7;::::0;;;::::1;;;3190:307;;;3229:43;3248:10;3260:11;;3229:18;:43::i;:::-;3218:54;;3295:8;:29;;;;3320:4;;3307:9;:17;;3295:29;3287:100;;;::::0;-1:-1:-1;;;3287:100:13;;19703:2:17;3287:100:13::1;::::0;::::1;19685:21:17::0;19742:2;19722:18;;;19715:30;19781:34;19761:18;;;19754:62;19852:28;19832:18;;;19825:56;19898:19;;3287:100:13::1;19501:422:17::0;3287:100:13::1;3190:307;;;3441:4;;3428:9;:17;;3420:65;;;::::0;-1:-1:-1;;;3420:65:13;;20130:2:17;3420:65:13::1;::::0;::::1;20112:21:17::0;20169:2;20149:18;;;20142:30;20208:34;20188:18;;;20181:62;-1:-1:-1;;;20259:18:17;;;20252:33;20302:19;;3420:65:13::1;19928:399:17::0;3420:65:13::1;3509:24;3519:10;3531:1;3509:9;:24::i;:::-;-1:-1:-1::0;;3554:10:13::1;3544:21;::::0;;;:9:::1;:21;::::0;;;;:28;;-1:-1:-1;;3544:28:13::1;3568:4;3544:28:::0;;::::1;::::0;;;2688:7:14;:22;-1:-1:-1;2725:852:13:o;10607:369:4:-;10774:28;10784:4;10790:2;10794:7;10774:9;:28::i;:::-;-1:-1:-1;;;;;10817:13:4;;1120:20:0;1168:8;;10817:76:4;;;;;10837:56;10868:4;10874:2;10878:7;10887:5;10837:30;:56::i;:::-;10836:57;10817:76;10813:156;;;10917:40;;-1:-1:-1;;;10917:40:4;;;;;;;;;;;10813:156;10607:369;;;;:::o;3803:122:13:-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;3885:19:13::1;:32:::0;3803:122::o;5395:83::-;1136:6:12;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;5456:7:13::1;:17:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;5456:17:13;;::::1;::::0;;;::::1;::::0;;5395:83::o;8078:326:4:-;8151:13;8182:16;8190:7;8182;:16::i;:::-;8177:59;;8207:29;;-1:-1:-1;;;8207:29:4;;;;;;;;;;;8177:59;8249:21;8273:10;:8;:10::i;:::-;8249:34;;8307:7;8301:21;8326:1;8301:26;:95;;;;;;;;;;;;;;;;;8354:7;8363:18;:7;:16;:18::i;:::-;8337:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8301:95;8294:102;8078:326;-1:-1:-1;;;8078:326:4:o;3585:210:13:-;3678:4;3702:85;3721:11;;3702:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3734:19:13;;3765:20;;-1:-1:-1;;21123:2:17;21119:15;;;21115:53;3765:20:13;;;21103:66:17;3734:19:13;;-1:-1:-1;21185:12:17;;;-1:-1:-1;3765:20:13;;;;;;;;;;;;3755:31;;;;;;3702:18;:85::i;:::-;3695:92;3585:210;-1:-1:-1;;;;3585:210:13:o;1972:201:12:-;1136:6;;-1:-1:-1;;;;;1136:6:12;736:10:1;1283:23:12;1275:68;;;;-1:-1:-1;;;1275:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;2061:22:12;::::1;2053:73;;;::::0;-1:-1:-1;;;2053:73:12;;21410:2:17;2053:73:12::1;::::0;::::1;21392:21:17::0;21449:2;21429:18;;;21422:30;21488:34;21468:18;;;21461:62;-1:-1:-1;;;21539:18:17;;;21532:36;21585:19;;2053:73:12::1;21208:402:17::0;2053:73:12::1;2137:28;2156:8;2137:18;:28::i;1404:215:3:-:0;1506:4;-1:-1:-1;;;;;;1530:41:3;;-1:-1:-1;;;1530:41:3;;:81;;;1575:36;1599:11;1575:23;:36::i;2766:332::-;2482:5;-1:-1:-1;;;;;2869:33:3;;;;2861:88;;;;-1:-1:-1;;;2861:88:3;;21817:2:17;2861:88:3;;;21799:21:17;21856:2;21836:18;;;21829:30;21895:34;21875:18;;;21868:62;-1:-1:-1;;;21946:18:17;;;21939:40;21996:19;;2861:88:3;21615:406:17;2861:88:3;-1:-1:-1;;;;;2968:22:3;;2960:60;;;;-1:-1:-1;;;2960:60:3;;22228:2:17;2960:60:3;;;22210:21:17;22267:2;22247:18;;;22240:30;22306:27;22286:18;;;22279:55;22351:18;;2960:60:3;22026:349:17;2960:60:3;3055:35;;;;;;;;;-1:-1:-1;;;;;3055:35:3;;;;;;-1:-1:-1;;;;;3055:35:3;;;;;;;;;;-1:-1:-1;;;3033:57:3;;;;:19;:57;2766:332::o;11231:174:4:-;11288:4;11331:7;3727:1;11312:26;;:53;;;;;11352:13;;11342:7;:23;11312:53;:85;;;;-1:-1:-1;;11370:20:4;;;;:11;:20;;;;;:27;-1:-1:-1;;;11370:27:4;;;;11369:28;;11231:174::o;19388:196::-;19503:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;19503:29:4;-1:-1:-1;;;;;19503:29:4;;;;;;;;;19548:28;;19503:24;;19548:28;;;;;;;19388:196;;;:::o;14331:2130::-;14446:35;14484:21;14497:7;14484:12;:21::i;:::-;14446:59;;14544:4;-1:-1:-1;;;;;14522:26:4;:13;:18;;;-1:-1:-1;;;;;14522:26:4;;14518:67;;14557:28;;-1:-1:-1;;;14557:28:4;;;;;;;;;;;14518:67;14598:22;736:10:1;-1:-1:-1;;;;;14624:20:4;;;;:73;;-1:-1:-1;14661:36:4;14678:4;736:10:1;9879:164:4;:::i;14661:36::-;14624:126;;;-1:-1:-1;736:10:1;14714:20:4;14726:7;14714:11;:20::i;:::-;-1:-1:-1;;;;;14714:36:4;;14624:126;14598:153;;14769:17;14764:66;;14795:35;;-1:-1:-1;;;14795:35:4;;;;;;;;;;;14764:66;-1:-1:-1;;;;;14845:16:4;;14841:52;;14870:23;;-1:-1:-1;;;14870:23:4;;;;;;;;;;;14841:52;14906:43;14928:4;14934:2;14938:7;14947:1;14906:21;:43::i;:::-;15014:35;15031:1;15035:7;15044:4;15014:8;:35::i;:::-;-1:-1:-1;;;;;15345:18:4;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;15345:31:4;;;-1:-1:-1;;;;;15345:31:4;;;-1:-1:-1;;15345:31:4;;;;;;;15391:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;15391:29:4;;;;;;;;;;;15471:20;;;:11;:20;;;;;;15506:18;;-1:-1:-1;;;;;;15539:49:4;;;;-1:-1:-1;;;15572:15:4;15539:49;;;;;;;;;;15862:11;;15922:24;;;;;15965:13;;15471:20;;15922:24;;15965:13;15961:384;;16175:13;;16160:11;:28;16156:174;;16213:20;;16282:28;;;;-1:-1:-1;;;;;16256:54:4;-1:-1:-1;;;16256:54:4;-1:-1:-1;;;;;;16256:54:4;;;-1:-1:-1;;;;;16213:20:4;;16256:54;;;;16156:174;15320:1036;;;16392:7;16388:2;-1:-1:-1;;;;;16373:27:4;16382:4;-1:-1:-1;;;;;16373:27:4;;;;;;;;;;;16411:42;14435:2026;;14331:2130;;;:::o;2119:317:0:-;2234:6;2209:21;:31;;2201:73;;;;-1:-1:-1;;;2201:73:0;;22582:2:17;2201:73:0;;;22564:21:17;22621:2;22601:18;;;22594:30;22660:31;22640:18;;;22633:59;22709:18;;2201:73:0;22380:353:17;2201:73:0;2288:12;2306:9;-1:-1:-1;;;;;2306:14:0;2328:6;2306:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2287:52;;;2358:7;2350:78;;;;-1:-1:-1;;;2350:78:0;;23150:2:17;2350:78:0;;;23132:21:17;23189:2;23169:18;;;23162:30;23228:34;23208:18;;;23201:62;23299:28;23279:18;;;23272:56;23345:19;;2350:78:0;22948:422:17;6371:1109:4;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;6482:7:4;;3727:1;6531:23;;:47;;;;;6565:13;;6558:4;:20;6531:47;6527:886;;;6599:31;6633:17;;;:11;:17;;;;;;;;;6599:51;;;;;;;;;-1:-1:-1;;;;;6599:51:4;;;;-1:-1:-1;;;6599:51:4;;-1:-1:-1;;;;;6599:51:4;;;;;;;;-1:-1:-1;;;6599:51:4;;;;;;;;;;;;;;6669:729;;6719:14;;-1:-1:-1;;;;;6719:28:4;;6715:101;;6783:9;6371:1109;-1:-1:-1;;;6371:1109:4:o;6715:101::-;-1:-1:-1;;;7158:6:4;7203:17;;;;:11;:17;;;;;;;;;7191:29;;;;;;;;;-1:-1:-1;;;;;7191:29:4;;;;;-1:-1:-1;;;7191:29:4;;-1:-1:-1;;;;;7191:29:4;;;;;;;;-1:-1:-1;;;7191:29:4;;;;;;;;;;;;;7251:28;7247:109;;7319:9;6371:1109;-1:-1:-1;;;6371:1109:4:o;7247:109::-;7118:261;;;6580:833;6527:886;7441:31;;-1:-1:-1;;;7441:31:4;;;;;;;;;;;2333:191:12;2426:6;;;-1:-1:-1;;;;;2443:17:12;;;-1:-1:-1;;;;;;2443:17:12;;;;;;;2476:40;;2426:6;;;2443:17;2426:6;;2476:40;;2407:16;;2476:40;2396:128;2333:191;:::o;11413:104:4:-;11482:27;11492:2;11496:8;11482:27;;;;;;;;;;;;:9;:27::i;20076:667::-;20260:72;;-1:-1:-1;;;20260:72:4;;20239:4;;-1:-1:-1;;;;;20260:36:4;;;;;:72;;736:10:1;;20311:4:4;;20317:7;;20326:5;;20260:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20260:72:4;;;;;;;;-1:-1:-1;;20260:72:4;;;;;;;;;;;;:::i;:::-;;;20256:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20494:6;:13;20511:1;20494:18;20490:235;;20540:40;;-1:-1:-1;;;20540:40:4;;;;;;;;;;;20490:235;20683:6;20677:13;20668:6;20664:2;20660:15;20653:38;20256:480;-1:-1:-1;;;;;;20379:55:4;-1:-1:-1;;;20379:55:4;;-1:-1:-1;20076:667:4;;;;;;:::o;5881:108:13:-;5941:13;5974:7;5967:14;;;;;:::i;342:723:16:-;398:13;619:5;628:1;619:10;615:53;;-1:-1:-1;;646:10:16;;;;;;;;;;;;-1:-1:-1;;;646:10:16;;;;;342:723::o;615:53::-;693:5;678:12;734:78;741:9;;734:78;;767:8;;;;:::i;:::-;;-1:-1:-1;790:10:16;;-1:-1:-1;798:2:16;790:10;;:::i;:::-;;;734:78;;;822:19;854:6;-1:-1:-1;;;;;844:17:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;844:17:16;;822:39;;872:154;879:10;;872:154;;906:11;916:1;906:11;;:::i;:::-;;-1:-1:-1;975:10:16;983:2;975:5;:10;:::i;:::-;962:24;;:2;:24;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;932:56:16;;;;;;;;-1:-1:-1;1003:11:16;1012:2;1003:11;;:::i;:::-;;;872:154;;1180:190:11;1305:4;1358;1329:25;1342:5;1349:4;1329:12;:25::i;:::-;:33;;1180:190;-1:-1:-1;;;;1180:190:11:o;4621:305:4:-;4723:4;-1:-1:-1;;;;;;4760:40:4;;-1:-1:-1;;;4760:40:4;;:105;;-1:-1:-1;;;;;;;4817:48:4;;-1:-1:-1;;;4817:48:4;4760:105;:158;;;-1:-1:-1;;;;;;;;;;963:40:2;;;4882:36:4;854:157:2;3983:250:13;4137:29;;;;:15;:29;;;;;;;;:38;4129:96;;;;-1:-1:-1;;;4129:96:13;;24712:2:17;4129:96:13;;;24694:21:17;24751:2;24731:18;;;24724:30;24790:34;24770:18;;;24763:62;-1:-1:-1;;;24841:18:17;;;24834:43;24894:19;;4129:96:13;24510:409:17;11880:163:4;12003:32;12009:2;12013:8;12023:5;12030:4;12003:5;:32::i;1731:675:11:-;1814:7;1857:4;1814:7;1872:497;1896:5;:12;1892:1;:16;1872:497;;;1930:20;1953:5;1959:1;1953:8;;;;;;;;:::i;:::-;;;;;;;1930:31;;1996:12;1980;:28;1976:382;;2482:13;2532:15;;;2568:4;2561:15;;;2615:4;2599:21;;2108:57;;1976:382;;;2482:13;2532:15;;;2568:4;2561:15;;;2615:4;2599:21;;2285:57;;1976:382;-1:-1:-1;1910:3:11;;;;:::i;:::-;;;;1872:497;;;-1:-1:-1;2386:12:11;1731:675;-1:-1:-1;;;1731:675:11:o;12302:1775:4:-;12441:20;12464:13;-1:-1:-1;;;;;12492:16:4;;12488:48;;12517:19;;-1:-1:-1;;;12517:19:4;;;;;;;;;;;12488:48;12551:8;12563:1;12551:13;12547:44;;12573:18;;-1:-1:-1;;;12573:18:4;;;;;;;;;;;12547:44;12604:61;12634:1;12638:2;12642:12;12656:8;12604:21;:61::i;:::-;-1:-1:-1;;;;;12942:16:4;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;13001:49:4;;-1:-1:-1;;;;;12942:44:4;;;;;;;13001:49;;;;-1:-1:-1;;12942:44:4;;;;;;13001:49;;;;;;;;;;;;;;;;13067:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;13117:66:4;;;;-1:-1:-1;;;13167:15:4;13117:66;;;;;;;;;;13067:25;13264:23;;;13308:4;:23;;;;-1:-1:-1;;;;;;13316:13:4;;1120:20:0;1168:8;;13316:15:4;13304:641;;;13352:314;13383:38;;13408:12;;-1:-1:-1;;;;;13383:38:4;;;13400:1;;13383:38;;13400:1;;13383:38;13449:69;13488:1;13492:2;13496:14;;;;;;13512:5;13449:30;:69::i;:::-;13444:174;;13554:40;;-1:-1:-1;;;13554:40:4;;;;;;;;;;;13444:174;13661:3;13645:12;:19;13352:314;;13747:12;13730:13;;:29;13726:43;;13761:8;;;13726:43;13304:641;;;13810:120;13841:40;;13866:14;;;;;-1:-1:-1;;;;;13841:40:4;;;13858:1;;13841:40;;13858:1;;13841:40;13925:3;13909:12;:19;13810:120;;13304:641;-1:-1:-1;13959:13:4;:28;14009:60;10607:369;293:131:17;-1:-1:-1;;;;;;367:32:17;;357:43;;347:71;;414:1;411;404:12;429:245;487:6;540:2;528:9;519:7;515:23;511:32;508:52;;;556:1;553;546:12;508:52;595:9;582:23;614:30;638:5;614:30;:::i;871:131::-;-1:-1:-1;;;;;946:31:17;;936:42;;926:70;;992:1;989;982:12;1007:435;1074:6;1082;1135:2;1123:9;1114:7;1110:23;1106:32;1103:52;;;1151:1;1148;1141:12;1103:52;1190:9;1177:23;1209:31;1234:5;1209:31;:::i;:::-;1259:5;-1:-1:-1;1316:2:17;1301:18;;1288:32;-1:-1:-1;;;;;1351:40:17;;1339:53;;1329:81;;1406:1;1403;1396:12;1329:81;1429:7;1419:17;;;1007:435;;;;;:::o;1447:258::-;1519:1;1529:113;1543:6;1540:1;1537:13;1529:113;;;1619:11;;;1613:18;1600:11;;;1593:39;1565:2;1558:10;1529:113;;;1660:6;1657:1;1654:13;1651:48;;;-1:-1:-1;;1695:1:17;1677:16;;1670:27;1447:258::o;1710:::-;1752:3;1790:5;1784:12;1817:6;1812:3;1805:19;1833:63;1889:6;1882:4;1877:3;1873:14;1866:4;1859:5;1855:16;1833:63;:::i;:::-;1950:2;1929:15;-1:-1:-1;;1925:29:17;1916:39;;;;1957:4;1912:50;;1710:258;-1:-1:-1;;1710:258:17:o;1973:220::-;2122:2;2111:9;2104:21;2085:4;2142:45;2183:2;2172:9;2168:18;2160:6;2142:45;:::i;2198:180::-;2257:6;2310:2;2298:9;2289:7;2285:23;2281:32;2278:52;;;2326:1;2323;2316:12;2278:52;-1:-1:-1;2349:23:17;;2198:180;-1:-1:-1;2198:180:17:o;2591:315::-;2659:6;2667;2720:2;2708:9;2699:7;2695:23;2691:32;2688:52;;;2736:1;2733;2726:12;2688:52;2775:9;2762:23;2794:31;2819:5;2794:31;:::i;:::-;2844:5;2896:2;2881:18;;;;2868:32;;-1:-1:-1;;;2591:315:17:o;3093:118::-;3179:5;3172:13;3165:21;3158:5;3155:32;3145:60;;3201:1;3198;3191:12;3216:241;3272:6;3325:2;3313:9;3304:7;3300:23;3296:32;3293:52;;;3341:1;3338;3331:12;3293:52;3380:9;3367:23;3399:28;3421:5;3399:28;:::i;3462:456::-;3539:6;3547;3555;3608:2;3596:9;3587:7;3583:23;3579:32;3576:52;;;3624:1;3621;3614:12;3576:52;3663:9;3650:23;3682:31;3707:5;3682:31;:::i;:::-;3732:5;-1:-1:-1;3789:2:17;3774:18;;3761:32;3802:33;3761:32;3802:33;:::i;:::-;3462:456;;3854:7;;-1:-1:-1;;;3908:2:17;3893:18;;;;3880:32;;3462:456::o;3923:248::-;3991:6;3999;4052:2;4040:9;4031:7;4027:23;4023:32;4020:52;;;4068:1;4065;4058:12;4020:52;-1:-1:-1;;4091:23:17;;;4161:2;4146:18;;;4133:32;;-1:-1:-1;3923:248:17:o;4176:255::-;4243:6;4296:2;4284:9;4275:7;4271:23;4267:32;4264:52;;;4312:1;4309;4302:12;4264:52;4351:9;4338:23;4370:31;4395:5;4370:31;:::i;4436:127::-;4497:10;4492:3;4488:20;4485:1;4478:31;4528:4;4525:1;4518:15;4552:4;4549:1;4542:15;4568:632;4633:5;-1:-1:-1;;;;;4704:2:17;4696:6;4693:14;4690:40;;;4710:18;;:::i;:::-;4785:2;4779:9;4753:2;4839:15;;-1:-1:-1;;4835:24:17;;;4861:2;4831:33;4827:42;4815:55;;;4885:18;;;4905:22;;;4882:46;4879:72;;;4931:18;;:::i;:::-;4971:10;4967:2;4960:22;5000:6;4991:15;;5030:6;5022;5015:22;5070:3;5061:6;5056:3;5052:16;5049:25;5046:45;;;5087:1;5084;5077:12;5046:45;5137:6;5132:3;5125:4;5117:6;5113:17;5100:44;5192:1;5185:4;5176:6;5168;5164:19;5160:30;5153:41;;;;4568:632;;;;;:::o;5205:451::-;5274:6;5327:2;5315:9;5306:7;5302:23;5298:32;5295:52;;;5343:1;5340;5333:12;5295:52;5383:9;5370:23;-1:-1:-1;;;;;5408:6:17;5405:30;5402:50;;;5448:1;5445;5438:12;5402:50;5471:22;;5524:4;5516:13;;5512:27;-1:-1:-1;5502:55:17;;5553:1;5550;5543:12;5502:55;5576:74;5642:7;5637:2;5624:16;5619:2;5615;5611:11;5576:74;:::i;5913:367::-;5976:8;5986:6;6040:3;6033:4;6025:6;6021:17;6017:27;6007:55;;6058:1;6055;6048:12;6007:55;-1:-1:-1;6081:20:17;;-1:-1:-1;;;;;6113:30:17;;6110:50;;;6156:1;6153;6146:12;6110:50;6193:4;6185:6;6181:17;6169:29;;6253:3;6246:4;6236:6;6233:1;6229:14;6221:6;6217:27;6213:38;6210:47;6207:67;;;6270:1;6267;6260:12;6285:773;6407:6;6415;6423;6431;6484:2;6472:9;6463:7;6459:23;6455:32;6452:52;;;6500:1;6497;6490:12;6452:52;6540:9;6527:23;-1:-1:-1;;;;;6610:2:17;6602:6;6599:14;6596:34;;;6626:1;6623;6616:12;6596:34;6665:70;6727:7;6718:6;6707:9;6703:22;6665:70;:::i;:::-;6754:8;;-1:-1:-1;6639:96:17;-1:-1:-1;6842:2:17;6827:18;;6814:32;;-1:-1:-1;6858:16:17;;;6855:36;;;6887:1;6884;6877:12;6855:36;;6926:72;6990:7;6979:8;6968:9;6964:24;6926:72;:::i;:::-;6285:773;;;;-1:-1:-1;7017:8:17;-1:-1:-1;;;;6285:773:17:o;7063:403::-;7146:6;7154;7207:2;7195:9;7186:7;7182:23;7178:32;7175:52;;;7223:1;7220;7213:12;7175:52;7262:9;7249:23;7281:31;7306:5;7281:31;:::i;:::-;7331:5;-1:-1:-1;7388:2:17;7373:18;;7360:32;7401:33;7360:32;7401:33;:::i;7471:272::-;7529:6;7582:2;7570:9;7561:7;7557:23;7553:32;7550:52;;;7598:1;7595;7588:12;7550:52;7637:9;7624:23;7687:6;7680:5;7676:18;7669:5;7666:29;7656:57;;7709:1;7706;7699:12;7748:382;7813:6;7821;7874:2;7862:9;7853:7;7849:23;7845:32;7842:52;;;7890:1;7887;7880:12;7842:52;7929:9;7916:23;7948:31;7973:5;7948:31;:::i;:::-;7998:5;-1:-1:-1;8055:2:17;8040:18;;8027:32;8068:30;8027:32;8068:30;:::i;8135:437::-;8221:6;8229;8282:2;8270:9;8261:7;8257:23;8253:32;8250:52;;;8298:1;8295;8288:12;8250:52;8338:9;8325:23;-1:-1:-1;;;;;8363:6:17;8360:30;8357:50;;;8403:1;8400;8393:12;8357:50;8442:70;8504:7;8495:6;8484:9;8480:22;8442:70;:::i;:::-;8531:8;;8416:96;;-1:-1:-1;8135:437:17;-1:-1:-1;;;;8135:437:17:o;8577:795::-;8672:6;8680;8688;8696;8749:3;8737:9;8728:7;8724:23;8720:33;8717:53;;;8766:1;8763;8756:12;8717:53;8805:9;8792:23;8824:31;8849:5;8824:31;:::i;:::-;8874:5;-1:-1:-1;8931:2:17;8916:18;;8903:32;8944:33;8903:32;8944:33;:::i;:::-;8996:7;-1:-1:-1;9050:2:17;9035:18;;9022:32;;-1:-1:-1;9105:2:17;9090:18;;9077:32;-1:-1:-1;;;;;9121:30:17;;9118:50;;;9164:1;9161;9154:12;9118:50;9187:22;;9240:4;9232:13;;9228:27;-1:-1:-1;9218:55:17;;9269:1;9266;9259:12;9218:55;9292:74;9358:7;9353:2;9340:16;9335:2;9331;9327:11;9292:74;:::i;:::-;9282:84;;;8577:795;;;;;;;:::o;9562:572::-;9657:6;9665;9673;9726:2;9714:9;9705:7;9701:23;9697:32;9694:52;;;9742:1;9739;9732:12;9694:52;9781:9;9768:23;9800:31;9825:5;9800:31;:::i;:::-;9850:5;-1:-1:-1;9906:2:17;9891:18;;9878:32;-1:-1:-1;;;;;9922:30:17;;9919:50;;;9965:1;9962;9955:12;9919:50;10004:70;10066:7;10057:6;10046:9;10042:22;10004:70;:::i;:::-;9562:572;;10093:8;;-1:-1:-1;9978:96:17;;-1:-1:-1;;;;9562:572:17:o;10532:356::-;10734:2;10716:21;;;10753:18;;;10746:30;10812:34;10807:2;10792:18;;10785:62;10879:2;10864:18;;10532:356::o;10893:380::-;10972:1;10968:12;;;;11015;;;11036:61;;11090:4;11082:6;11078:17;11068:27;;11036:61;11143:2;11135:6;11132:14;11112:18;11109:38;11106:161;;11189:10;11184:3;11180:20;11177:1;11170:31;11224:4;11221:1;11214:15;11252:4;11249:1;11242:15;11106:161;;10893:380;;;:::o;11278:127::-;11339:10;11334:3;11330:20;11327:1;11320:31;11370:4;11367:1;11360:15;11394:4;11391:1;11384:15;11410:168;11450:7;11516:1;11512;11508:6;11504:14;11501:1;11498:21;11493:1;11486:9;11479:17;11475:45;11472:71;;;11523:18;;:::i;:::-;-1:-1:-1;11563:9:17;;11410:168::o;11583:127::-;11644:10;11639:3;11635:20;11632:1;11625:31;11675:4;11672:1;11665:15;11699:4;11696:1;11689:15;11715:120;11755:1;11781;11771:35;;11786:18;;:::i;:::-;-1:-1:-1;11820:9:17;;11715:120::o;11840:355::-;12042:2;12024:21;;;12081:2;12061:18;;;12054:30;12120:33;12115:2;12100:18;;12093:61;12186:2;12171:18;;11840:355::o;13038:545::-;13140:2;13135:3;13132:11;13129:448;;;13176:1;13201:5;13197:2;13190:17;13246:4;13242:2;13232:19;13316:2;13304:10;13300:19;13297:1;13293:27;13287:4;13283:38;13352:4;13340:10;13337:20;13334:47;;;-1:-1:-1;13375:4:17;13334:47;13430:2;13425:3;13421:12;13418:1;13414:20;13408:4;13404:31;13394:41;;13485:82;13503:2;13496:5;13493:13;13485:82;;;13548:17;;;13529:1;13518:13;13485:82;;13759:1352;13885:3;13879:10;-1:-1:-1;;;;;13904:6:17;13901:30;13898:56;;;13934:18;;:::i;:::-;13963:97;14053:6;14013:38;14045:4;14039:11;14013:38;:::i;:::-;14007:4;13963:97;:::i;:::-;14115:4;;14179:2;14168:14;;14196:1;14191:663;;;;14898:1;14915:6;14912:89;;;-1:-1:-1;14967:19:17;;;14961:26;14912:89;-1:-1:-1;;13716:1:17;13712:11;;;13708:24;13704:29;13694:40;13740:1;13736:11;;;13691:57;15014:81;;14161:944;;14191:663;12985:1;12978:14;;;13022:4;13009:18;;-1:-1:-1;;14227:20:17;;;14345:236;14359:7;14356:1;14353:14;14345:236;;;14448:19;;;14442:26;14427:42;;14540:27;;;;14508:1;14496:14;;;;14375:19;;14345:236;;;14349:3;14609:6;14600:7;14597:19;14594:201;;;14670:19;;;14664:26;-1:-1:-1;;14753:1:17;14749:14;;;14765:3;14745:24;14741:37;14737:42;14722:58;14707:74;;14594:201;-1:-1:-1;;;;;14841:1:17;14825:14;;;14821:22;14808:36;;-1:-1:-1;13759:1352:17:o;15597:127::-;15658:10;15653:3;15649:20;15646:1;15639:31;15689:4;15686:1;15679:15;15713:4;15710:1;15703:15;16496:184;16566:6;16619:2;16607:9;16598:7;16594:23;16590:32;16587:52;;;16635:1;16632;16625:12;16587:52;-1:-1:-1;16658:16:17;;16496:184;-1:-1:-1;16496:184:17:o;16685:245::-;16752:6;16805:2;16793:9;16784:7;16780:23;16776:32;16773:52;;;16821:1;16818;16811:12;16773:52;16853:9;16847:16;16872:28;16894:5;16872:28;:::i;18957:128::-;18997:3;19028:1;19024:6;19021:1;19018:13;19015:39;;;19034:18;;:::i;:::-;-1:-1:-1;19070:9:17;;18957:128::o;20332:637::-;20612:3;20650:6;20644:13;20666:53;20712:6;20707:3;20700:4;20692:6;20688:17;20666:53;:::i;:::-;20782:13;;20741:16;;;;20804:57;20782:13;20741:16;20838:4;20826:17;;20804:57;:::i;:::-;-1:-1:-1;;;20883:20:17;;20912:22;;;20961:1;20950:13;;20332:637;-1:-1:-1;;;;20332:637:17:o;23375:489::-;-1:-1:-1;;;;;23644:15:17;;;23626:34;;23696:15;;23691:2;23676:18;;23669:43;23743:2;23728:18;;23721:34;;;23791:3;23786:2;23771:18;;23764:31;;;23569:4;;23812:46;;23838:19;;23830:6;23812:46;:::i;:::-;23804:54;23375:489;-1:-1:-1;;;;;;23375:489:17:o;23869:249::-;23938:6;23991:2;23979:9;23970:7;23966:23;23962:32;23959:52;;;24007:1;24004;23997:12;23959:52;24039:9;24033:16;24058:30;24082:5;24058:30;:::i;24123:135::-;24162:3;24183:17;;;24180:43;;24203:18;;:::i;:::-;-1:-1:-1;24250:1:17;24239:13;;24123:135::o;24263:125::-;24303:4;24331:1;24328;24325:8;24322:34;;;24336:18;;:::i;:::-;-1:-1:-1;24373:9:17;;24263:125::o;24393:112::-;24425:1;24451;24441:35;;24456:18;;:::i;:::-;-1:-1:-1;24490:9:17;;24393:112::o
Swarm Source
ipfs://c93e2697f63731cc5c21b5bfd85288f73f98d573fc3f4b963a392454bdbe17cf
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
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.