ERC-721
NFT
Overview
Max Total Supply
555 JCCGENESIS
Holders
187
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 JCCGENESISLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
JCCGenesis
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-29 */ // SPDX-License-Identifier: UNLICENSED pragma solidity >=0.8.10 <0.9.0; // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @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); } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @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); } } // File: contracts/MerkleProof.sol pragma solidity ^0.8.9; /** * @dev These functions deal with verification of Merkle trees (hash trees), */ 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. */ using Strings for uint256; function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { 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 = keccak256(abi.encodePacked(i.toString(), computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(i.toString(), proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) /** * @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); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @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); } // File: contracts/PublicPrivateVoucherMinter.sol abstract contract PublicPrivateVoucherMinter is Ownable { // event to log mint detail event MinterCreated(address _address); event PublicMint (address _address, uint256 _amount, uint256 _value); event PrivateMint(address _address, uint256 id, uint256 _amount, uint256 _value); event VoucherMint(address _address, uint256 id, uint256 _amount, uint256 _value); event ProjectMint(address _address, uint256 _amount, string _reason); struct MinterConfig { bool isPublicMintActive; // can call publicMint only when isPublicMintActive is true bool isPrivateMintActive; // can call privateMint only when isPrivateMintActive is true bool isVoucherMintActive; // can call voucherMint only when isVoucherMintActive is true uint256 publicMintPrice; // price for publicMint uint256 privateMintPrice; // price for privateMint uint256 maxPublicMintAmount; // maximum amount per publicMint transaction uint256 maxPrivateMintAmount; // maximum amount per privateMint transaction uint256 maxTotalSupply; // maximum supply uint256 maxPrivateMintSupply; // maximum supply for private round } // Sale counter uint256 public totalPublicSold; uint256 public totalPrivateSold; uint256 public totalVoucherClaimed; uint256 public totalVoucherIssued; uint256 public totalProjectMint; address public beneficiary; bytes32 private _merkleRoot; uint256 private _proofLength; // a mapping from voucher/whitelised Id to the amount used mapping(uint256 => uint256) private _amountUsed; // Operator address private _operator; // address of operator who can set parameter of this contract MinterConfig public minterConfig; constructor (MinterConfig memory config, address payable _beneficiary) { setMinterConfig(config); setBeneficiary(_beneficiary); setOperator(_msgSender()); } function setMinterConfig(MinterConfig memory config) public onlyOwner { minterConfig = config; } /// @notice Recipient of revenues function setBeneficiary(address payable _beneficiary) public onlyOwner { require(_beneficiary != address(0), "Not the zero address"); beneficiary = _beneficiary; } /** @dev Called by after all limited have been put in place; must perform all contract-specific sale logic, e.g. ERC721 minting. @param to The recipient of the item(s). @param amount The number of items allowed to be purchased **/ function _mintTo(address to, uint256 amount) internal virtual; function togglePublicMintActive() external onlyOwnerAndOperator { require (minterConfig.publicMintPrice > 0, "Public Mint Price is zero"); minterConfig.isPublicMintActive = !minterConfig.isPublicMintActive; } function togglePrivateMintActive() external onlyOwnerAndOperator { require (minterConfig.privateMintPrice > 0, "Private Mint Price is zero"); minterConfig.isPrivateMintActive = !minterConfig.isPrivateMintActive; } function toggleVoucherMintActive() external onlyOwnerAndOperator { minterConfig.isVoucherMintActive = !minterConfig.isVoucherMintActive; } function totalSold() external view returns (uint256) { return totalPublicSold + totalPrivateSold + totalVoucherClaimed; } // set maxTotalSupply function setMaxTotalSupply(uint256 supply) external onlyOwnerAndOperator { minterConfig.maxTotalSupply = supply; } // set parameter for public mint function setPublicMintDetail(uint256 price, uint256 amount) external onlyOwnerAndOperator { require(!minterConfig.isPublicMintActive, "Public mint is active"); minterConfig.publicMintPrice = price; minterConfig.maxPublicMintAmount = amount; } // set parameter for private mint function setPrivateMintDetail(uint256 price, uint256 amount, uint256 supply) external onlyOwnerAndOperator { require(!minterConfig.isPrivateMintActive, "Private mint is active"); minterConfig.privateMintPrice = price; minterConfig.maxPrivateMintAmount = amount; minterConfig.maxPrivateMintSupply = supply; } // set parameter for voucher/private mint function setVoucherDetail(bytes32 merkleRoot, uint256 proofLength, uint256 voucherAmount) external onlyOwnerAndOperator { _merkleRoot = merkleRoot; _proofLength = proofLength; totalVoucherIssued = voucherAmount; } function publicMint(uint256 amount) public payable { require(minterConfig.isPublicMintActive,"Public mint is closed"); require(amount > 0,"Amount is zero"); require(amount <= minterConfig.maxPublicMintAmount,"Amount is greater than maximum"); require(totalProjectMint + totalPublicSold + totalPrivateSold + totalVoucherIssued + amount <= minterConfig.maxTotalSupply,"Exceed maxTotalSupply"); require(minterConfig.publicMintPrice * amount <= msg.value, "Insufficient fund"); address to = _msgSender(); _mintTo(to, amount); totalPublicSold += amount; emit PublicMint(to, amount, msg.value); } function privateMint( uint256 amount, uint256 whitelistedId, uint256 whitelistedAmount, bytes32[] calldata proof ) public payable { require(minterConfig.isPrivateMintActive,"Private mint is closed"); address to = _msgSender(); bytes32 hash = keccak256(abi.encodePacked(whitelistedId, address(this), 'W', to, whitelistedAmount)); require(proof.length == _proofLength,"Invalid whitelisted detail"); require(MerkleProof.verify(proof, _merkleRoot, hash),"Invalid whitelisted detail"); require(_amountUsed[whitelistedId] == 0, "Whielisted has been used"); if (whitelistedAmount == 0) { require(amount <= minterConfig.maxPrivateMintAmount,"Amount is greater than maximum"); } else { require(amount <= whitelistedAmount,"Amount is greater than maximum"); } require(amount > 0,"Amount is zero"); require(totalPrivateSold + amount <= minterConfig.maxPrivateMintSupply,"Exceed maxPrivateMintSupply"); require(minterConfig.privateMintPrice * amount <= msg.value, "Insufficient fund"); _mintTo(to, amount); _amountUsed[whitelistedId] = amount; totalPrivateSold += amount; emit PrivateMint(to, whitelistedId, amount, msg.value); } function voucherMint( uint256 amount, uint256 voucherId, uint256 voucherAmount, uint256 voucherPrice, bytes32[] calldata proof) public payable { require(minterConfig.isVoucherMintActive,"Voucher mint is closed"); address to = _msgSender(); bytes32 hash = keccak256(abi.encodePacked(voucherId, address(this), 'V', to, voucherAmount, voucherPrice)); require(proof.length == _proofLength,"Invalid whitelisted detail"); require(MerkleProof.verify(proof, _merkleRoot, hash),"Invalid voucher detail"); require(_amountUsed[voucherId] + amount <= voucherAmount,"Ammount is greater than voucher"); require(amount > 0,"Amount is zero"); require(voucherPrice * amount <= msg.value, "Insufficient fund"); _mintTo(to, amount); _amountUsed[voucherId] += amount; totalVoucherClaimed += amount; emit VoucherMint(to, voucherId, amount, msg.value); } function _projectMint(address to, uint256 amount, string memory reason) internal { _mintTo(to, amount); totalProjectMint += amount; emit ProjectMint(to, amount, reason); } function getAmountUsed(uint256 voucherId) external view returns (uint256) { return _amountUsed[voucherId]; } ////////////////////////////////////////////////////////////////////////////////////// // Function to withdraw fund from contract ///// function withdraw() external onlyOwner { uint256 _balance = address(this).balance; Address.sendValue(payable(beneficiary), _balance); } function withdraw(uint256 balance) external onlyOwner { Address.sendValue(payable(beneficiary), balance); } function transferERC20(IERC20 token) external onlyOwner { uint256 balance = token.balanceOf(address(this)); token.transfer(beneficiary, balance); } function transferERC20(IERC20 token, uint256 amount) external onlyOwner { token.transfer(beneficiary, amount); } function donate() external payable { // thank you } // set Operator function setOperator(address operator) public onlyOwner { require(operator != address(0), "Not the zero address"); _operator = operator; } function minterStatus() public view returns ( bool isPublicMintActive_, bool isPrivateMintActive_, bool isVoucherMintActive_, uint256 publicMintPrice_, uint256 privateMintPrice_, uint256 maxPublicMintAmount_, uint256 maxPrivateMintAmount_, uint256 maxTotalSupply_, uint256 maxPrivateMintSupply_, uint256 totalPublicSold_, uint256 totalPrivateSold_, uint256 totalVoucherClaimed_, uint256 totalVoucherIssued_, uint256 totalProjectMint_ ) { isPublicMintActive_ = minterConfig.isPublicMintActive; isPrivateMintActive_ = minterConfig.isPrivateMintActive; isVoucherMintActive_ = minterConfig.isVoucherMintActive; publicMintPrice_ = minterConfig.publicMintPrice; privateMintPrice_ = minterConfig.privateMintPrice; maxPublicMintAmount_ = minterConfig.maxPublicMintAmount; maxPrivateMintAmount_ = minterConfig.maxPrivateMintAmount; maxTotalSupply_ = minterConfig.maxTotalSupply; maxPrivateMintSupply_ = minterConfig.maxPrivateMintSupply; totalPublicSold_ = totalPublicSold; totalPrivateSold_ = totalPrivateSold; totalVoucherClaimed_ = totalVoucherClaimed; totalVoucherIssued_ = totalVoucherIssued; totalProjectMint_ = totalProjectMint; } /** * @dev Throws if called by any account other than the operator. */ modifier onlyOwnerAndOperator() { require( _msgSender() == owner() || _msgSender() == _operator, "Caller is not the operator"); _; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.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; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.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); } // File: @openzeppelin/contracts/interfaces/IERC165.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.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 payed in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.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; } } // File: contracts/ERC721S.sol /** * A modification of openzeppelin ERC721 for a small, sequential mint, non-burnable collection * that implement IERC721, IERC721Metadata, and IERCEnumberable. * The assumption for this contract are: * - Token will be mint in sequential order * - The total number of token can be pack in 2**32-1 */ contract ERC721S is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenDetail { // The address of the owner. address owner; // Mapping from TokenID to index in _allToken list uint32 allTokensIndex; // Mapping from TokenID to index in _ownedTokens list uint32 ownedTokensIndex; // Reserved for other used; uint32 reserved; } // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to token Detail mapping(uint256 => TokenDetail) private _tokenDetail; // 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 from owner to list of owned token IDs mapping(address => uint32[]) private _ownedTokens; // Array with all token ids, used for enumeration uint32[] private _allTokens; // Id of the fist token minted uint32 private _currentIndex; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint32) { return 1; } /** * 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(); } } /** * Returns the total amount of tokens burned in the contract. */ function _totalBurned() internal view returns (uint256) { unchecked { return _totalMinted() - _allTokens.length; } } /** * @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 || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _ownedTokens[owner].length; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _tokenDetail[tokenId].owner; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721S.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _tokenDetail[tokenId].owner != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721S.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints new token and transfers it to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to) internal virtual { _safeMint(to, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, bytes memory _data) internal virtual { uint256 tokenId = uint256(_currentIndex); _mint(to); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); uint32 tokenId = _currentIndex; _beforeTokenTransfer(address(0), to, tokenId); uint32[] storage toTokenList = _ownedTokens[to]; TokenDetail storage tokenDetail = _tokenDetail[tokenId]; tokenDetail.owner = to; tokenDetail.ownedTokensIndex = uint32(toTokenList.length); tokenDetail.allTokensIndex = uint32(_allTokens.length); toTokenList.push(tokenId); _allTokens.push(tokenId); _currentIndex += 1; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721S.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); TokenDetail storage tokenDetail = _tokenDetail[tokenId]; uint32[] storage fromTokenList = _ownedTokens[owner]; // _removeTokenFromOwnerEnumeration(owner, tokenId); uint32 tokenIndex = tokenDetail.ownedTokensIndex; uint32 lastToken = fromTokenList[fromTokenList.length - 1]; if (lastToken != uint32(tokenId)) { fromTokenList[tokenIndex] = lastToken; _tokenDetail[lastToken].ownedTokensIndex = tokenIndex; } fromTokenList.pop(); // _removeTokenFromALLTokensEnumeration uint32 lastAllToken = _allTokens[_allTokens.length - 1]; uint32 allTokenIndex = tokenDetail.allTokensIndex; _allTokens[allTokenIndex] = lastAllToken; tokenDetail.owner = address(0); tokenDetail.allTokensIndex = 0; tokenDetail.ownedTokensIndex = 0; _allTokens.pop(); emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721S.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _tokenDetail[tokenId].owner = to; // _removeTokenFromOwnerEnumeration(from, tokenId); uint32[] storage fromTokenList = _ownedTokens[from]; TokenDetail storage tokenDetail = _tokenDetail[tokenId]; uint32 tokenIndex = tokenDetail.ownedTokensIndex; uint32 lastToken = fromTokenList[fromTokenList.length - 1]; fromTokenList[tokenIndex] = lastToken; _tokenDetail[lastToken].ownedTokensIndex = tokenIndex; fromTokenList.pop(); // _addTokenToOwnerEnumeration(to, tokenId); uint32[] storage toTokenList = _ownedTokens[to]; tokenDetail.ownedTokensIndex = uint32(toTokenList.length); toTokenList.push(uint32(tokenId)); emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721S.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual returns (uint256) { require(index < ERC721S.balanceOf(owner), "Owner index out of bounds"); return uint256(_ownedTokens[owner][index]); } function ownedBy(address owner) external view returns (uint256[] memory) { uint256 balance = balanceOf(owner); uint256[] memory tokens = new uint256[](balance); uint32[] storage ownedTokens = _ownedTokens[owner]; for (uint256 i; i < balance; i++) { tokens[i] = uint256(ownedTokens[i]); } return tokens; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual returns (uint256) { require(index < ERC721S.totalSupply(), "Global index out of bounds"); return uint256(_allTokens[index]); } /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 tokenId) internal virtual {} /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual {} } // File: @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/common/ERC2981.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) external 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: * * - `tokenId` must be already minted. * - `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]; } } // File: contracts/JCCGenesis.sol interface ITokenURI { function tokenURI(uint256 tokenId) external view returns (string memory); } interface IIsTokenLocked { function isTokenLocked(uint256 tokenId) external view returns (bool); } contract JCCGenesis is ERC721S, PublicPrivateVoucherMinter, ERC2981, Pausable { using Strings for uint256; // Constants bytes4 constant tokenURIInterface = bytes4(keccak256("tokenURI(uint256)")); bytes4 constant isTokenLockedInterface = bytes4(keccak256("isTokenLocked(uint256)")); // Variable uint256 public maxSupply = 555; string public baseURI; string public notRevealedURI = "https://assets.jokercharlie.com/jccgenesis/default.json"; string public baseExtension = ".json"; bool public revealed; address public metadataContract; address public lockerContract; constructor (address payable beneficiary, address payable royaltyReceiver) ERC721S("Joker Charlie Club Genesis", "JCCGENESIS") PublicPrivateVoucherMinter( PublicPrivateVoucherMinter.MinterConfig({ isPublicMintActive : false, // can call publicMint only when isPublicMintActive is true isPrivateMintActive: false, // can call privateMint only when isPrivateMintActive is true isVoucherMintActive: false, // can call voucherMint only when isVoucherMintActive is true publicMintPrice: 0.555 ether, // price for publicMint privateMintPrice: 0.555 ether, // price for privateMint maxPublicMintAmount: 2, // maximum amount per publicMint transaction maxPrivateMintAmount: 1, // default maximum amount per privateMint transaction maxTotalSupply: 555, // maximum supply maxPrivateMintSupply: 300 // maximum supply for previate mint }), beneficiary ) { require(beneficiary != address(0), "Not the zero address"); require(royaltyReceiver != address(0), "Not the zero address"); // setting initial royalty fee _setDefaultRoyalty(royaltyReceiver, 1000); } /* This function will be used to mint the NFT to team-member, advisory, treasury and giveaway purpose. These NFTs will be firstly mint to a segregated wallet for each corresponding purpose. After that it will be transfer to the final destination from each segregated wallet. */ function projectMint() external onlyOwner { require(totalProjectMint == 0, "Already mint"); _projectMint(0xeeb50494D097d68D95C333aA1D038189D2BaE6bB, 33, "for team member"); // TokenId 1 to 33 _projectMint(0x19d03a5E56240507934af26b194d38F76144815D, 30, "for advisor"); // TokenId 34 to 63 _projectMint(0x52FF836e109fB4Df3931Ee367a25f04EdDE92A89, 17, "for giveaway"); // TokenId 64 to 80 _projectMint(0x6dd041217aE648AE13b5DF1F60b1DE886FdFBEbf, 100, "for treasury"); // ToeknId 81 to 180 } function setRoyaltyInfo(address receiver, uint96 feeBasisPoints) external onlyOwner { require(receiver != address(0), "Not the zero address"); _setDefaultRoyalty(receiver, feeBasisPoints); } function reveal() external onlyOwner { revealed = true; } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } function _mintTo(address to, uint256 amount) internal override { // require(!paused(), "Mint is paused"); // Already checks in _beforeTokenTransfer require(totalSupply() + amount <= maxSupply, "Max supply limit exceed"); for (uint256 i; i < amount; i++) { _safeMint(to); } } function supportsInterface(bytes4 interfaceId) public view override(ERC721S, ERC2981) returns (bool) { return ERC721S.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId); } // TokenURI related functions function setBaseTokenURI(string calldata uri) external onlyOwner { baseURI = uri; } function setNotRevealedURI(string calldata uri) external onlyOwner { notRevealedURI = uri; } function setMetadataContract(address metadata) external onlyOwner { if (metadata != address(0)) { require(ERC165(metadata).supportsInterface(tokenURIInterface), "tokenURI(uint256) not supported"); } metadataContract = metadata; } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function baseTokenURI(uint256 tokenId) public view returns (string memory) { string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : ""; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token"); if (revealed == false) { return notRevealedURI; } else if (metadataContract != address(0)) { return ITokenURI(metadataContract).tokenURI(tokenId); } else { return baseTokenURI(tokenId); } } // Locker relatd functions function setLockerContract(address locker) external onlyOwner { if (locker != address(0)) { require(ERC165(locker).supportsInterface(isTokenLockedInterface), "isTokenLocked(uint256) not supported"); } lockerContract = locker; } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override { require(!paused(), "Contract is paused"); if (lockerContract != address(0)) { require(!IIsTokenLocked(lockerContract).isTokenLocked(tokenId),"Token is locked"); } super._beforeTokenTransfer(from, to, tokenId); } /// @notice Transfers the ownership of multiple NFTs from one address to another address /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenIds The NFTs to transfer /// @param _data Additional data with no specified format, sent in call to `_to` function safeBatchTransferFrom(address _from, address _to, uint256[] memory _tokenIds, bytes memory _data) external { for (uint i; i < _tokenIds.length; i++) { safeTransferFrom(_from, _to, _tokenIds[i], _data); } } /// @notice Transfers the ownership of multiple NFTs from one address to another address /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenIds The NFTs to transfer function safeBatchTransferFrom(address _from, address _to, uint256[] memory _tokenIds) external { for (uint i; i < _tokenIds.length; i++) { safeTransferFrom(_from, _to, _tokenIds[i]); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address payable","name":"beneficiary","type":"address"},{"internalType":"address payable","name":"royaltyReceiver","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"}],"name":"MinterCreated","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":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"PrivateMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"_reason","type":"string"}],"name":"ProjectMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"PublicMint","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"VoucherMint","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"donate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"voucherId","type":"uint256"}],"name":"getAmountUsed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockerContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minterConfig","outputs":[{"internalType":"bool","name":"isPublicMintActive","type":"bool"},{"internalType":"bool","name":"isPrivateMintActive","type":"bool"},{"internalType":"bool","name":"isVoucherMintActive","type":"bool"},{"internalType":"uint256","name":"publicMintPrice","type":"uint256"},{"internalType":"uint256","name":"privateMintPrice","type":"uint256"},{"internalType":"uint256","name":"maxPublicMintAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrivateMintAmount","type":"uint256"},{"internalType":"uint256","name":"maxTotalSupply","type":"uint256"},{"internalType":"uint256","name":"maxPrivateMintSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minterStatus","outputs":[{"internalType":"bool","name":"isPublicMintActive_","type":"bool"},{"internalType":"bool","name":"isPrivateMintActive_","type":"bool"},{"internalType":"bool","name":"isVoucherMintActive_","type":"bool"},{"internalType":"uint256","name":"publicMintPrice_","type":"uint256"},{"internalType":"uint256","name":"privateMintPrice_","type":"uint256"},{"internalType":"uint256","name":"maxPublicMintAmount_","type":"uint256"},{"internalType":"uint256","name":"maxPrivateMintAmount_","type":"uint256"},{"internalType":"uint256","name":"maxTotalSupply_","type":"uint256"},{"internalType":"uint256","name":"maxPrivateMintSupply_","type":"uint256"},{"internalType":"uint256","name":"totalPublicSold_","type":"uint256"},{"internalType":"uint256","name":"totalPrivateSold_","type":"uint256"},{"internalType":"uint256","name":"totalVoucherClaimed_","type":"uint256"},{"internalType":"uint256","name":"totalVoucherIssued_","type":"uint256"},{"internalType":"uint256","name":"totalProjectMint_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"ownedBy","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"whitelistedId","type":"uint256"},{"internalType":"uint256","name":"whitelistedAmount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"privateMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"projectMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_tokenIds","type":"uint256[]"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_beneficiary","type":"address"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"locker","type":"address"}],"name":"setLockerContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setMaxTotalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"metadata","type":"address"}],"name":"setMetadataContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"isPublicMintActive","type":"bool"},{"internalType":"bool","name":"isPrivateMintActive","type":"bool"},{"internalType":"bool","name":"isVoucherMintActive","type":"bool"},{"internalType":"uint256","name":"publicMintPrice","type":"uint256"},{"internalType":"uint256","name":"privateMintPrice","type":"uint256"},{"internalType":"uint256","name":"maxPublicMintAmount","type":"uint256"},{"internalType":"uint256","name":"maxPrivateMintAmount","type":"uint256"},{"internalType":"uint256","name":"maxTotalSupply","type":"uint256"},{"internalType":"uint256","name":"maxPrivateMintSupply","type":"uint256"}],"internalType":"struct PublicPrivateVoucherMinter.MinterConfig","name":"config","type":"tuple"}],"name":"setMinterConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setPrivateMintDetail","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setPublicMintDetail","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeBasisPoints","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"proofLength","type":"uint256"},{"internalType":"uint256","name":"voucherAmount","type":"uint256"}],"name":"setVoucherDetail","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePrivateMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleVoucherMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"totalPrivateSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalProjectMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPublicSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalVoucherClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalVoucherIssued","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"transferERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"voucherId","type":"uint256"},{"internalType":"uint256","name":"voucherAmount","type":"uint256"},{"internalType":"uint256","name":"voucherPrice","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"voucherMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
61022b601c5560e060405260376080818152906200522660a03980516200002f91601e91602090910190620005ef565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200005e91601f91620005ef565b503480156200006c57600080fd5b506040516200529d3803806200529d8339810160408190526200008f91620006b2565b6040805161012081018252600080825260208083018290528284018290526707b3c18f3a578000606084018190526080840152600260a0840152600160c084015261022b60e084015261012c61010084015283518085018552601a81527f4a6f6b657220436861726c696520436c75622047656e657369730000000000008183019081528551808701909652600a8652694a434347454e4553495360b01b92860192909252805193948794919390926200014992620005ef565b5080516200015f906001906020840190620005ef565b50506007805463ffffffff19166001179055506200017d3362000252565b6200018882620002b1565b620001938162000374565b6200019e3362000431565b5050601b805460ff191690556001600160a01b038216620001f55760405162461bcd60e51b815260206004820152601460248201526000805160206200527d83398151915260448201526064015b60405180910390fd5b6001600160a01b0381166200023c5760405162461bcd60e51b815260206004820152601460248201526000805160206200527d8339815191526044820152606401620001ec565b6200024a816103e8620004ee565b505062000727565b600780546001600160a01b03838116640100000000818102600160201b600160c01b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6007546001600160a01b03640100000000909104163314620003055760405162461bcd60e51b815260206004820181905260248201526000805160206200525d8339815191526044820152606401620001ec565b8051601280546020840151604085015161ffff1990921693151561ff0019169390931761010093151584021762ff0000191662010000911515919091021790556060820151601355608082015160145560a082015160155560c082015160165560e08201516017550151601855565b6007546001600160a01b03640100000000909104163314620003c85760405162461bcd60e51b815260206004820181905260248201526000805160206200525d8339815191526044820152606401620001ec565b6001600160a01b0381166200040f5760405162461bcd60e51b815260206004820152601460248201526000805160206200527d8339815191526044820152606401620001ec565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b03640100000000909104163314620004855760405162461bcd60e51b815260206004820181905260248201526000805160206200525d8339815191526044820152606401620001ec565b6001600160a01b038116620004cc5760405162461bcd60e51b815260206004820152601460248201526000805160206200527d8339815191526044820152606401620001ec565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6127106001600160601b03821611156200055e5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401620001ec565b6001600160a01b038216620005b65760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401620001ec565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217601955565b828054620005fd90620006ea565b90600052602060002090601f0160209004810192826200062157600085556200066c565b82601f106200063c57805160ff19168380011785556200066c565b828001600101855582156200066c579182015b828111156200066c5782518255916020019190600101906200064f565b506200067a9291506200067e565b5090565b5b808211156200067a57600081556001016200067f565b80516001600160a01b0381168114620006ad57600080fd5b919050565b60008060408385031215620006c657600080fd5b620006d18362000695565b9150620006e16020840162000695565b90509250929050565b600181811c90821680620006ff57607f821691505b602082108114156200072157634e487b7160e01b600052602260045260246000fd5b50919050565b614aef80620007376000396000f3fe6080604052600436106103fa5760003560e01c80635c975abb11610213578063b19b6f7911610123578063dd2d5601116100ab578063ed88c68e1161007a578063ed88c68e14610478578063f2c4ce1e14610cac578063f2fde38b14610ccc578063f7448a3114610cec578063fb5e28f314610d0c57600080fd5b8063dd2d560114610c17578063e5187f4314610c2d578063e51b759314610c4d578063e985e9c514610c6357600080fd5b8063b88d4fde116100f2578063b88d4fde14610b8c578063c668286214610bac578063c87b56dd14610bc1578063d1d6b73914610be1578063d5abeb0114610c0157600080fd5b8063b19b6f7914610b0a578063b2ad32e514610b2a578063b3ab15fb14610b3f578063b837764414610b5f57600080fd5b80638456cb59116101a657806395d89b411161017557806395d89b4114610a80578063a22cb46514610a95578063a2a71c3514610ab5578063a475b5dd14610ad5578063a689a91414610aea57600080fd5b80638456cb5914610a145780638da5cb5b14610a295780638e909e0b14610a3e5780639106d7ba14610a6b57600080fd5b806370a08231116101e257806370a08231146109b5578063715018a6146109d557806372250380146109ea57806376527485146109ff57600080fd5b80635c975abb146109535780636352211e1461096b5780636b3fe9e11461098b5780636c0360eb146109a057600080fd5b80632db115441161030e5780633ccfd60b116102a157806342842e0e1161027057806342842e0e146108b95780634319ff2f146108d95780634df30e97146108f95780634f6ccce714610919578063518302271461093957600080fd5b80633ccfd60b1461085c5780633f04fba4146108715780633f3e4c11146108845780633f4ba83a146108a457600080fd5b80632f8dccbc116102dd5780632f8dccbc1461076357806330176e13146107f7578063352098211461081757806338af3eed1461083c57600080fd5b80632db11544146106475780632e1a7d4d1461065a5780632ecd28ab1461067a5780632f745c591461074357600080fd5b806311aa225c116103915780631d891fa9116103605780631d891fa91461059c57806323b826ca146105b257806323b872dd146105c857806328cfbd46146105e85780632a55205a1461060857600080fd5b806311aa225c1461053457806314bb6daf1461055457806318160ddd146105675780631c31f7101461057c57600080fd5b80630475a470116103cd5780630475a4701461049a57806306fdde03146104ba578063081812fc146104dc578063095ea7b31461051457600080fd5b806301ffc9a7146103ff578063028172191461043457806302fa7c4714610458578063034601ec1461047a575b600080fd5b34801561040b57600080fd5b5061041f61041a366004613e0a565b610d21565b60405190151581526020015b60405180910390f35b34801561044057600080fd5b5061044a600a5481565b60405190815260200161042b565b34801561046457600080fd5b50610478610473366004613e3c565b610d41565b005b34801561048657600080fd5b50610478610495366004613f6f565b610dad565b3480156104a657600080fd5b506104786104b5366004613fd0565b610df5565b3480156104c657600080fd5b506104cf610eaa565b60405161042b9190614054565b3480156104e857600080fd5b506104fc6104f7366004614067565b610f3c565b6040516001600160a01b03909116815260200161042b565b34801561052057600080fd5b5061047861052f366004614080565b610fd1565b34801561054057600080fd5b506021546104fc906001600160a01b031681565b6104786105623660046140f0565b6110e7565b34801561057357600080fd5b5060065461044a565b34801561058857600080fd5b50610478610597366004614159565b611394565b3480156105a857600080fd5b5061044a600c5481565b3480156105be57600080fd5b5061044a600b5481565b3480156105d457600080fd5b506104786105e3366004614176565b61140b565b3480156105f457600080fd5b50610478610603366004614234565b61143c565b34801561061457600080fd5b506106286106233660046142bc565b611486565b604080516001600160a01b03909316835260208301919091520161042b565b610478610655366004614067565b611534565b34801561066657600080fd5b50610478610675366004614067565b6116dd565b34801561068657600080fd5b506106d3601254601354601454601554601654601754601854600854600954600a54600b54600c5460ff808d169d6101008e0482169d6201000090049091169b9a99989796959493929190565b604080519e15158f529c151560208f01529a15159b8d019b909b5260608c019890985260808b019690965260a08a019490945260c089019290925260e08801526101008701526101208601526101408501526101608401526101808301919091526101a08201526101c00161042b565b34801561074f57600080fd5b5061044a61075e366004614080565b611725565b34801561076f57600080fd5b506012546013546014546015546016546017546018546107ab9660ff808216976101008304821697620100009093049091169590949193909289565b604080519915158a5297151560208a0152951515968801969096526060870193909352608086019190915260a085015260c084015260e08301919091526101008201526101200161042b565b34801561080357600080fd5b506104786108123660046142de565b6117d3565b34801561082357600080fd5b506020546104fc9061010090046001600160a01b031681565b34801561084857600080fd5b50600d546104fc906001600160a01b031681565b34801561086857600080fd5b5061047861180e565b61047861087f36600461434f565b611855565b34801561089057600080fd5b5061047861089f366004614067565b611b5e565b3480156108b057600080fd5b50610478611bb9565b3480156108c557600080fd5b506104786108d4366004614176565b611bf2565b3480156108e557600080fd5b506104786108f43660046143c8565b611c0d565b34801561090557600080fd5b50610478610914366004613fd0565b611cab565b34801561092557600080fd5b5061044a610934366004614067565b611d0f565b34801561094557600080fd5b5060205461041f9060ff1681565b34801561095f57600080fd5b50601b5460ff1661041f565b34801561097757600080fd5b506104fc610986366004614067565b611da5565b34801561099757600080fd5b50610478611e1c565b3480156109ac57600080fd5b506104cf611f9c565b3480156109c157600080fd5b5061044a6109d0366004614159565b61202a565b3480156109e157600080fd5b506104786120b1565b3480156109f657600080fd5b506104cf6120ea565b348015610a0b57600080fd5b506104786120f7565b348015610a2057600080fd5b506104786121b0565b348015610a3557600080fd5b506104fc6121e7565b348015610a4a57600080fd5b5061044a610a59366004614067565b60009081526010602052604090205490565b348015610a7757600080fd5b5061044a6121fe565b348015610a8c57600080fd5b506104cf612222565b348015610aa157600080fd5b50610478610ab0366004614458565b612231565b348015610ac157600080fd5b50610478610ad03660046142bc565b61223c565b348015610ae157600080fd5b506104786122e8565b348015610af657600080fd5b506104cf610b05366004614067565b612326565b348015610b1657600080fd5b50610478610b25366004614159565b612387565b348015610b3657600080fd5b506104786124ae565b348015610b4b57600080fd5b50610478610b5a366004614159565b612523565b348015610b6b57600080fd5b50610b7f610b7a366004614159565b61259a565b60405161042b9190614486565b348015610b9857600080fd5b50610478610ba73660046144ca565b612688565b348015610bb857600080fd5b506104cf6126ba565b348015610bcd57600080fd5b506104cf610bdc366004614067565b6126c7565b348015610bed57600080fd5b50610478610bfc366004614159565b61287b565b348015610c0d57600080fd5b5061044a601c5481565b348015610c2357600080fd5b5061044a60085481565b348015610c3957600080fd5b50610478610c48366004614159565b61298f565b348015610c5957600080fd5b5061044a60095481565b348015610c6f57600080fd5b5061041f610c7e366004614529565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b348015610cb857600080fd5b50610478610cc73660046142de565b612ab0565b348015610cd857600080fd5b50610478610ce7366004614159565b612aeb565b348015610cf857600080fd5b50610478610d07366004614080565b612b88565b348015610d1857600080fd5b50610478612bf0565b6000610d2c82612cb2565b80610d3b5750610d3b82612d1d565b92915050565b33610d4a6121e7565b6001600160a01b031614610d795760405162461bcd60e51b8152600401610d7090614557565b60405180910390fd5b6001600160a01b038216610d9f5760405162461bcd60e51b8152600401610d709061458c565b610da98282612d42565b5050565b60005b8151811015610def57610ddd8484848481518110610dd057610dd06145ba565b6020026020010151611bf2565b80610de7816145e6565b915050610db0565b50505050565b610dfd6121e7565b6001600160a01b0316336001600160a01b03161480610e2f57506011546001600160a01b0316336001600160a01b0316145b610e4b5760405162461bcd60e51b8152600401610d7090614601565b601254610100900460ff1615610e9c5760405162461bcd60e51b815260206004820152601660248201527550726976617465206d696e742069732061637469766560501b6044820152606401610d70565b601492909255601655601855565b606060008054610eb990614638565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee590614638565b8015610f325780601f10610f0757610100808354040283529160200191610f32565b820191906000526020600020905b815481529060010190602001808311610f1557829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610fb55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610d70565b506000908152600360205260409020546001600160a01b031690565b6000610fdc82611da5565b9050806001600160a01b0316836001600160a01b0316141561104a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610d70565b336001600160a01b038216148061106657506110668133610c7e565b6110d85760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610d70565b6110e28383612e3f565b505050565b60125462010000900460ff166111385760405162461bcd60e51b8152602060048201526016602482015275159bdd58da195c881b5a5b9d081a5cc818db1bdcd95960521b6044820152606401610d70565b60408051602080820188905230606090811b6bffffffffffffffffffffffff1990811684860152602b60f91b6054850152339182901b1660558401526069830188905260898084018890528451808503909101815260a99093019093528151910120600f5483146111bb5760405162461bcd60e51b8152600401610d7090614673565b6111fc84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e549150849050612ead565b6112415760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081d9bdd58da195c8819195d185a5b60521b6044820152606401610d70565b600087815260106020526040902054869061125d908a906146aa565b11156112ab5760405162461bcd60e51b815260206004820152601f60248201527f416d6d6f756e742069732067726561746572207468616e20766f7563686572006044820152606401610d70565b600088116112cb5760405162461bcd60e51b8152600401610d70906146c2565b346112d689876146ea565b11156112f45760405162461bcd60e51b8152600401610d7090614709565b6112fe8289612f6e565b600087815260106020526040812080548a929061131c9084906146aa565b9250508190555087600a600082825461133591906146aa565b9091555050604080516001600160a01b0384168152602081018990529081018990523460608201527f9f62b4b30c37c0fa5a560150558db2f99f732dff3cf5b42687e97b1cae65df199060800160405180910390a15050505050505050565b3361139d6121e7565b6001600160a01b0316146113c35760405162461bcd60e51b8152600401610d7090614557565b6001600160a01b0381166113e95760405162461bcd60e51b8152600401610d709061458c565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6114153382612ff9565b6114315760405162461bcd60e51b8152600401610d7090614734565b6110e28383836130f0565b60005b825181101561147f5761146d858585848151811061145f5761145f6145ba565b602002602001015185612688565b80611477816145e6565b91505061143f565b5050505050565b6000828152601a602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916114fb5750604080518082019091526019546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101516000906127109061151a906001600160601b0316876146ea565b611524919061479b565b91519350909150505b9250929050565b60125460ff1661157e5760405162461bcd60e51b8152602060048201526015602482015274141d589b1a58c81b5a5b9d081a5cc818db1bdcd959605a1b6044820152606401610d70565b6000811161159e5760405162461bcd60e51b8152600401610d70906146c2565b6015548111156115c05760405162461bcd60e51b8152600401610d70906147af565b60126005015481600b54600954600854600c546115dd91906146aa565b6115e791906146aa565b6115f191906146aa565b6115fb91906146aa565b11156116415760405162461bcd60e51b8152602060048201526015602482015274457863656564206d6178546f74616c537570706c7960581b6044820152606401610d70565b60135434906116519083906146ea565b111561166f5760405162461bcd60e51b8152600401610d7090614709565b3361167a8183612f6e565b816008600082825461168c91906146aa565b9091555050604080516001600160a01b038316815260208101849052348183015290517f819f7e30541f2ed7e36c92ce039f5eb2d66b7dc094b33f416910e8fde56b80dc9181900360600190a15050565b336116e66121e7565b6001600160a01b03161461170c5760405162461bcd60e51b8152600401610d7090614557565b600d54611722906001600160a01b03168261341f565b50565b60006117308361202a565b821061177e5760405162461bcd60e51b815260206004820152601960248201527f4f776e657220696e646578206f7574206f6620626f756e6473000000000000006044820152606401610d70565b6001600160a01b03831660009081526005602052604090208054839081106117a8576117a86145ba565b6000918252602090912060088204015460079091166004026101000a900463ffffffff169392505050565b336117dc6121e7565b6001600160a01b0316146118025760405162461bcd60e51b8152600401610d7090614557565b6110e2601d8383613d5b565b336118176121e7565b6001600160a01b03161461183d5760405162461bcd60e51b8152600401610d7090614557565b600d544790611722906001600160a01b03168261341f565b601254610100900460ff166118a55760405162461bcd60e51b8152602060048201526016602482015275141c9a5d985d19481b5a5b9d081a5cc818db1bdcd95960521b6044820152606401610d70565b60408051602080820187905230606090811b6bffffffffffffffffffffffff1990811684860152605760f81b6054850152339182901b16605584015260698084018890528451808503909101815260899093019093528151910120600f5483146119215760405162461bcd60e51b8152600401610d7090614673565b61196284848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e549150849050612ead565b61197e5760405162461bcd60e51b8152600401610d7090614673565b600086815260106020526040902054156119da5760405162461bcd60e51b815260206004820152601860248201527f576869656c697374656420686173206265656e207573656400000000000000006044820152606401610d70565b84611a0657601654871115611a015760405162461bcd60e51b8152600401610d70906147af565b611a26565b84871115611a265760405162461bcd60e51b8152600401610d70906147af565b60008711611a465760405162461bcd60e51b8152600401610d70906146c2565b601854600954611a579089906146aa565b1115611aa55760405162461bcd60e51b815260206004820152601b60248201527f457863656564206d6178507269766174654d696e74537570706c7900000000006044820152606401610d70565b6014543490611ab59089906146ea565b1115611ad35760405162461bcd60e51b8152600401610d7090614709565b611add8288612f6e565b600086815260106020526040812088905560098054899290611b009084906146aa565b9091555050604080516001600160a01b0384168152602081018890529081018890523460608201527fea42e12d368267aa3744b225140b462e261f7bf081e5d5dbc006a74520064b909060800160405180910390a150505050505050565b611b666121e7565b6001600160a01b0316336001600160a01b03161480611b9857506011546001600160a01b0316336001600160a01b0316145b611bb45760405162461bcd60e51b8152600401610d7090614601565b601755565b33611bc26121e7565b6001600160a01b031614611be85760405162461bcd60e51b8152600401610d7090614557565b611bf0613538565b565b6110e283838360405180602001604052806000815250612688565b33611c166121e7565b6001600160a01b031614611c3c5760405162461bcd60e51b8152600401610d7090614557565b8051601280546020840151604085015161ffff1990921693151561ff0019169390931761010093151584021762ff0000191662010000911515919091021790556060820151601355608082015160145560a082015160155560c082015160165560e08201516017550151601855565b611cb36121e7565b6001600160a01b0316336001600160a01b03161480611ce557506011546001600160a01b0316336001600160a01b0316145b611d015760405162461bcd60e51b8152600401610d7090614601565b600e92909255600f55600b55565b6000611d1a60065490565b8210611d685760405162461bcd60e51b815260206004820152601a60248201527f476c6f62616c20696e646578206f7574206f6620626f756e64730000000000006044820152606401610d70565b60068281548110611d7b57611d7b6145ba565b6000918252602090912060088204015460079091166004026101000a900463ffffffff1692915050565b6000818152600260205260408120546001600160a01b031680610d3b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610d70565b33611e256121e7565b6001600160a01b031614611e4b5760405162461bcd60e51b8152600401610d7090614557565b600c5415611e8a5760405162461bcd60e51b815260206004820152600c60248201526b105b1c9958591e481b5a5b9d60a21b6044820152606401610d70565b611ed173eeb50494d097d68d95c333aa1d038189d2bae6bb60216040518060400160405280600f81526020016e3337b9103a32b0b69036b2b6b132b960891b8152506135cb565b611f147319d03a5e56240507934af26b194d38f76144815d601e6040518060400160405280600b81526020016a3337b91030b23b34b9b7b960a91b8152506135cb565b611f587352ff836e109fb4df3931ee367a25f04edde92a8960116040518060400160405280600c81526020016b666f7220676976656177617960a01b8152506135cb565b611bf0736dd041217ae648ae13b5df1f60b1de886fdfbebf60646040518060400160405280600c81526020016b666f7220747265617375727960a01b8152506135cb565b601d8054611fa990614638565b80601f0160208091040260200160405190810160405280929190818152602001828054611fd590614638565b80156120225780601f10611ff757610100808354040283529160200191612022565b820191906000526020600020905b81548152906001019060200180831161200557829003601f168201915b505050505081565b60006001600160a01b0382166120955760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610d70565b506001600160a01b031660009081526005602052604090205490565b336120ba6121e7565b6001600160a01b0316146120e05760405162461bcd60e51b8152600401610d7090614557565b611bf0600061362d565b601e8054611fa990614638565b6120ff6121e7565b6001600160a01b0316336001600160a01b0316148061213157506011546001600160a01b0316336001600160a01b0316145b61214d5760405162461bcd60e51b8152600401610d7090614601565b60135461219c5760405162461bcd60e51b815260206004820152601960248201527f5075626c6963204d696e74205072696365206973207a65726f000000000000006044820152606401610d70565b6012805460ff19811660ff90911615179055565b336121b96121e7565b6001600160a01b0316146121df5760405162461bcd60e51b8152600401610d7090614557565b611bf061368d565b60075464010000000090046001600160a01b031690565b6000600a5460095460085461221391906146aa565b61221d91906146aa565b905090565b606060018054610eb990614638565b610da9338383613708565b6122446121e7565b6001600160a01b0316336001600160a01b0316148061227657506011546001600160a01b0316336001600160a01b0316145b6122925760405162461bcd60e51b8152600401610d7090614601565b60125460ff16156122dd5760405162461bcd60e51b81526020600482015260156024820152745075626c6963206d696e742069732061637469766560581b6044820152606401610d70565b601391909155601555565b336122f16121e7565b6001600160a01b0316146123175760405162461bcd60e51b8152600401610d7090614557565b6020805460ff19166001179055565b606060006123326137d7565b905060008151116123525760405180602001604052806000815250612380565b8061235c846137e6565b601f604051602001612370939291906147e6565b6040516020818303038152906040525b9392505050565b336123906121e7565b6001600160a01b0316146123b65760405162461bcd60e51b8152600401610d7090614557565b6001600160a01b0381161561248c576040516301ffc9a760e01b815263276a28a360e01b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa158015612410573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243491906148aa565b61248c5760405162461bcd60e51b8152602060048201526024808201527f6973546f6b656e4c6f636b65642875696e7432353629206e6f7420737570706f6044820152631c9d195960e21b6064820152608401610d70565b602180546001600160a01b0319166001600160a01b0392909216919091179055565b6124b66121e7565b6001600160a01b0316336001600160a01b031614806124e857506011546001600160a01b0316336001600160a01b0316145b6125045760405162461bcd60e51b8152600401610d7090614601565b6012805462ff0000198116620100009182900460ff1615909102179055565b3361252c6121e7565b6001600160a01b0316146125525760405162461bcd60e51b8152600401610d7090614557565b6001600160a01b0381166125785760405162461bcd60e51b8152600401610d709061458c565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b606060006125a78361202a565b90506000816001600160401b038111156125c3576125c3613e81565b6040519080825280602002602001820160405280156125ec578160200160208202803683370190505b506001600160a01b03851660009081526005602052604081209192505b8381101561267e57818181548110612623576126236145ba565b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1663ffffffff16838281518110612661576126616145ba565b602090810291909101015280612676816145e6565b915050612609565b5090949350505050565b6126923383612ff9565b6126ae5760405162461bcd60e51b8152600401610d7090614734565b610def848484846138e3565b601f8054611fa990614638565b6000818152600260205260409020546060906001600160a01b03166127465760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610d70565b60205460ff166127e257601e805461275d90614638565b80601f016020809104026020016040519081016040528092919081815260200182805461278990614638565b80156127d65780601f106127ab576101008083540402835291602001916127d6565b820191906000526020600020905b8154815290600101906020018083116127b957829003601f168201915b50505050509050919050565b60205461010090046001600160a01b03161561286d5760205460405163c87b56dd60e01b8152600481018490526101009091046001600160a01b03169063c87b56dd90602401600060405180830381865afa158015612845573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d3b91908101906148c7565b610d3b82612326565b919050565b336128846121e7565b6001600160a01b0316146128aa5760405162461bcd60e51b8152600401610d7090614557565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156128f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612915919061493d565b600d5460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044015b6020604051808303816000875af115801561296b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e291906148aa565b336129986121e7565b6001600160a01b0316146129be5760405162461bcd60e51b8152600401610d7090614557565b6001600160a01b03811615612a88576040516301ffc9a760e01b815263c87b56dd60e01b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa158015612a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3c91906148aa565b612a885760405162461bcd60e51b815260206004820152601f60248201527f746f6b656e5552492875696e7432353629206e6f7420737570706f72746564006044820152606401610d70565b602080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b33612ab96121e7565b6001600160a01b031614612adf5760405162461bcd60e51b8152600401610d7090614557565b6110e2601e8383613d5b565b33612af46121e7565b6001600160a01b031614612b1a5760405162461bcd60e51b8152600401610d7090614557565b6001600160a01b038116612b7f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d70565b6117228161362d565b33612b916121e7565b6001600160a01b031614612bb75760405162461bcd60e51b8152600401610d7090614557565b600d5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb9060440161294c565b612bf86121e7565b6001600160a01b0316336001600160a01b03161480612c2a57506011546001600160a01b0316336001600160a01b0316145b612c465760405162461bcd60e51b8152600401610d7090614601565b601454612c955760405162461bcd60e51b815260206004820152601a60248201527f50726976617465204d696e74205072696365206973207a65726f0000000000006044820152606401610d70565b6012805461ff001981166101009182900460ff1615909102179055565b60006001600160e01b031982166380ac58cd60e01b1480612ce357506001600160e01b03198216635b5e139f60e01b145b80612cfe57506001600160e01b0319821663780e9d6360e01b145b80610d3b57506301ffc9a760e01b6001600160e01b0319831614610d3b565b60006001600160e01b0319821663152a902d60e11b1480610d3b5750610d3b82612cb2565b6127106001600160601b0382161115612db05760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610d70565b6001600160a01b038216612e065760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610d70565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217601955565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612e7482611da5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081815b8551811015612f63576000868281518110612ecf57612ecf6145ba565b60200260200101519050808311612f1a57612ee9826137e6565b8382604051602001612efd93929190614956565b604051602081830303815290604052805190602001209250612f50565b612f23826137e6565b8184604051602001612f3793929190614956565b6040516020818303038152906040528051906020012092505b5080612f5b816145e6565b915050612eb2565b509092149392505050565b601c5481612f7b60065490565b612f8591906146aa565b1115612fd35760405162461bcd60e51b815260206004820152601760248201527f4d617820737570706c79206c696d6974206578636565640000000000000000006044820152606401610d70565b60005b818110156110e257612fe783613916565b80612ff1816145e6565b915050612fd6565b6000818152600260205260408120546001600160a01b03166130725760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610d70565b600061307d83611da5565b9050806001600160a01b0316846001600160a01b031614806130c457506001600160a01b0380821660009081526004602090815260408083209388168352929052205460ff165b806130e85750836001600160a01b03166130dd84610f3c565b6001600160a01b0316145b949350505050565b826001600160a01b031661310382611da5565b6001600160a01b0316146131675760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610d70565b6001600160a01b0382166131c95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d70565b6131d483838361392f565b6131df600082612e3f565b600081815260026020818152604080842080546001600160a01b0319166001600160a01b038881169190911780835590891686526005845291852086865293909252825492939192600160c01b90910463ffffffff16919084906132459060019061497d565b81548110613255576132556145ba565b90600052602060002090600891828204019190066004029054906101000a900463ffffffff16905080848363ffffffff1681548110613296576132966145ba565b600091825260208083206008830401805460079093166004026101000a63ffffffff8181021990941695841602949094179093558381168252600290925260409020805463ffffffff60c01b1916600160c01b92851692909202919091179055835484908061330757613307614994565b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff02191690559055600060056000886001600160a01b03166001600160a01b03168152602001908152602001600020905080805490508460000160186101000a81548163ffffffff021916908363ffffffff160217905550808690806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908363ffffffff16021790555085876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050505050565b8047101561346f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d70565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146134bc576040519150601f19603f3d011682016040523d82523d6000602084013e6134c1565b606091505b50509050806110e25760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d70565b601b5460ff166135815760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610d70565b601b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6135d58383612f6e565b81600c60008282546135e791906146aa565b90915550506040517f934a6c92dbeb596dde342e708748236ded185a44968de85358144785b72b318690613620908590859085906149aa565b60405180910390a1505050565b600780546001600160a01b03838116640100000000818102640100000000600160c01b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b601b5460ff16156136d35760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d70565b601b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586135ae3390565b816001600160a01b0316836001600160a01b0316141561376a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d70565b6001600160a01b03838116600081815260046020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6060601d8054610eb990614638565b60608161380a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613834578061381e816145e6565b915061382d9050600a8361479b565b915061380e565b6000816001600160401b0381111561384e5761384e613e81565b6040519080825280601f01601f191660200182016040528015613878576020820181803683370190505b5090505b84156130e85761388d60018361497d565b915061389a600a866149d1565b6138a59060306146aa565b60f81b8183815181106138ba576138ba6145ba565b60200101906001600160f81b031916908160001a9053506138dc600a8661479b565b945061387c565b6138ee8484846130f0565b6138fa84848484613a34565b610def5760405162461bcd60e51b8152600401610d70906149e5565b6117228160405180602001604052806000815250613b32565b601b5460ff16156139775760405162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b6044820152606401610d70565b6021546001600160a01b0316156110e25760215460405163276a28a360e01b8152600481018390526001600160a01b039091169063276a28a390602401602060405180830381865afa1580156139d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139f591906148aa565b156110e25760405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881a5cc81b1bd8dad959608a1b6044820152606401610d70565b60006001600160a01b0384163b15613b2757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613a78903390899088908890600401614a37565b6020604051808303816000875af1925050508015613ab3575060408051601f3d908101601f19168201909252613ab091810190614a74565b60015b613b0d573d808015613ae1576040519150601f19603f3d011682016040523d82523d6000602084013e613ae6565b606091505b508051613b055760405162461bcd60e51b8152600401610d70906149e5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506130e8565b506001949350505050565b60075463ffffffff16613b4483613b6d565b613b516000848385613a34565b6110e25760405162461bcd60e51b8152600401610d70906149e5565b6001600160a01b038116613bc35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d70565b60075463ffffffff16613bd86000838361392f565b6001600160a01b038216600081815260056020908152604080832063ffffffff8087168086526002855292852080546001600160a01b031981168817825583548316600160c01b02600167ffffffff0000000160a01b031990911690971796909617808755600680548316600160a01b0263ffffffff60a01b199092169190911787558254600181810185558488529587206008808304909101805460046007948516810261010090810a808b0290890219909316929092179092558454808a018655948a529184047ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01805494841690910290910a95860295840219909216949094179055825491959491613cf091859116614a91565b92506101000a81548163ffffffff021916908363ffffffff1602179055508263ffffffff16846001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610def565b828054613d6790614638565b90600052602060002090601f016020900481019282613d895760008555613dcf565b82601f10613da25782800160ff19823516178555613dcf565b82800160010185558215613dcf579182015b82811115613dcf578235825591602001919060010190613db4565b50613ddb929150613ddf565b5090565b5b80821115613ddb5760008155600101613de0565b6001600160e01b03198116811461172257600080fd5b600060208284031215613e1c57600080fd5b813561238081613df4565b6001600160a01b038116811461172257600080fd5b60008060408385031215613e4f57600080fd5b8235613e5a81613e27565b915060208301356001600160601b0381168114613e7657600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b0381118282101715613eba57613eba613e81565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613ee857613ee8613e81565b604052919050565b600082601f830112613f0157600080fd5b813560206001600160401b03821115613f1c57613f1c613e81565b8160051b613f2b828201613ec0565b9283528481018201928281019087851115613f4557600080fd5b83870192505b84831015613f6457823582529183019190830190613f4b565b979650505050505050565b600080600060608486031215613f8457600080fd5b8335613f8f81613e27565b92506020840135613f9f81613e27565b915060408401356001600160401b03811115613fba57600080fd5b613fc686828701613ef0565b9150509250925092565b600080600060608486031215613fe557600080fd5b505081359360208301359350604090920135919050565b60005b83811015614017578181015183820152602001613fff565b83811115610def5750506000910152565b60008151808452614040816020860160208601613ffc565b601f01601f19169290920160200192915050565b6020815260006123806020830184614028565b60006020828403121561407957600080fd5b5035919050565b6000806040838503121561409357600080fd5b823561409e81613e27565b946020939093013593505050565b60008083601f8401126140be57600080fd5b5081356001600160401b038111156140d557600080fd5b6020830191508360208260051b850101111561152d57600080fd5b60008060008060008060a0878903121561410957600080fd5b8635955060208701359450604087013593506060870135925060808701356001600160401b0381111561413b57600080fd5b61414789828a016140ac565b979a9699509497509295939492505050565b60006020828403121561416b57600080fd5b813561238081613e27565b60008060006060848603121561418b57600080fd5b833561419681613e27565b925060208401356141a681613e27565b929592945050506040919091013590565b60006001600160401b038211156141d0576141d0613e81565b50601f01601f191660200190565b600082601f8301126141ef57600080fd5b81356142026141fd826141b7565b613ec0565b81815284602083860101111561421757600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561424a57600080fd5b843561425581613e27565b9350602085013561426581613e27565b925060408501356001600160401b038082111561428157600080fd5b61428d88838901613ef0565b935060608701359150808211156142a357600080fd5b506142b0878288016141de565b91505092959194509250565b600080604083850312156142cf57600080fd5b50508035926020909101359150565b600080602083850312156142f157600080fd5b82356001600160401b038082111561430857600080fd5b818501915085601f83011261431c57600080fd5b81358181111561432b57600080fd5b86602082850101111561433d57600080fd5b60209290920196919550909350505050565b60008060008060006080868803121561436757600080fd5b85359450602086013593506040860135925060608601356001600160401b0381111561439257600080fd5b61439e888289016140ac565b969995985093965092949392505050565b801515811461172257600080fd5b8035612876816143af565b600061012082840312156143db57600080fd5b6143e3613e97565b6143ec836143bd565b81526143fa602084016143bd565b602082015261440b604084016143bd565b6040820152606083013560608201526080830135608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152508091505092915050565b6000806040838503121561446b57600080fd5b823561447681613e27565b91506020830135613e76816143af565b6020808252825182820181905260009190848201906040850190845b818110156144be578351835292840192918401916001016144a2565b50909695505050505050565b600080600080608085870312156144e057600080fd5b84356144eb81613e27565b935060208501356144fb81613e27565b92506040850135915060608501356001600160401b0381111561451d57600080fd5b6142b0878288016141de565b6000806040838503121561453c57600080fd5b823561454781613e27565b91506020830135613e7681613e27565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601490820152734e6f7420746865207a65726f206164647265737360601b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156145fa576145fa6145d0565b5060010190565b6020808252601a908201527f43616c6c6572206973206e6f7420746865206f70657261746f72000000000000604082015260600190565b600181811c9082168061464c57607f821691505b6020821081141561466d57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601a908201527f496e76616c69642077686974656c69737465642064657461696c000000000000604082015260600190565b600082198211156146bd576146bd6145d0565b500190565b6020808252600e908201526d416d6f756e74206973207a65726f60901b604082015260600190565b6000816000190483118215151615614704576147046145d0565b500290565b602080825260119082015270125b9cdd59999a58da595b9d08199d5b99607a1b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826147aa576147aa614785565b500490565b6020808252601e908201527f416d6f756e742069732067726561746572207468616e206d6178696d756d0000604082015260600190565b6000845160206147f98285838a01613ffc565b85519184019161480c8184848a01613ffc565b8554920191600090600181811c908083168061482957607f831692505b85831081141561484757634e487b7160e01b85526022600452602485fd5b80801561485b576001811461486c57614899565b60ff19851688528388019550614899565b60008b81526020902060005b858110156148915781548a820152908401908801614878565b505083880195505b50939b9a5050505050505050505050565b6000602082840312156148bc57600080fd5b8151612380816143af565b6000602082840312156148d957600080fd5b81516001600160401b038111156148ef57600080fd5b8201601f8101841361490057600080fd5b805161490e6141fd826141b7565b81815285602083850101111561492357600080fd5b614934826020830160208601613ffc565b95945050505050565b60006020828403121561494f57600080fd5b5051919050565b60008451614968818460208901613ffc565b91909101928352506020820152604001919050565b60008282101561498f5761498f6145d0565b500390565b634e487b7160e01b600052603160045260246000fd5b60018060a01b03841681528260208201526060604082015260006149346060830184614028565b6000826149e0576149e0614785565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614a6a90830184614028565b9695505050505050565b600060208284031215614a8657600080fd5b815161238081613df4565b600063ffffffff808316818516808303821115614ab057614ab06145d0565b0194935050505056fea264697066735822122091e3e65b235f925c5e4d27c845b5a809d8a1acb0d146f79ab69e8bf12234a43964736f6c634300080a003368747470733a2f2f6173736574732e6a6f6b6572636861726c69652e636f6d2f6a636367656e657369732f64656661756c742e6a736f6e4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724e6f7420746865207a65726f206164647265737300000000000000000000000000000000000000000000000026df578b132c219c5d269cbcfc37d808fbaf165500000000000000000000000026df578b132c219c5d269cbcfc37d808fbaf1655
Deployed Bytecode
0x6080604052600436106103fa5760003560e01c80635c975abb11610213578063b19b6f7911610123578063dd2d5601116100ab578063ed88c68e1161007a578063ed88c68e14610478578063f2c4ce1e14610cac578063f2fde38b14610ccc578063f7448a3114610cec578063fb5e28f314610d0c57600080fd5b8063dd2d560114610c17578063e5187f4314610c2d578063e51b759314610c4d578063e985e9c514610c6357600080fd5b8063b88d4fde116100f2578063b88d4fde14610b8c578063c668286214610bac578063c87b56dd14610bc1578063d1d6b73914610be1578063d5abeb0114610c0157600080fd5b8063b19b6f7914610b0a578063b2ad32e514610b2a578063b3ab15fb14610b3f578063b837764414610b5f57600080fd5b80638456cb59116101a657806395d89b411161017557806395d89b4114610a80578063a22cb46514610a95578063a2a71c3514610ab5578063a475b5dd14610ad5578063a689a91414610aea57600080fd5b80638456cb5914610a145780638da5cb5b14610a295780638e909e0b14610a3e5780639106d7ba14610a6b57600080fd5b806370a08231116101e257806370a08231146109b5578063715018a6146109d557806372250380146109ea57806376527485146109ff57600080fd5b80635c975abb146109535780636352211e1461096b5780636b3fe9e11461098b5780636c0360eb146109a057600080fd5b80632db115441161030e5780633ccfd60b116102a157806342842e0e1161027057806342842e0e146108b95780634319ff2f146108d95780634df30e97146108f95780634f6ccce714610919578063518302271461093957600080fd5b80633ccfd60b1461085c5780633f04fba4146108715780633f3e4c11146108845780633f4ba83a146108a457600080fd5b80632f8dccbc116102dd5780632f8dccbc1461076357806330176e13146107f7578063352098211461081757806338af3eed1461083c57600080fd5b80632db11544146106475780632e1a7d4d1461065a5780632ecd28ab1461067a5780632f745c591461074357600080fd5b806311aa225c116103915780631d891fa9116103605780631d891fa91461059c57806323b826ca146105b257806323b872dd146105c857806328cfbd46146105e85780632a55205a1461060857600080fd5b806311aa225c1461053457806314bb6daf1461055457806318160ddd146105675780631c31f7101461057c57600080fd5b80630475a470116103cd5780630475a4701461049a57806306fdde03146104ba578063081812fc146104dc578063095ea7b31461051457600080fd5b806301ffc9a7146103ff578063028172191461043457806302fa7c4714610458578063034601ec1461047a575b600080fd5b34801561040b57600080fd5b5061041f61041a366004613e0a565b610d21565b60405190151581526020015b60405180910390f35b34801561044057600080fd5b5061044a600a5481565b60405190815260200161042b565b34801561046457600080fd5b50610478610473366004613e3c565b610d41565b005b34801561048657600080fd5b50610478610495366004613f6f565b610dad565b3480156104a657600080fd5b506104786104b5366004613fd0565b610df5565b3480156104c657600080fd5b506104cf610eaa565b60405161042b9190614054565b3480156104e857600080fd5b506104fc6104f7366004614067565b610f3c565b6040516001600160a01b03909116815260200161042b565b34801561052057600080fd5b5061047861052f366004614080565b610fd1565b34801561054057600080fd5b506021546104fc906001600160a01b031681565b6104786105623660046140f0565b6110e7565b34801561057357600080fd5b5060065461044a565b34801561058857600080fd5b50610478610597366004614159565b611394565b3480156105a857600080fd5b5061044a600c5481565b3480156105be57600080fd5b5061044a600b5481565b3480156105d457600080fd5b506104786105e3366004614176565b61140b565b3480156105f457600080fd5b50610478610603366004614234565b61143c565b34801561061457600080fd5b506106286106233660046142bc565b611486565b604080516001600160a01b03909316835260208301919091520161042b565b610478610655366004614067565b611534565b34801561066657600080fd5b50610478610675366004614067565b6116dd565b34801561068657600080fd5b506106d3601254601354601454601554601654601754601854600854600954600a54600b54600c5460ff808d169d6101008e0482169d6201000090049091169b9a99989796959493929190565b604080519e15158f529c151560208f01529a15159b8d019b909b5260608c019890985260808b019690965260a08a019490945260c089019290925260e08801526101008701526101208601526101408501526101608401526101808301919091526101a08201526101c00161042b565b34801561074f57600080fd5b5061044a61075e366004614080565b611725565b34801561076f57600080fd5b506012546013546014546015546016546017546018546107ab9660ff808216976101008304821697620100009093049091169590949193909289565b604080519915158a5297151560208a0152951515968801969096526060870193909352608086019190915260a085015260c084015260e08301919091526101008201526101200161042b565b34801561080357600080fd5b506104786108123660046142de565b6117d3565b34801561082357600080fd5b506020546104fc9061010090046001600160a01b031681565b34801561084857600080fd5b50600d546104fc906001600160a01b031681565b34801561086857600080fd5b5061047861180e565b61047861087f36600461434f565b611855565b34801561089057600080fd5b5061047861089f366004614067565b611b5e565b3480156108b057600080fd5b50610478611bb9565b3480156108c557600080fd5b506104786108d4366004614176565b611bf2565b3480156108e557600080fd5b506104786108f43660046143c8565b611c0d565b34801561090557600080fd5b50610478610914366004613fd0565b611cab565b34801561092557600080fd5b5061044a610934366004614067565b611d0f565b34801561094557600080fd5b5060205461041f9060ff1681565b34801561095f57600080fd5b50601b5460ff1661041f565b34801561097757600080fd5b506104fc610986366004614067565b611da5565b34801561099757600080fd5b50610478611e1c565b3480156109ac57600080fd5b506104cf611f9c565b3480156109c157600080fd5b5061044a6109d0366004614159565b61202a565b3480156109e157600080fd5b506104786120b1565b3480156109f657600080fd5b506104cf6120ea565b348015610a0b57600080fd5b506104786120f7565b348015610a2057600080fd5b506104786121b0565b348015610a3557600080fd5b506104fc6121e7565b348015610a4a57600080fd5b5061044a610a59366004614067565b60009081526010602052604090205490565b348015610a7757600080fd5b5061044a6121fe565b348015610a8c57600080fd5b506104cf612222565b348015610aa157600080fd5b50610478610ab0366004614458565b612231565b348015610ac157600080fd5b50610478610ad03660046142bc565b61223c565b348015610ae157600080fd5b506104786122e8565b348015610af657600080fd5b506104cf610b05366004614067565b612326565b348015610b1657600080fd5b50610478610b25366004614159565b612387565b348015610b3657600080fd5b506104786124ae565b348015610b4b57600080fd5b50610478610b5a366004614159565b612523565b348015610b6b57600080fd5b50610b7f610b7a366004614159565b61259a565b60405161042b9190614486565b348015610b9857600080fd5b50610478610ba73660046144ca565b612688565b348015610bb857600080fd5b506104cf6126ba565b348015610bcd57600080fd5b506104cf610bdc366004614067565b6126c7565b348015610bed57600080fd5b50610478610bfc366004614159565b61287b565b348015610c0d57600080fd5b5061044a601c5481565b348015610c2357600080fd5b5061044a60085481565b348015610c3957600080fd5b50610478610c48366004614159565b61298f565b348015610c5957600080fd5b5061044a60095481565b348015610c6f57600080fd5b5061041f610c7e366004614529565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b348015610cb857600080fd5b50610478610cc73660046142de565b612ab0565b348015610cd857600080fd5b50610478610ce7366004614159565b612aeb565b348015610cf857600080fd5b50610478610d07366004614080565b612b88565b348015610d1857600080fd5b50610478612bf0565b6000610d2c82612cb2565b80610d3b5750610d3b82612d1d565b92915050565b33610d4a6121e7565b6001600160a01b031614610d795760405162461bcd60e51b8152600401610d7090614557565b60405180910390fd5b6001600160a01b038216610d9f5760405162461bcd60e51b8152600401610d709061458c565b610da98282612d42565b5050565b60005b8151811015610def57610ddd8484848481518110610dd057610dd06145ba565b6020026020010151611bf2565b80610de7816145e6565b915050610db0565b50505050565b610dfd6121e7565b6001600160a01b0316336001600160a01b03161480610e2f57506011546001600160a01b0316336001600160a01b0316145b610e4b5760405162461bcd60e51b8152600401610d7090614601565b601254610100900460ff1615610e9c5760405162461bcd60e51b815260206004820152601660248201527550726976617465206d696e742069732061637469766560501b6044820152606401610d70565b601492909255601655601855565b606060008054610eb990614638565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee590614638565b8015610f325780601f10610f0757610100808354040283529160200191610f32565b820191906000526020600020905b815481529060010190602001808311610f1557829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610fb55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610d70565b506000908152600360205260409020546001600160a01b031690565b6000610fdc82611da5565b9050806001600160a01b0316836001600160a01b0316141561104a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610d70565b336001600160a01b038216148061106657506110668133610c7e565b6110d85760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610d70565b6110e28383612e3f565b505050565b60125462010000900460ff166111385760405162461bcd60e51b8152602060048201526016602482015275159bdd58da195c881b5a5b9d081a5cc818db1bdcd95960521b6044820152606401610d70565b60408051602080820188905230606090811b6bffffffffffffffffffffffff1990811684860152602b60f91b6054850152339182901b1660558401526069830188905260898084018890528451808503909101815260a99093019093528151910120600f5483146111bb5760405162461bcd60e51b8152600401610d7090614673565b6111fc84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e549150849050612ead565b6112415760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081d9bdd58da195c8819195d185a5b60521b6044820152606401610d70565b600087815260106020526040902054869061125d908a906146aa565b11156112ab5760405162461bcd60e51b815260206004820152601f60248201527f416d6d6f756e742069732067726561746572207468616e20766f7563686572006044820152606401610d70565b600088116112cb5760405162461bcd60e51b8152600401610d70906146c2565b346112d689876146ea565b11156112f45760405162461bcd60e51b8152600401610d7090614709565b6112fe8289612f6e565b600087815260106020526040812080548a929061131c9084906146aa565b9250508190555087600a600082825461133591906146aa565b9091555050604080516001600160a01b0384168152602081018990529081018990523460608201527f9f62b4b30c37c0fa5a560150558db2f99f732dff3cf5b42687e97b1cae65df199060800160405180910390a15050505050505050565b3361139d6121e7565b6001600160a01b0316146113c35760405162461bcd60e51b8152600401610d7090614557565b6001600160a01b0381166113e95760405162461bcd60e51b8152600401610d709061458c565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6114153382612ff9565b6114315760405162461bcd60e51b8152600401610d7090614734565b6110e28383836130f0565b60005b825181101561147f5761146d858585848151811061145f5761145f6145ba565b602002602001015185612688565b80611477816145e6565b91505061143f565b5050505050565b6000828152601a602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916114fb5750604080518082019091526019546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101516000906127109061151a906001600160601b0316876146ea565b611524919061479b565b91519350909150505b9250929050565b60125460ff1661157e5760405162461bcd60e51b8152602060048201526015602482015274141d589b1a58c81b5a5b9d081a5cc818db1bdcd959605a1b6044820152606401610d70565b6000811161159e5760405162461bcd60e51b8152600401610d70906146c2565b6015548111156115c05760405162461bcd60e51b8152600401610d70906147af565b60126005015481600b54600954600854600c546115dd91906146aa565b6115e791906146aa565b6115f191906146aa565b6115fb91906146aa565b11156116415760405162461bcd60e51b8152602060048201526015602482015274457863656564206d6178546f74616c537570706c7960581b6044820152606401610d70565b60135434906116519083906146ea565b111561166f5760405162461bcd60e51b8152600401610d7090614709565b3361167a8183612f6e565b816008600082825461168c91906146aa565b9091555050604080516001600160a01b038316815260208101849052348183015290517f819f7e30541f2ed7e36c92ce039f5eb2d66b7dc094b33f416910e8fde56b80dc9181900360600190a15050565b336116e66121e7565b6001600160a01b03161461170c5760405162461bcd60e51b8152600401610d7090614557565b600d54611722906001600160a01b03168261341f565b50565b60006117308361202a565b821061177e5760405162461bcd60e51b815260206004820152601960248201527f4f776e657220696e646578206f7574206f6620626f756e6473000000000000006044820152606401610d70565b6001600160a01b03831660009081526005602052604090208054839081106117a8576117a86145ba565b6000918252602090912060088204015460079091166004026101000a900463ffffffff169392505050565b336117dc6121e7565b6001600160a01b0316146118025760405162461bcd60e51b8152600401610d7090614557565b6110e2601d8383613d5b565b336118176121e7565b6001600160a01b03161461183d5760405162461bcd60e51b8152600401610d7090614557565b600d544790611722906001600160a01b03168261341f565b601254610100900460ff166118a55760405162461bcd60e51b8152602060048201526016602482015275141c9a5d985d19481b5a5b9d081a5cc818db1bdcd95960521b6044820152606401610d70565b60408051602080820187905230606090811b6bffffffffffffffffffffffff1990811684860152605760f81b6054850152339182901b16605584015260698084018890528451808503909101815260899093019093528151910120600f5483146119215760405162461bcd60e51b8152600401610d7090614673565b61196284848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e549150849050612ead565b61197e5760405162461bcd60e51b8152600401610d7090614673565b600086815260106020526040902054156119da5760405162461bcd60e51b815260206004820152601860248201527f576869656c697374656420686173206265656e207573656400000000000000006044820152606401610d70565b84611a0657601654871115611a015760405162461bcd60e51b8152600401610d70906147af565b611a26565b84871115611a265760405162461bcd60e51b8152600401610d70906147af565b60008711611a465760405162461bcd60e51b8152600401610d70906146c2565b601854600954611a579089906146aa565b1115611aa55760405162461bcd60e51b815260206004820152601b60248201527f457863656564206d6178507269766174654d696e74537570706c7900000000006044820152606401610d70565b6014543490611ab59089906146ea565b1115611ad35760405162461bcd60e51b8152600401610d7090614709565b611add8288612f6e565b600086815260106020526040812088905560098054899290611b009084906146aa565b9091555050604080516001600160a01b0384168152602081018890529081018890523460608201527fea42e12d368267aa3744b225140b462e261f7bf081e5d5dbc006a74520064b909060800160405180910390a150505050505050565b611b666121e7565b6001600160a01b0316336001600160a01b03161480611b9857506011546001600160a01b0316336001600160a01b0316145b611bb45760405162461bcd60e51b8152600401610d7090614601565b601755565b33611bc26121e7565b6001600160a01b031614611be85760405162461bcd60e51b8152600401610d7090614557565b611bf0613538565b565b6110e283838360405180602001604052806000815250612688565b33611c166121e7565b6001600160a01b031614611c3c5760405162461bcd60e51b8152600401610d7090614557565b8051601280546020840151604085015161ffff1990921693151561ff0019169390931761010093151584021762ff0000191662010000911515919091021790556060820151601355608082015160145560a082015160155560c082015160165560e08201516017550151601855565b611cb36121e7565b6001600160a01b0316336001600160a01b03161480611ce557506011546001600160a01b0316336001600160a01b0316145b611d015760405162461bcd60e51b8152600401610d7090614601565b600e92909255600f55600b55565b6000611d1a60065490565b8210611d685760405162461bcd60e51b815260206004820152601a60248201527f476c6f62616c20696e646578206f7574206f6620626f756e64730000000000006044820152606401610d70565b60068281548110611d7b57611d7b6145ba565b6000918252602090912060088204015460079091166004026101000a900463ffffffff1692915050565b6000818152600260205260408120546001600160a01b031680610d3b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610d70565b33611e256121e7565b6001600160a01b031614611e4b5760405162461bcd60e51b8152600401610d7090614557565b600c5415611e8a5760405162461bcd60e51b815260206004820152600c60248201526b105b1c9958591e481b5a5b9d60a21b6044820152606401610d70565b611ed173eeb50494d097d68d95c333aa1d038189d2bae6bb60216040518060400160405280600f81526020016e3337b9103a32b0b69036b2b6b132b960891b8152506135cb565b611f147319d03a5e56240507934af26b194d38f76144815d601e6040518060400160405280600b81526020016a3337b91030b23b34b9b7b960a91b8152506135cb565b611f587352ff836e109fb4df3931ee367a25f04edde92a8960116040518060400160405280600c81526020016b666f7220676976656177617960a01b8152506135cb565b611bf0736dd041217ae648ae13b5df1f60b1de886fdfbebf60646040518060400160405280600c81526020016b666f7220747265617375727960a01b8152506135cb565b601d8054611fa990614638565b80601f0160208091040260200160405190810160405280929190818152602001828054611fd590614638565b80156120225780601f10611ff757610100808354040283529160200191612022565b820191906000526020600020905b81548152906001019060200180831161200557829003601f168201915b505050505081565b60006001600160a01b0382166120955760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610d70565b506001600160a01b031660009081526005602052604090205490565b336120ba6121e7565b6001600160a01b0316146120e05760405162461bcd60e51b8152600401610d7090614557565b611bf0600061362d565b601e8054611fa990614638565b6120ff6121e7565b6001600160a01b0316336001600160a01b0316148061213157506011546001600160a01b0316336001600160a01b0316145b61214d5760405162461bcd60e51b8152600401610d7090614601565b60135461219c5760405162461bcd60e51b815260206004820152601960248201527f5075626c6963204d696e74205072696365206973207a65726f000000000000006044820152606401610d70565b6012805460ff19811660ff90911615179055565b336121b96121e7565b6001600160a01b0316146121df5760405162461bcd60e51b8152600401610d7090614557565b611bf061368d565b60075464010000000090046001600160a01b031690565b6000600a5460095460085461221391906146aa565b61221d91906146aa565b905090565b606060018054610eb990614638565b610da9338383613708565b6122446121e7565b6001600160a01b0316336001600160a01b0316148061227657506011546001600160a01b0316336001600160a01b0316145b6122925760405162461bcd60e51b8152600401610d7090614601565b60125460ff16156122dd5760405162461bcd60e51b81526020600482015260156024820152745075626c6963206d696e742069732061637469766560581b6044820152606401610d70565b601391909155601555565b336122f16121e7565b6001600160a01b0316146123175760405162461bcd60e51b8152600401610d7090614557565b6020805460ff19166001179055565b606060006123326137d7565b905060008151116123525760405180602001604052806000815250612380565b8061235c846137e6565b601f604051602001612370939291906147e6565b6040516020818303038152906040525b9392505050565b336123906121e7565b6001600160a01b0316146123b65760405162461bcd60e51b8152600401610d7090614557565b6001600160a01b0381161561248c576040516301ffc9a760e01b815263276a28a360e01b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa158015612410573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243491906148aa565b61248c5760405162461bcd60e51b8152602060048201526024808201527f6973546f6b656e4c6f636b65642875696e7432353629206e6f7420737570706f6044820152631c9d195960e21b6064820152608401610d70565b602180546001600160a01b0319166001600160a01b0392909216919091179055565b6124b66121e7565b6001600160a01b0316336001600160a01b031614806124e857506011546001600160a01b0316336001600160a01b0316145b6125045760405162461bcd60e51b8152600401610d7090614601565b6012805462ff0000198116620100009182900460ff1615909102179055565b3361252c6121e7565b6001600160a01b0316146125525760405162461bcd60e51b8152600401610d7090614557565b6001600160a01b0381166125785760405162461bcd60e51b8152600401610d709061458c565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b606060006125a78361202a565b90506000816001600160401b038111156125c3576125c3613e81565b6040519080825280602002602001820160405280156125ec578160200160208202803683370190505b506001600160a01b03851660009081526005602052604081209192505b8381101561267e57818181548110612623576126236145ba565b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1663ffffffff16838281518110612661576126616145ba565b602090810291909101015280612676816145e6565b915050612609565b5090949350505050565b6126923383612ff9565b6126ae5760405162461bcd60e51b8152600401610d7090614734565b610def848484846138e3565b601f8054611fa990614638565b6000818152600260205260409020546060906001600160a01b03166127465760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610d70565b60205460ff166127e257601e805461275d90614638565b80601f016020809104026020016040519081016040528092919081815260200182805461278990614638565b80156127d65780601f106127ab576101008083540402835291602001916127d6565b820191906000526020600020905b8154815290600101906020018083116127b957829003601f168201915b50505050509050919050565b60205461010090046001600160a01b03161561286d5760205460405163c87b56dd60e01b8152600481018490526101009091046001600160a01b03169063c87b56dd90602401600060405180830381865afa158015612845573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d3b91908101906148c7565b610d3b82612326565b919050565b336128846121e7565b6001600160a01b0316146128aa5760405162461bcd60e51b8152600401610d7090614557565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156128f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612915919061493d565b600d5460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044015b6020604051808303816000875af115801561296b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e291906148aa565b336129986121e7565b6001600160a01b0316146129be5760405162461bcd60e51b8152600401610d7090614557565b6001600160a01b03811615612a88576040516301ffc9a760e01b815263c87b56dd60e01b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa158015612a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3c91906148aa565b612a885760405162461bcd60e51b815260206004820152601f60248201527f746f6b656e5552492875696e7432353629206e6f7420737570706f72746564006044820152606401610d70565b602080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b33612ab96121e7565b6001600160a01b031614612adf5760405162461bcd60e51b8152600401610d7090614557565b6110e2601e8383613d5b565b33612af46121e7565b6001600160a01b031614612b1a5760405162461bcd60e51b8152600401610d7090614557565b6001600160a01b038116612b7f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d70565b6117228161362d565b33612b916121e7565b6001600160a01b031614612bb75760405162461bcd60e51b8152600401610d7090614557565b600d5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb9060440161294c565b612bf86121e7565b6001600160a01b0316336001600160a01b03161480612c2a57506011546001600160a01b0316336001600160a01b0316145b612c465760405162461bcd60e51b8152600401610d7090614601565b601454612c955760405162461bcd60e51b815260206004820152601a60248201527f50726976617465204d696e74205072696365206973207a65726f0000000000006044820152606401610d70565b6012805461ff001981166101009182900460ff1615909102179055565b60006001600160e01b031982166380ac58cd60e01b1480612ce357506001600160e01b03198216635b5e139f60e01b145b80612cfe57506001600160e01b0319821663780e9d6360e01b145b80610d3b57506301ffc9a760e01b6001600160e01b0319831614610d3b565b60006001600160e01b0319821663152a902d60e11b1480610d3b5750610d3b82612cb2565b6127106001600160601b0382161115612db05760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610d70565b6001600160a01b038216612e065760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610d70565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217601955565b600081815260036020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612e7482611da5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081815b8551811015612f63576000868281518110612ecf57612ecf6145ba565b60200260200101519050808311612f1a57612ee9826137e6565b8382604051602001612efd93929190614956565b604051602081830303815290604052805190602001209250612f50565b612f23826137e6565b8184604051602001612f3793929190614956565b6040516020818303038152906040528051906020012092505b5080612f5b816145e6565b915050612eb2565b509092149392505050565b601c5481612f7b60065490565b612f8591906146aa565b1115612fd35760405162461bcd60e51b815260206004820152601760248201527f4d617820737570706c79206c696d6974206578636565640000000000000000006044820152606401610d70565b60005b818110156110e257612fe783613916565b80612ff1816145e6565b915050612fd6565b6000818152600260205260408120546001600160a01b03166130725760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610d70565b600061307d83611da5565b9050806001600160a01b0316846001600160a01b031614806130c457506001600160a01b0380821660009081526004602090815260408083209388168352929052205460ff165b806130e85750836001600160a01b03166130dd84610f3c565b6001600160a01b0316145b949350505050565b826001600160a01b031661310382611da5565b6001600160a01b0316146131675760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610d70565b6001600160a01b0382166131c95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d70565b6131d483838361392f565b6131df600082612e3f565b600081815260026020818152604080842080546001600160a01b0319166001600160a01b038881169190911780835590891686526005845291852086865293909252825492939192600160c01b90910463ffffffff16919084906132459060019061497d565b81548110613255576132556145ba565b90600052602060002090600891828204019190066004029054906101000a900463ffffffff16905080848363ffffffff1681548110613296576132966145ba565b600091825260208083206008830401805460079093166004026101000a63ffffffff8181021990941695841602949094179093558381168252600290925260409020805463ffffffff60c01b1916600160c01b92851692909202919091179055835484908061330757613307614994565b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff02191690559055600060056000886001600160a01b03166001600160a01b03168152602001908152602001600020905080805490508460000160186101000a81548163ffffffff021916908363ffffffff160217905550808690806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908363ffffffff16021790555085876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050505050565b8047101561346f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d70565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146134bc576040519150601f19603f3d011682016040523d82523d6000602084013e6134c1565b606091505b50509050806110e25760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d70565b601b5460ff166135815760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610d70565b601b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6135d58383612f6e565b81600c60008282546135e791906146aa565b90915550506040517f934a6c92dbeb596dde342e708748236ded185a44968de85358144785b72b318690613620908590859085906149aa565b60405180910390a1505050565b600780546001600160a01b03838116640100000000818102640100000000600160c01b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b601b5460ff16156136d35760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d70565b601b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586135ae3390565b816001600160a01b0316836001600160a01b0316141561376a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d70565b6001600160a01b03838116600081815260046020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6060601d8054610eb990614638565b60608161380a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613834578061381e816145e6565b915061382d9050600a8361479b565b915061380e565b6000816001600160401b0381111561384e5761384e613e81565b6040519080825280601f01601f191660200182016040528015613878576020820181803683370190505b5090505b84156130e85761388d60018361497d565b915061389a600a866149d1565b6138a59060306146aa565b60f81b8183815181106138ba576138ba6145ba565b60200101906001600160f81b031916908160001a9053506138dc600a8661479b565b945061387c565b6138ee8484846130f0565b6138fa84848484613a34565b610def5760405162461bcd60e51b8152600401610d70906149e5565b6117228160405180602001604052806000815250613b32565b601b5460ff16156139775760405162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b6044820152606401610d70565b6021546001600160a01b0316156110e25760215460405163276a28a360e01b8152600481018390526001600160a01b039091169063276a28a390602401602060405180830381865afa1580156139d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139f591906148aa565b156110e25760405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881a5cc81b1bd8dad959608a1b6044820152606401610d70565b60006001600160a01b0384163b15613b2757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613a78903390899088908890600401614a37565b6020604051808303816000875af1925050508015613ab3575060408051601f3d908101601f19168201909252613ab091810190614a74565b60015b613b0d573d808015613ae1576040519150601f19603f3d011682016040523d82523d6000602084013e613ae6565b606091505b508051613b055760405162461bcd60e51b8152600401610d70906149e5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506130e8565b506001949350505050565b60075463ffffffff16613b4483613b6d565b613b516000848385613a34565b6110e25760405162461bcd60e51b8152600401610d70906149e5565b6001600160a01b038116613bc35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d70565b60075463ffffffff16613bd86000838361392f565b6001600160a01b038216600081815260056020908152604080832063ffffffff8087168086526002855292852080546001600160a01b031981168817825583548316600160c01b02600167ffffffff0000000160a01b031990911690971796909617808755600680548316600160a01b0263ffffffff60a01b199092169190911787558254600181810185558488529587206008808304909101805460046007948516810261010090810a808b0290890219909316929092179092558454808a018655948a529184047ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01805494841690910290910a95860295840219909216949094179055825491959491613cf091859116614a91565b92506101000a81548163ffffffff021916908363ffffffff1602179055508263ffffffff16846001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610def565b828054613d6790614638565b90600052602060002090601f016020900481019282613d895760008555613dcf565b82601f10613da25782800160ff19823516178555613dcf565b82800160010185558215613dcf579182015b82811115613dcf578235825591602001919060010190613db4565b50613ddb929150613ddf565b5090565b5b80821115613ddb5760008155600101613de0565b6001600160e01b03198116811461172257600080fd5b600060208284031215613e1c57600080fd5b813561238081613df4565b6001600160a01b038116811461172257600080fd5b60008060408385031215613e4f57600080fd5b8235613e5a81613e27565b915060208301356001600160601b0381168114613e7657600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60405161012081016001600160401b0381118282101715613eba57613eba613e81565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613ee857613ee8613e81565b604052919050565b600082601f830112613f0157600080fd5b813560206001600160401b03821115613f1c57613f1c613e81565b8160051b613f2b828201613ec0565b9283528481018201928281019087851115613f4557600080fd5b83870192505b84831015613f6457823582529183019190830190613f4b565b979650505050505050565b600080600060608486031215613f8457600080fd5b8335613f8f81613e27565b92506020840135613f9f81613e27565b915060408401356001600160401b03811115613fba57600080fd5b613fc686828701613ef0565b9150509250925092565b600080600060608486031215613fe557600080fd5b505081359360208301359350604090920135919050565b60005b83811015614017578181015183820152602001613fff565b83811115610def5750506000910152565b60008151808452614040816020860160208601613ffc565b601f01601f19169290920160200192915050565b6020815260006123806020830184614028565b60006020828403121561407957600080fd5b5035919050565b6000806040838503121561409357600080fd5b823561409e81613e27565b946020939093013593505050565b60008083601f8401126140be57600080fd5b5081356001600160401b038111156140d557600080fd5b6020830191508360208260051b850101111561152d57600080fd5b60008060008060008060a0878903121561410957600080fd5b8635955060208701359450604087013593506060870135925060808701356001600160401b0381111561413b57600080fd5b61414789828a016140ac565b979a9699509497509295939492505050565b60006020828403121561416b57600080fd5b813561238081613e27565b60008060006060848603121561418b57600080fd5b833561419681613e27565b925060208401356141a681613e27565b929592945050506040919091013590565b60006001600160401b038211156141d0576141d0613e81565b50601f01601f191660200190565b600082601f8301126141ef57600080fd5b81356142026141fd826141b7565b613ec0565b81815284602083860101111561421757600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561424a57600080fd5b843561425581613e27565b9350602085013561426581613e27565b925060408501356001600160401b038082111561428157600080fd5b61428d88838901613ef0565b935060608701359150808211156142a357600080fd5b506142b0878288016141de565b91505092959194509250565b600080604083850312156142cf57600080fd5b50508035926020909101359150565b600080602083850312156142f157600080fd5b82356001600160401b038082111561430857600080fd5b818501915085601f83011261431c57600080fd5b81358181111561432b57600080fd5b86602082850101111561433d57600080fd5b60209290920196919550909350505050565b60008060008060006080868803121561436757600080fd5b85359450602086013593506040860135925060608601356001600160401b0381111561439257600080fd5b61439e888289016140ac565b969995985093965092949392505050565b801515811461172257600080fd5b8035612876816143af565b600061012082840312156143db57600080fd5b6143e3613e97565b6143ec836143bd565b81526143fa602084016143bd565b602082015261440b604084016143bd565b6040820152606083013560608201526080830135608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152508091505092915050565b6000806040838503121561446b57600080fd5b823561447681613e27565b91506020830135613e76816143af565b6020808252825182820181905260009190848201906040850190845b818110156144be578351835292840192918401916001016144a2565b50909695505050505050565b600080600080608085870312156144e057600080fd5b84356144eb81613e27565b935060208501356144fb81613e27565b92506040850135915060608501356001600160401b0381111561451d57600080fd5b6142b0878288016141de565b6000806040838503121561453c57600080fd5b823561454781613e27565b91506020830135613e7681613e27565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601490820152734e6f7420746865207a65726f206164647265737360601b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156145fa576145fa6145d0565b5060010190565b6020808252601a908201527f43616c6c6572206973206e6f7420746865206f70657261746f72000000000000604082015260600190565b600181811c9082168061464c57607f821691505b6020821081141561466d57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601a908201527f496e76616c69642077686974656c69737465642064657461696c000000000000604082015260600190565b600082198211156146bd576146bd6145d0565b500190565b6020808252600e908201526d416d6f756e74206973207a65726f60901b604082015260600190565b6000816000190483118215151615614704576147046145d0565b500290565b602080825260119082015270125b9cdd59999a58da595b9d08199d5b99607a1b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826147aa576147aa614785565b500490565b6020808252601e908201527f416d6f756e742069732067726561746572207468616e206d6178696d756d0000604082015260600190565b6000845160206147f98285838a01613ffc565b85519184019161480c8184848a01613ffc565b8554920191600090600181811c908083168061482957607f831692505b85831081141561484757634e487b7160e01b85526022600452602485fd5b80801561485b576001811461486c57614899565b60ff19851688528388019550614899565b60008b81526020902060005b858110156148915781548a820152908401908801614878565b505083880195505b50939b9a5050505050505050505050565b6000602082840312156148bc57600080fd5b8151612380816143af565b6000602082840312156148d957600080fd5b81516001600160401b038111156148ef57600080fd5b8201601f8101841361490057600080fd5b805161490e6141fd826141b7565b81815285602083850101111561492357600080fd5b614934826020830160208601613ffc565b95945050505050565b60006020828403121561494f57600080fd5b5051919050565b60008451614968818460208901613ffc565b91909101928352506020820152604001919050565b60008282101561498f5761498f6145d0565b500390565b634e487b7160e01b600052603160045260246000fd5b60018060a01b03841681528260208201526060604082015260006149346060830184614028565b6000826149e0576149e0614785565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614a6a90830184614028565b9695505050505050565b600060208284031215614a8657600080fd5b815161238081613df4565b600063ffffffff808316818516808303821115614ab057614ab06145d0565b0194935050505056fea264697066735822122091e3e65b235f925c5e4d27c845b5a809d8a1acb0d146f79ab69e8bf12234a43964736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000026df578b132c219c5d269cbcfc37d808fbaf165500000000000000000000000026df578b132c219c5d269cbcfc37d808fbaf1655
-----Decoded View---------------
Arg [0] : beneficiary (address): 0x26Df578B132C219C5d269cBcfc37d808fbaf1655
Arg [1] : royaltyReceiver (address): 0x26Df578B132C219C5d269cBcfc37d808fbaf1655
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000026df578b132c219c5d269cbcfc37d808fbaf1655
Arg [1] : 00000000000000000000000026df578b132c219c5d269cbcfc37d808fbaf1655
Deployed Bytecode Sourcemap
65483:7390:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69304:261;;;;;;;;;;-1:-1:-1;69304:261:0;;;;;:::i;:::-;;:::i;:::-;;;661:14:1;;654:22;636:41;;624:2;609:18;69304:261:0;;;;;;;;23881:34;;;;;;;;;;;;;;;;;;;834:25:1;;;822:2;807:18;23881:34:0;688:177:1;68457:237:0;;;;;;;;;;-1:-1:-1;68457:237:0;;;;;:::i;:::-;;:::i;:::-;;72641:223;;;;;;;;;;-1:-1:-1;72641:223:0;;;;;:::i;:::-;;:::i;26616:348::-;;;;;;;;;;-1:-1:-1;26616:348:0;;;;;:::i;:::-;;:::i;46162:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;47717:219::-;;;;;;;;;;-1:-1:-1;47717:219:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4882:32:1;;;4864:51;;4852:2;4837:18;47717:219:0;4718:203:1;47243:408:0;;;;;;;;;;-1:-1:-1;47243:408:0;;;;;:::i;:::-;;:::i;66132:29::-;;;;;;;;;;-1:-1:-1;66132:29:0;;;;-1:-1:-1;;;;;66132:29:0;;;29437:1076;;;;;;:::i;:::-;;:::i;59473:105::-;;;;;;;;;;-1:-1:-1;59553:10:0;:17;59473:105;;24773:186;;;;;;;;;;-1:-1:-1;24773:186:0;;;;;:::i;:::-;;:::i;23962:31::-;;;;;;;;;;;;;;;;23922:33;;;;;;;;;;;;;;;;48465:303;;;;;;;;;;-1:-1:-1;48465:303:0;;;;;:::i;:::-;;:::i;72151:250::-;;;;;;;;;;-1:-1:-1;72151:250:0;;;;;:::i;:::-;;:::i;62638:494::-;;;;;;;;;;-1:-1:-1;62638:494:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;9007:32:1;;;8989:51;;9071:2;9056:18;;9049:34;;;;8962:18;62638:494:0;8815:274:1;27272:712:0;;;;;;:::i;:::-;;:::i;31203:141::-;;;;;;;;;;-1:-1:-1;31203:141:0;;;;;:::i;:::-;;:::i;31979:1445::-;;;;;;;;;;;;32600:12;:31;32800:28;;32863:29;;32927:32;;32994:33;;33062:27;;33124:33;;33192:15;;33242:16;;33293:19;;33347:18;;33400:16;;32600:31;;;;;;32666:32;;;;;32733;;;;;;;32800:28;32863:29;32927:32;32994:33;33062:27;33124:33;33192:15;33242:16;33293:19;33347:18;33400:16;31979:1445;;;;;9616:14:1;;9609:22;9591:41;;9675:14;;9668:22;9663:2;9648:18;;9641:50;470:13;;463:21;9724:18;;;451:34;;;;9774:2;9759:18;;9752:34;;;;9817:3;9802:19;;9795:35;;;;9861:3;9846:19;;9839:35;;;;9905:3;9890:19;;9883:35;;;;9949:3;9934:19;;9927:35;9993:3;9978:19;;9971:35;10037:3;10022:19;;10015:35;10081:3;10066:19;;10059:36;10126:3;10111:19;;10104:36;10171:3;10156:19;;10149:36;;;;10216:3;10201:19;;10194:36;9578:3;9563:19;31979:1445:0;9094:1142:1;58745:239:0;;;;;;;;;;-1:-1:-1;58745:239:0;;;;;:::i;:::-;;:::i;24363:32::-;;;;;;;;;;-1:-1:-1;24363:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10619:14:1;;10612:22;10594:41;;10678:14;;10671:22;10666:2;10651:18;;10644:50;10737:14;;10730:22;10710:18;;;10703:50;;;;10784:2;10769:18;;10762:34;;;;10827:3;10812:19;;10805:35;;;;10871:3;10856:19;;10849:35;10915:3;10900:19;;10893:35;10959:3;10944:19;;10937:35;;;;11003:3;10988:19;;10981:35;10581:3;10566:19;24363:32:0;10241:781:1;69616:120:0;;;;;;;;;;-1:-1:-1;69616:120:0;;;;;:::i;:::-;;:::i;66094:31::-;;;;;;;;;;-1:-1:-1;66094:31:0;;;;;;;-1:-1:-1;;;;;66094:31:0;;;24002:26;;;;;;;;;;-1:-1:-1;24002:26:0;;;;-1:-1:-1;;;;;24002:26:0;;;31017:174;;;;;;;;;;;;;:::i;27992:1437::-;;;;;;:::i;:::-;;:::i;26112:128::-;;;;;;;;;;-1:-1:-1;26112:128:0;;;;;:::i;:::-;;:::i;68876:67::-;;;;;;;;;;;;;:::i;48839:151::-;;;;;;;;;;-1:-1:-1;48839:151:0;;;;;:::i;:::-;;:::i;24608:118::-;;;;;;;;;;-1:-1:-1;24608:118:0;;;;;:::i;:::-;;:::i;27019:245::-;;;;;;;;;;-1:-1:-1;27019:245:0;;;;;:::i;:::-;;:::i;59655:207::-;;;;;;;;;;-1:-1:-1;59655:207:0;;;;;:::i;:::-;;:::i;66061:20::-;;;;;;;;;;-1:-1:-1;66061:20:0;;;;;;;;20386:86;;;;;;;;;;-1:-1:-1;20457:7:0;;;;20386:86;;45845:250;;;;;;;;;;-1:-1:-1;45845:250:0;;;;;:::i;:::-;;:::i;67894:555::-;;;;;;;;;;;;;:::i;65883:21::-;;;;;;;;;;;;;:::i;45565:218::-;;;;;;;;;;-1:-1:-1;45565:218:0;;;;;:::i;:::-;;:::i;18470:103::-;;;;;;;;;;;;;:::i;65911:88::-;;;;;;;;;;;;;:::i;25299:231::-;;;;;;;;;;;;;:::i;68805:63::-;;;;;;;;;;;;;:::i;17819:87::-;;;;;;;;;;;;;:::i;30736:122::-;;;;;;;;;;-1:-1:-1;30736:122:0;;;;;:::i;:::-;30801:7;30828:22;;;:11;:22;;;;;;;30736:122;25942:135;;;;;;;;;;;;;:::i;46331:104::-;;;;;;;;;;;;;:::i;48008:155::-;;;;;;;;;;-1:-1:-1;48008:155:0;;;;;:::i;:::-;;:::i;26287:282::-;;;;;;;;;;-1:-1:-1;26287:282:0;;;;;:::i;:::-;;:::i;68702:95::-;;;;;;;;;;;;;:::i;70322:294::-;;;;;;;;;;-1:-1:-1;70322:294:0;;;;;:::i;:::-;;:::i;71121:312::-;;;;;;;;;;-1:-1:-1;71121:312:0;;;;;:::i;:::-;;:::i;25782:152::-;;;;;;;;;;;;;:::i;31810:161::-;;;;;;;;;;-1:-1:-1;31810:161:0;;;;;:::i;:::-;;:::i;58992:403::-;;;;;;;;;;-1:-1:-1;58992:403:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;49061:285::-;;;;;;;;;;-1:-1:-1;49061:285:0;;;;;:::i;:::-;;:::i;66014:38::-;;;;;;;;;;;;;:::i;70624:457::-;;;;;;;;;;-1:-1:-1;70624:457:0;;;;;:::i;:::-;;:::i;31356:186::-;;;;;;;;;;-1:-1:-1;31356:186:0;;;;;:::i;:::-;;:::i;65840:30::-;;;;;;;;;;;;;;;;23802;;;;;;;;;;;;;;;;69882:316;;;;;;;;;;-1:-1:-1;69882:316:0;;;;;:::i;:::-;;:::i;23839:31::-;;;;;;;;;;;;;;;;48234:164;;;;;;;;;;-1:-1:-1;48234:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;48355:25:0;;;48331:4;48355:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;48234:164;69744:130;;;;;;;;;;-1:-1:-1;69744:130:0;;;;;:::i;:::-;;:::i;18728:201::-;;;;;;;;;;-1:-1:-1;18728:201:0;;;;;:::i;:::-;;:::i;31558:142::-;;;;;;;;;;-1:-1:-1;31558:142:0;;;;;:::i;:::-;;:::i;25538:236::-;;;;;;;;;;;;;:::i;69304:261::-;69435:4;69464:38;69490:11;69464:25;:38::i;:::-;:93;;;;69519:38;69545:11;69519:25;:38::i;:::-;69457:100;69304:261;-1:-1:-1;;69304:261:0:o;68457:237::-;16658:10;18039:7;:5;:7::i;:::-;-1:-1:-1;;;;;18039:23:0;;18031:68;;;;-1:-1:-1;;;18031:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;68584:22:0;::::1;68576:55;;;;-1:-1:-1::0;;;68576:55:0::1;;;;;;;:::i;:::-;68642:44;68661:8;68671:14;68642:18;:44::i;:::-;68457:237:::0;;:::o;72641:223::-;72753:6;72748:109;72765:9;:16;72761:1;:20;72748:109;;;72803:42;72820:5;72827:3;72832:9;72842:1;72832:12;;;;;;;;:::i;:::-;;;;;;;72803:16;:42::i;:::-;72783:3;;;;:::i;:::-;;;;72748:109;;;;72641:223;;;:::o;26616:348::-;33588:7;:5;:7::i;:::-;-1:-1:-1;;;;;33572:23:0;16658:10;-1:-1:-1;;;;;33572:23:0;;:52;;;-1:-1:-1;33615:9:0;;-1:-1:-1;;;;;33615:9:0;16658:10;-1:-1:-1;;;;;33599:25:0;;33572:52;33563:92;;;;-1:-1:-1;;;33563:92:0;;;;;;;:::i;:::-;26743:12:::1;:32:::0;::::1;::::0;::::1;;;26742:33;26734:68;;;::::0;-1:-1:-1;;;26734:68:0;;18303:2:1;26734:68:0::1;::::0;::::1;18285:21:1::0;18342:2;18322:18;;;18315:30;-1:-1:-1;;;18361:18:1;;;18354:52;18423:18;;26734:68:0::1;18101:346:1::0;26734:68:0::1;26813:29:::0;:37;;;;26861:33;:42;26914:33;:42;26616:348::o;46162:100::-;46216:13;46249:5;46242:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46162:100;:::o;47717:219::-;47793:7;50902:21;;;:12;:21;;;;;:27;-1:-1:-1;;;;;50902:27:0;47813:73;;;;-1:-1:-1;;;47813:73:0;;19039:2:1;47813:73:0;;;19021:21:1;19078:2;19058:18;;;19051:30;19117:34;19097:18;;;19090:62;-1:-1:-1;;;19168:18:1;;;19161:42;19220:19;;47813:73:0;18837:408:1;47813:73:0;-1:-1:-1;47904:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;47904:24:0;;47717:219::o;47243:408::-;47324:13;47340:24;47356:7;47340:15;:24::i;:::-;47324:40;;47389:5;-1:-1:-1;;;;;47383:11:0;:2;-1:-1:-1;;;;;47383:11:0;;;47375:57;;;;-1:-1:-1;;;47375:57:0;;19452:2:1;47375:57:0;;;19434:21:1;19491:2;19471:18;;;19464:30;19530:34;19510:18;;;19503:62;-1:-1:-1;;;19581:18:1;;;19574:31;19622:19;;47375:57:0;19250:397:1;47375:57:0;16658:10;-1:-1:-1;;;;;47465:21:0;;;;:62;;-1:-1:-1;47490:37:0;47507:5;16658:10;48234:164;:::i;47490:37::-;47443:168;;;;-1:-1:-1;;;47443:168:0;;19854:2:1;47443:168:0;;;19836:21:1;19893:2;19873:18;;;19866:30;19932:34;19912:18;;;19905:62;20003:26;19983:18;;;19976:54;20047:19;;47443:168:0;19652:420:1;47443:168:0;47622:21;47631:2;47635:7;47622:8;:21::i;:::-;47313:338;47243:408;;:::o;29437:1076::-;29628:12;:32;;;;;;29620:66;;;;-1:-1:-1;;;29620:66:0;;20279:2:1;29620:66:0;;;20261:21:1;20318:2;20298:18;;;20291:30;-1:-1:-1;;;20337:18:1;;;20330:52;20399:18;;29620:66:0;20077:346:1;29620:66:0;29760:81;;;;;;;20770:19:1;;;29796:4:0;20877:2:1;20873:15;;;-1:-1:-1;;20869:24:1;;;20855:12;;;20848:46;-1:-1:-1;;;20910:12:1;;;20903:25;16658:10:0;20962:15:1;;;;20958:24;20944:12;;;20937:46;20999:12;;;20992:28;;;21036:13;;;;21029:29;;;29760:81:0;;;;;;;;;;21074:13:1;;;;29760:81:0;;;29750:92;;;;;29885:12;;29869:28;;29861:66;;;;-1:-1:-1;;;29861:66:0;;;;;;;:::i;:::-;29946:44;29965:5;;29946:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29972:11:0;;;-1:-1:-1;29985:4:0;;-1:-1:-1;29946:18:0;:44::i;:::-;29938:78;;;;-1:-1:-1;;;29938:78:0;;21655:2:1;29938:78:0;;;21637:21:1;21694:2;21674:18;;;21667:30;-1:-1:-1;;;21713:18:1;;;21706:52;21775:18;;29938:78:0;21453:346:1;29938:78:0;30043:22;;;;:11;:22;;;;;;30078:13;;30043:31;;30068:6;;30043:31;:::i;:::-;:48;;30035:91;;;;-1:-1:-1;;;30035:91:0;;22139:2:1;30035:91:0;;;22121:21:1;22178:2;22158:18;;;22151:30;22217:33;22197:18;;;22190:61;22268:18;;30035:91:0;21937:355:1;30035:91:0;30186:1;30177:6;:10;30169:36;;;;-1:-1:-1;;;30169:36:0;;;;;;;:::i;:::-;30257:9;30232:21;30247:6;30232:12;:21;:::i;:::-;:34;;30224:64;;;;-1:-1:-1;;;30224:64:0;;;;;;;:::i;:::-;30309:19;30317:2;30321:6;30309:7;:19::i;:::-;30349:22;;;;:11;:22;;;;;:32;;30375:6;;30349:22;:32;;30375:6;;30349:32;:::i;:::-;;;;;;;;30423:6;30400:19;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;30453:45:0;;;-1:-1:-1;;;;;23408:32:1;;23390:51;;23472:2;23457:18;;23450:34;;;23500:18;;;23493:34;;;30488:9:0;23558:2:1;23543:18;;23536:34;30453:45:0;;23377:3:1;23362:19;30453:45:0;;;;;;;29607:906;;29437:1076;;;;;;:::o;24773:186::-;16658:10;18039:7;:5;:7::i;:::-;-1:-1:-1;;;;;18039:23:0;;18031:68;;;;-1:-1:-1;;;18031:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24863:26:0;::::1;24855:59;;;;-1:-1:-1::0;;;24855:59:0::1;;;;;;;:::i;:::-;24925:11;:26:::0;;-1:-1:-1;;;;;;24925:26:0::1;-1:-1:-1::0;;;;;24925:26:0;;;::::1;::::0;;;::::1;::::0;;24773:186::o;48465:303::-;48626:41;16658:10;48659:7;48626:18;:41::i;:::-;48618:103;;;;-1:-1:-1;;;48618:103:0;;;;;;;:::i;:::-;48732:28;48742:4;48748:2;48752:7;48732:9;:28::i;72151:250::-;72283:6;72278:116;72295:9;:16;72291:1;:20;72278:116;;;72333:49;72350:5;72357:3;72362:9;72372:1;72362:12;;;;;;;;:::i;:::-;;;;;;;72376:5;72333:16;:49::i;:::-;72313:3;;;;:::i;:::-;;;;72278:116;;;;72151:250;;;;:::o;62638:494::-;62782:7;62845:27;;;:17;:27;;;;;;;;62816:56;;;;;;;;;-1:-1:-1;;;;;62816:56:0;;;;;-1:-1:-1;;;62816:56:0;;;-1:-1:-1;;;;;62816:56:0;;;;;;;;62782:7;;62885:92;;-1:-1:-1;62936:29:0;;;;;;;;;62946:19;62936:29;-1:-1:-1;;;;;62936:29:0;;;;-1:-1:-1;;;62936:29:0;;-1:-1:-1;;;;;62936:29:0;;;;;62885:92;63027:23;;;;62989:21;;63498:5;;63014:36;;-1:-1:-1;;;;;63014:36:0;:10;:36;:::i;:::-;63013:58;;;;:::i;:::-;63092:16;;;-1:-1:-1;62989:82:0;;-1:-1:-1;;62638:494:0;;;;;;:::o;27272:712::-;27342:12;:31;;;27334:64;;;;-1:-1:-1;;;27334:64:0;;24458:2:1;27334:64:0;;;24440:21:1;24497:2;24477:18;;;24470:30;-1:-1:-1;;;24516:18:1;;;24509:51;24577:18;;27334:64:0;24256:345:1;27334:64:0;27426:1;27417:6;:10;27409:36;;;;-1:-1:-1;;;27409:36:0;;;;;;;:::i;:::-;27474:32;;27464:42;;;27456:84;;;;-1:-1:-1;;;27456:84:0;;;;;;;:::i;:::-;27654:12;:27;;;27644:6;27623:18;;27604:16;;27586:15;;27567:16;;:34;;;;:::i;:::-;:53;;;;:::i;:::-;:74;;;;:::i;:::-;:83;;;;:::i;:::-;:114;;27559:147;;;;-1:-1:-1;;;27559:147:0;;25167:2:1;27559:147:0;;;25149:21:1;25206:2;25186:18;;;25179:30;-1:-1:-1;;;25225:18:1;;;25218:51;25286:18;;27559:147:0;24965:345:1;27559:147:0;27725:28;;27766:9;;27725:37;;27756:6;;27725:37;:::i;:::-;:50;;27717:80;;;;-1:-1:-1;;;27717:80:0;;;;;;;:::i;:::-;16658:10;27856:19;16658:10;27868:6;27856:7;:19::i;:::-;27913:6;27894:15;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;;27943:33:0;;;-1:-1:-1;;;;;25535:32:1;;25517:51;;25599:2;25584:18;;25577:34;;;27966:9:0;25627:18:1;;;25620:34;27943:33:0;;;;;;;25505:2:1;27943:33:0;;;27323:661;27272:712;:::o;31203:141::-;16658:10;18039:7;:5;:7::i;:::-;-1:-1:-1;;;;;18039:23:0;;18031:68;;;;-1:-1:-1;;;18031:68:0;;;;;;;:::i;:::-;31314:11:::1;::::0;31288:48:::1;::::0;-1:-1:-1;;;;;31314:11:0::1;31328:7:::0;31288:17:::1;:48::i;:::-;31203:141:::0;:::o;58745:239::-;58833:7;58869:24;58887:5;58869:17;:24::i;:::-;58861:5;:32;58853:70;;;;-1:-1:-1;;;58853:70:0;;25867:2:1;58853:70:0;;;25849:21:1;25906:2;25886:18;;;25879:30;25945:27;25925:18;;;25918:55;25990:18;;58853:70:0;25665:349:1;58853:70:0;-1:-1:-1;;;;;58949:19:0;;;;;;:12;:19;;;;;:26;;58969:5;;58949:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;58745:239;-1:-1:-1;;;58745:239:0:o;69616:120::-;16658:10;18039:7;:5;:7::i;:::-;-1:-1:-1;;;;;18039:23:0;;18031:68;;;;-1:-1:-1;;;18031:68:0;;;;;;;:::i;:::-;69715:13:::1;:7;69725:3:::0;;69715:13:::1;:::i;31017:174::-:0;16658:10;18039:7;:5;:7::i;:::-;-1:-1:-1;;;;;18039:23:0;;18031:68;;;;-1:-1:-1;;;18031:68:0;;;;;;;:::i;:::-;31160:11:::1;::::0;31094:21:::1;::::0;31134:49:::1;::::0;-1:-1:-1;;;;;31160:11:0::1;31094:21:::0;31134:17:::1;:49::i;27992:1437::-:0;28174:12;:32;;;;;;28166:66;;;;-1:-1:-1;;;28166:66:0;;26221:2:1;28166:66:0;;;26203:21:1;26260:2;26240:18;;;26233:30;-1:-1:-1;;;26279:18:1;;;26272:52;26341:18;;28166:66:0;26019:346:1;28166:66:0;28306:75;;;;;;;26684:19:1;;;28346:4:0;26791:2:1;26787:15;;;-1:-1:-1;;26783:24:1;;;26769:12;;;26762:46;-1:-1:-1;;;26824:12:1;;;26817:25;16658:10:0;26876:15:1;;;;26872:24;26858:12;;;26851:46;26913:12;;;;26906:28;;;28306:75:0;;;;;;;;;;26950:13:1;;;;28306:75:0;;;28296:86;;;;;28417:12;;28401:28;;28393:66;;;;-1:-1:-1;;;28393:66:0;;;;;;;:::i;:::-;28478:44;28497:5;;28478:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28504:11:0;;;-1:-1:-1;28517:4:0;;-1:-1:-1;28478:18:0;:44::i;:::-;28470:82;;;;-1:-1:-1;;;28470:82:0;;;;;;;:::i;:::-;28571:26;;;;:11;:26;;;;;;:31;28563:68;;;;-1:-1:-1;;;28563:68:0;;27176:2:1;28563:68:0;;;27158:21:1;27215:2;27195:18;;;27188:30;27254:26;27234:18;;;27227:54;27298:18;;28563:68:0;26974:348:1;28563:68:0;28662:22;28658:310;;28731:33;;28721:43;;;28713:85;;;;-1:-1:-1;;;28713:85:0;;;;;;;:::i;:::-;28658:310;;;28877:17;28867:6;:27;;28859:69;;;;-1:-1:-1;;;28859:69:0;;;;;;;:::i;:::-;28995:1;28986:6;:10;28978:36;;;;-1:-1:-1;;;28978:36:0;;;;;;;:::i;:::-;29062:33;;29033:16;;:25;;29052:6;;29033:25;:::i;:::-;:62;;29025:101;;;;-1:-1:-1;;;29025:101:0;;27529:2:1;29025:101:0;;;27511:21:1;27568:2;27548:18;;;27541:30;27607:29;27587:18;;;27580:57;27654:18;;29025:101:0;27327:351:1;29025:101:0;29145:29;;29187:9;;29145:38;;29177:6;;29145:38;:::i;:::-;:51;;29137:81;;;;-1:-1:-1;;;29137:81:0;;;;;;;:::i;:::-;29231:19;29239:2;29243:6;29231:7;:19::i;:::-;29279:26;;;;:11;:26;;;;;:35;;;29325:16;:26;;29308:6;;29279:26;29325;;29308:6;;29325:26;:::i;:::-;;;;-1:-1:-1;;29369:49:0;;;-1:-1:-1;;;;;23408:32:1;;23390:51;;23472:2;23457:18;;23450:34;;;23500:18;;;23493:34;;;29408:9:0;23558:2:1;23543:18;;23536:34;29369:49:0;;23377:3:1;23362:19;29369:49:0;;;;;;;28153:1276;;27992:1437;;;;;:::o;26112:128::-;33588:7;:5;:7::i;:::-;-1:-1:-1;;;;;33572:23:0;16658:10;-1:-1:-1;;;;;33572:23:0;;:52;;;-1:-1:-1;33615:9:0;;-1:-1:-1;;;;;33615:9:0;16658:10;-1:-1:-1;;;;;33599:25:0;;33572:52;33563:92;;;;-1:-1:-1;;;33563:92:0;;;;;;;:::i;:::-;26196:27;:36;26112:128::o;68876:67::-;16658:10;18039:7;:5;:7::i;:::-;-1:-1:-1;;;;;18039:23:0;;18031:68;;;;-1:-1:-1;;;18031:68:0;;;;;;;:::i;:::-;68925:10:::1;:8;:10::i;:::-;68876:67::o:0;48839:151::-;48943:39;48960:4;48966:2;48970:7;48943:39;;;;;;;;;;;;:16;:39::i;24608:118::-;16658:10;18039:7;:5;:7::i;:::-;-1:-1:-1;;;;;18039:23:0;;18031:68;;;;-1:-1:-1;;;18031:68:0;;;;;;;:::i;:::-;24697:21;;:12:::1;:21:::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;24697:21:0;;;;::::1;;-1:-1:-1::0;;24697:21:0;;;;;::::1;::::0;::::1;;::::0;::::1;;-1:-1:-1::0;;24697:21:0::1;::::0;;::::1;;::::0;;;::::1;;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;24608:118::o;27019:245::-;33588:7;:5;:7::i;:::-;-1:-1:-1;;;;;33572:23:0;16658:10;-1:-1:-1;;;;;33572:23:0;;:52;;;-1:-1:-1;33615:9:0;;-1:-1:-1;;;;;33615:9:0;16658:10;-1:-1:-1;;;;;33599:25:0;;33572:52;33563:92;;;;-1:-1:-1;;;33563:92:0;;;;;;;:::i;:::-;27150:11:::1;:24:::0;;;;27185:12:::1;:26:::0;27222:18:::1;:34:::0;27019:245::o;59655:207::-;59722:7;59758:21;59553:10;:17;;59473:105;59758:21;59750:5;:29;59742:68;;;;-1:-1:-1;;;59742:68:0;;27885:2:1;59742:68:0;;;27867:21:1;27924:2;27904:18;;;27897:30;27963:28;27943:18;;;27936:56;28009:18;;59742:68:0;27683:350:1;59742:68:0;59836:10;59847:5;59836:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59655:207:0:o;45845:250::-;45917:7;45953:21;;;:12;:21;;;;;:27;-1:-1:-1;;;;;45953:27:0;45999:19;45991:73;;;;-1:-1:-1;;;45991:73:0;;28240:2:1;45991:73:0;;;28222:21:1;28279:2;28259:18;;;28252:30;28318:34;28298:18;;;28291:62;-1:-1:-1;;;28369:18:1;;;28362:39;28418:19;;45991:73:0;28038:405:1;67894:555:0;16658:10;18039:7;:5;:7::i;:::-;-1:-1:-1;;;;;18039:23:0;;18031:68;;;;-1:-1:-1;;;18031:68:0;;;;;;;:::i;:::-;67955:16:::1;::::0;:21;67947:46:::1;;;::::0;-1:-1:-1;;;67947:46:0;;28650:2:1;67947:46:0::1;::::0;::::1;28632:21:1::0;28689:2;28669:18;;;28662:30;-1:-1:-1;;;28708:18:1;;;28701:42;28760:18;;67947:46:0::1;28448:336:1::0;67947:46:0::1;68004:80;68017:42;68062:2;68004:80;;;;;;;;;;;;;-1:-1:-1::0;;;68004:80:0::1;;::::0;:12:::1;:80::i;:::-;68116:76;68129:42;68174:2;68116:76;;;;;;;;;;;;;-1:-1:-1::0;;;68116:76:0::1;;::::0;:12:::1;:76::i;:::-;68228:77;68241:42;68286:2;68228:77;;;;;;;;;;;;;-1:-1:-1::0;;;68228:77:0::1;;::::0;:12:::1;:77::i;:::-;68340;68353:42;68397:3;68340:77;;;;;;;;;;;;;-1:-1:-1::0;;;68340:77:0::1;;::::0;:12:::1;:77::i;65883:21::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45565:218::-;45637:7;-1:-1:-1;;;;;45665:19:0;;45657:74;;;;-1:-1:-1;;;45657:74:0;;28991:2:1;45657:74:0;;;28973:21:1;29030:2;29010:18;;;29003:30;29069:34;29049:18;;;29042:62;-1:-1:-1;;;29120:18:1;;;29113:40;29170:19;;45657:74:0;28789:406:1;45657:74:0;-1:-1:-1;;;;;;45749:19:0;;;;;:12;:19;;;;;:26;;45565:218::o;18470:103::-;16658:10;18039:7;:5;:7::i;:::-;-1:-1:-1;;;;;18039:23:0;;18031:68;;;;-1:-1:-1;;;18031:68:0;;;;;;;:::i;:::-;18535:30:::1;18562:1;18535:18;:30::i;65911:88::-:0;;;;;;;:::i;25299:231::-;33588:7;:5;:7::i;:::-;-1:-1:-1;;;;;33572:23:0;16658:10;-1:-1:-1;;;;;33572:23:0;;:52;;;-1:-1:-1;33615:9:0;;-1:-1:-1;;;;;33615:9:0;16658:10;-1:-1:-1;;;;;33599:25:0;;33572:52;33563:92;;;;-1:-1:-1;;;33563:92:0;;;;;;;:::i;:::-;25383:28;;25374:71:::1;;;::::0;-1:-1:-1;;;25374:71:0;;29402:2:1;25374:71:0::1;::::0;::::1;29384:21:1::0;29441:2;29421:18;;;29414:30;29480:27;29460:18;;;29453:55;29525:18;;25374:71:0::1;29200:349:1::0;25374:71:0::1;25491:12;:31:::0;;-1:-1:-1;;25456:66:0;::::1;25491:31;::::0;;::::1;25490:32;25456:66;::::0;;25299:231::o;68805:63::-;16658:10;18039:7;:5;:7::i;:::-;-1:-1:-1;;;;;18039:23:0;;18031:68;;;;-1:-1:-1;;;18031:68:0;;;;;;;:::i;:::-;68852:8:::1;:6;:8::i;17819:87::-:0;17892:6;;;;;-1:-1:-1;;;;;17892:6:0;;17819:87::o;25942:135::-;25986:7;26050:19;;26031:16;;26013:15;;:34;;;;:::i;:::-;:56;;;;:::i;:::-;26006:63;;25942:135;:::o;46331:104::-;46387:13;46420:7;46413:14;;;;;:::i;48008:155::-;48103:52;16658:10;48136:8;48146;48103:18;:52::i;26287:282::-;33588:7;:5;:7::i;:::-;-1:-1:-1;;;;;33572:23:0;16658:10;-1:-1:-1;;;;;33572:23:0;;:52;;;-1:-1:-1;33615:9:0;;-1:-1:-1;;;;;33615:9:0;16658:10;-1:-1:-1;;;;;33599:25:0;;33572:52;33563:92;;;;-1:-1:-1;;;33563:92:0;;;;;;;:::i;:::-;26397:12:::1;:31:::0;::::1;;26396:32;26388:66;;;::::0;-1:-1:-1;;;26388:66:0;;29756:2:1;26388:66:0::1;::::0;::::1;29738:21:1::0;29795:2;29775:18;;;29768:30;-1:-1:-1;;;29814:18:1;;;29807:51;29875:18;;26388:66:0::1;29554:345:1::0;26388:66:0::1;26465:28:::0;:36;;;;26512:32;:41;26287:282::o;68702:95::-;16658:10;18039:7;:5;:7::i;:::-;-1:-1:-1;;;;;18039:23:0;;18031:68;;;;-1:-1:-1;;;18031:68:0;;;;;;;:::i;:::-;68774:8:::1;:15:::0;;-1:-1:-1;;68774:15:0::1;68785:4;68774:15;::::0;;68702:95::o;70322:294::-;70382:13;70408:28;70439:10;:8;:10::i;:::-;70408:41;;70498:1;70473:14;70467:28;:32;:141;;;;;;;;;;;;;;;;;70539:14;70555:18;:7;:16;:18::i;:::-;70575:13;70522:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70467:141;70460:148;70322:294;-1:-1:-1;;;70322:294:0:o;71121:312::-;16658:10;18039:7;:5;:7::i;:::-;-1:-1:-1;;;;;18039:23:0;;18031:68;;;;-1:-1:-1;;;18031:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;71222:20:0;::::1;::::0;71218:174:::1;;71267:56;::::0;-1:-1:-1;;;71267:56:0;;-1:-1:-1;;;71267:56:0::1;::::0;::::1;31706:52:1::0;-1:-1:-1;;;;;71267:32:0;::::1;::::0;::::1;::::0;31679:18:1;;71267:56:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71259:105;;;::::0;-1:-1:-1;;;71259:105:0;;32221:2:1;71259:105:0::1;::::0;::::1;32203:21:1::0;32260:2;32240:18;;;32233:30;32299:34;32279:18;;;32272:62;-1:-1:-1;;;32350:18:1;;;32343:34;32394:19;;71259:105:0::1;32019:400:1::0;71259:105:0::1;71402:14;:23:::0;;-1:-1:-1;;;;;;71402:23:0::1;-1:-1:-1::0;;;;;71402:23:0;;;::::1;::::0;;;::::1;::::0;;71121:312::o;25782:152::-;33588:7;:5;:7::i;:::-;-1:-1:-1;;;;;33572:23:0;16658:10;-1:-1:-1;;;;;33572:23:0;;:52;;;-1:-1:-1;33615:9:0;;-1:-1:-1;;;;;33615:9:0;16658:10;-1:-1:-1;;;;;33599:25:0;;33572:52;33563:92;;;;-1:-1:-1;;;33563:92:0;;;;;;;:::i;:::-;25894:12:::1;:32:::0;;-1:-1:-1;;25858:68:0;::::1;25894:32:::0;;;;::::1;;;25893:33;25858:68:::0;;::::1;;::::0;;25782:152::o;31810:161::-;16658:10;18039:7;:5;:7::i;:::-;-1:-1:-1;;;;;18039:23:0;;18031:68;;;;-1:-1:-1;;;18031:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31885:22:0;::::1;31877:55;;;;-1:-1:-1::0;;;31877:55:0::1;;;;;;;:::i;:::-;31943:9;:20:::0;;-1:-1:-1;;;;;;31943:20:0::1;-1:-1:-1::0;;;;;31943:20:0;;;::::1;::::0;;;::::1;::::0;;31810:161::o;58992:403::-;59047:16;59084:15;59102:16;59112:5;59102:9;:16::i;:::-;59084:34;;59129:23;59169:7;-1:-1:-1;;;;;59155:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59155:22:0;-1:-1:-1;;;;;;59219:19:0;;59188:28;59219:19;;;:12;:19;;;;;59129:48;;-1:-1:-1;59251:96:0;59271:7;59267:1;:11;59251:96;;;59320:11;59332:1;59320:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;59312:23;;59300:6;59307:1;59300:9;;;;;;;;:::i;:::-;;;;;;;;;;:35;59280:3;;;;:::i;:::-;;;;59251:96;;;-1:-1:-1;59381:6:0;;58992:403;-1:-1:-1;;;;58992:403:0:o;49061:285::-;49193:41;16658:10;49226:7;49193:18;:41::i;:::-;49185:103;;;;-1:-1:-1;;;49185:103:0;;;;;;;:::i;:::-;49299:39;49313:4;49319:2;49323:7;49332:5;49299:13;:39::i;66014:38::-;;;;;;;:::i;70624:457::-;50878:4;50902:21;;;:12;:21;;;;;:27;70697:13;;-1:-1:-1;;;;;50902:27:0;70723:75;;;;-1:-1:-1;;;70723:75:0;;32626:2:1;70723:75:0;;;32608:21:1;32665:2;32645:18;;;32638:30;32704:34;32684:18;;;32677:62;-1:-1:-1;;;32755:18:1;;;32748:45;32810:19;;70723:75:0;32424:411:1;70723:75:0;70813:8;;;;70809:265;;70854:14;70847:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70624:457;;;:::o;70809:265::-;70890:16;;;;;-1:-1:-1;;;;;70890:16:0;:30;70886:188;;70966:16;;70956:45;;-1:-1:-1;;;70956:45:0;;;;;834:25:1;;;70966:16:0;;;;-1:-1:-1;;;;;70966:16:0;;70956:36;;807:18:1;;70956:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;70956:45:0;;;;;;;;;;;;:::i;70886:188::-;71041:21;71054:7;71041:12;:21::i;70886:188::-;70624:457;;;:::o;31356:186::-;16658:10;18039:7;:5;:7::i;:::-;-1:-1:-1;;;;;18039:23:0;;18031:68;;;;-1:-1:-1;;;18031:68:0;;;;;;;:::i;:::-;31449:30:::1;::::0;-1:-1:-1;;;31449:30:0;;31473:4:::1;31449:30;::::0;::::1;4864:51:1::0;31431:15:0::1;::::0;-1:-1:-1;;;;;31449:15:0;::::1;::::0;::::1;::::0;4837:18:1;;31449:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31505:11;::::0;31490:36:::1;::::0;-1:-1:-1;;;31490:36:0;;-1:-1:-1;;;;;31505:11:0;;::::1;31490:36;::::0;::::1;8989:51:1::0;9056:18;;;9049:34;;;31431:48:0;;-1:-1:-1;31490:14:0;::::1;::::0;::::1;::::0;8962:18:1;;31490:36:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;69882:316::-:0;16658:10;18039:7;:5;:7::i;:::-;-1:-1:-1;;;;;18039:23:0;;18031:68;;;;-1:-1:-1;;;18031:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;69989:22:0;::::1;::::0;69985:168:::1;;70036:53;::::0;-1:-1:-1;;;70036:53:0;;-1:-1:-1;;;70036:53:0::1;::::0;::::1;31706:52:1::0;-1:-1:-1;;;;;70036:34:0;::::1;::::0;::::1;::::0;31679:18:1;;70036:53:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70028:97;;;::::0;-1:-1:-1;;;70028:97:0;;33871:2:1;70028:97:0::1;::::0;::::1;33853:21:1::0;33910:2;33890:18;;;33883:30;33949:33;33929:18;;;33922:61;34000:18;;70028:97:0::1;33669:355:1::0;70028:97:0::1;70163:16;:27:::0;;-1:-1:-1;;;;;70163:27:0;;::::1;;;-1:-1:-1::0;;;;;;70163:27:0;;::::1;::::0;;;::::1;::::0;;69882:316::o;69744:130::-;16658:10;18039:7;:5;:7::i;:::-;-1:-1:-1;;;;;18039:23:0;;18031:68;;;;-1:-1:-1;;;18031:68:0;;;;;;;:::i;:::-;69846:20:::1;:14;69863:3:::0;;69846:20:::1;:::i;18728:201::-:0;16658:10;18039:7;:5;:7::i;:::-;-1:-1:-1;;;;;18039:23:0;;18031:68;;;;-1:-1:-1;;;18031:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18817:22:0;::::1;18809:73;;;::::0;-1:-1:-1;;;18809:73:0;;34231:2:1;18809:73:0::1;::::0;::::1;34213:21:1::0;34270:2;34250:18;;;34243:30;34309:34;34289:18;;;34282:62;-1:-1:-1;;;34360:18:1;;;34353:36;34406:19;;18809:73:0::1;34029:402:1::0;18809:73:0::1;18893:28;18912:8;18893:18;:28::i;31558:142::-:0;16658:10;18039:7;:5;:7::i;:::-;-1:-1:-1;;;;;18039:23:0;;18031:68;;;;-1:-1:-1;;;18031:68:0;;;;;;;:::i;:::-;31664:11:::1;::::0;31649:35:::1;::::0;-1:-1:-1;;;31649:35:0;;-1:-1:-1;;;;;31664:11:0;;::::1;31649:35;::::0;::::1;8989:51:1::0;9056:18;;;9049:34;;;31649:14:0;;::::1;::::0;::::1;::::0;8962:18:1;;31649:35:0::1;8815:274:1::0;25538:236:0;33588:7;:5;:7::i;:::-;-1:-1:-1;;;;;33572:23:0;16658:10;-1:-1:-1;;;;;33572:23:0;;:52;;;-1:-1:-1;33615:9:0;;-1:-1:-1;;;;;33615:9:0;16658:10;-1:-1:-1;;;;;33599:25:0;;33572:52;33563:92;;;;-1:-1:-1;;;33563:92:0;;;;;;;:::i;:::-;25623:29;;25614:73:::1;;;::::0;-1:-1:-1;;;25614:73:0;;34638:2:1;25614:73:0::1;::::0;::::1;34620:21:1::0;34677:2;34657:18;;;34650:30;34716:28;34696:18;;;34689:56;34762:18;;25614:73:0::1;34436:350:1::0;25614:73:0::1;25734:12;:32:::0;;-1:-1:-1;;25698:68:0;::::1;25734:32;::::0;;;::::1;;;25733:33;25698:68:::0;;::::1;;::::0;;25538:236::o;45128:373::-;45230:4;-1:-1:-1;;;;;;45267:40:0;;-1:-1:-1;;;45267:40:0;;:105;;-1:-1:-1;;;;;;;45324:48:0;;-1:-1:-1;;;45324:48:0;45267:105;:172;;;-1:-1:-1;;;;;;;45389:50:0;;-1:-1:-1;;;45389:50:0;45267:172;:226;;;-1:-1:-1;;;;;;;;;;42265:40:0;;;45457:36;42156:157;62368:215;62470:4;-1:-1:-1;;;;;;62494:41:0;;-1:-1:-1;;;62494:41:0;;:81;;;62539:36;62563:11;62539:23;:36::i;63782:332::-;63498:5;-1:-1:-1;;;;;63885:33:0;;;;63877:88;;;;-1:-1:-1;;;63877:88:0;;34993:2:1;63877:88:0;;;34975:21:1;35032:2;35012:18;;;35005:30;35071:34;35051:18;;;35044:62;-1:-1:-1;;;35122:18:1;;;35115:40;35172:19;;63877:88:0;34791:406:1;63877:88:0;-1:-1:-1;;;;;63984:22:0;;63976:60;;;;-1:-1:-1;;;63976:60:0;;35404:2:1;63976:60:0;;;35386:21:1;35443:2;35423:18;;;35416:30;35482:27;35462:18;;;35455:55;35527:18;;63976:60:0;35202:349:1;63976:60:0;64071:35;;;;;;;;;-1:-1:-1;;;;;64071:35:0;;;;;;-1:-1:-1;;;;;64071:35:0;;;;;;;;;;-1:-1:-1;;;64049:57:0;;;;:19;:57;63782:332::o;56743:175::-;56818:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;56818:29:0;-1:-1:-1;;;;;56818:29:0;;;;;;;;:24;;56872;56818;56872:15;:24::i;:::-;-1:-1:-1;;;;;56863:47:0;;;;;;;;;;;56743:175;;:::o;5602:818::-;5693:4;5733;5693;5748:551;5772:5;:12;5768:1;:16;5748:551;;;5806:20;5829:5;5835:1;5829:8;;;;;;;;:::i;:::-;;;;;;;5806:31;;5872:12;5856;:28;5852:436;;6026:12;:1;:10;:12::i;:::-;6040;6054;6009:58;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5999:69;;;;;;5984:84;;5852:436;;;6230:12;:1;:10;:12::i;:::-;6244;6258;6213:58;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6203:69;;;;;;6188:84;;5852:436;-1:-1:-1;5786:3:0;;;;:::i;:::-;;;;5748:551;;;-1:-1:-1;6392:20:0;;;;5602:818;-1:-1:-1;;;5602:818:0:o;68955:341::-;69168:9;;69158:6;69142:13;59553:10;:17;;59473:105;69142:13;:22;;;;:::i;:::-;:35;;69134:71;;;;-1:-1:-1;;;69134:71:0;;36202:2:1;69134:71:0;;;36184:21:1;36241:2;36221:18;;;36214:30;36280:25;36260:18;;;36253:53;36323:18;;69134:71:0;36000:347:1;69134:71:0;69221:9;69216:73;69236:6;69232:1;:10;69216:73;;;69264:13;69274:2;69264:9;:13::i;:::-;69244:3;;;;:::i;:::-;;;;69216:73;;51118:349;51211:4;50902:21;;;:12;:21;;;;;:27;-1:-1:-1;;;;;50902:27:0;51228:73;;;;-1:-1:-1;;;51228:73:0;;36554:2:1;51228:73:0;;;36536:21:1;36593:2;36573:18;;;36566:30;36632:34;36612:18;;;36605:62;-1:-1:-1;;;36683:18:1;;;36676:42;36735:19;;51228:73:0;36352:408:1;51228:73:0;51312:13;51328:24;51344:7;51328:15;:24::i;:::-;51312:40;;51382:5;-1:-1:-1;;;;;51371:16:0;:7;-1:-1:-1;;;;;51371:16:0;;:52;;;-1:-1:-1;;;;;;48355:25:0;;;48331:4;48355:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;51391:32;51371:87;;;;51451:7;-1:-1:-1;;;;;51427:31:0;:20;51439:7;51427:11;:20::i;:::-;-1:-1:-1;;;;;51427:31:0;;51371:87;51363:96;51118:349;-1:-1:-1;;;;51118:349:0:o;55375:1250::-;55501:4;-1:-1:-1;;;;;55473:32:0;:24;55489:7;55473:15;:24::i;:::-;-1:-1:-1;;;;;55473:32:0;;55465:82;;;;-1:-1:-1;;;55465:82:0;;36967:2:1;55465:82:0;;;36949:21:1;37006:2;36986:18;;;36979:30;37045:34;37025:18;;;37018:62;-1:-1:-1;;;37096:18:1;;;37089:35;37141:19;;55465:82:0;36765:401:1;55465:82:0;-1:-1:-1;;;;;55566:16:0;;55558:65;;;;-1:-1:-1;;;55558:65:0;;37373:2:1;55558:65:0;;;37355:21:1;37412:2;37392:18;;;37385:30;37451:34;37431:18;;;37424:62;-1:-1:-1;;;37502:18:1;;;37495:34;37546:19;;55558:65:0;37171:400:1;55558:65:0;55636:39;55657:4;55663:2;55667:7;55636:20;:39::i;:::-;55740:29;55757:1;55761:7;55740:8;:29::i;:::-;55782:21;;;;:12;:21;;;;;;;;:32;;-1:-1:-1;;;;;;55782:32:0;-1:-1:-1;;;;;55782:32:0;;;;;;;;;;55933:18;;;;;:12;:18;;;;;55996:21;;;;;;;56120:20;;55933:18;;55782:21;;-1:-1:-1;;;56048:28:0;;;;;;55782:21;55933:18;;56120:24;;-1:-1:-1;;56120:24:0;:::i;:::-;56106:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;56087:58;;56184:9;56156:13;56170:10;56156:25;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:37;;:25;;;;;;:37;;;;;;;;;;;;;;;;;;;;;56204:23;;;;;:12;:23;;;;;;:53;;-1:-1:-1;;;;56204:53:0;-1:-1:-1;;;56204:53:0;;;;;;;;;;;;;56268:19;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56354:28;56385:12;:16;56398:2;-1:-1:-1;;;;;56385:16:0;-1:-1:-1;;;;;56385:16:0;;;;;;;;;;;;56354:47;;56450:11;:18;;;;56412:11;:28;;;:57;;;;;;;;;;;;;;;;;;56480:11;56504:7;56480:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56558:7;56554:2;-1:-1:-1;;;;;56539:27:0;56548:4;-1:-1:-1;;;;;56539:27:0;;;;;;;;;;;55454:1171;;;;;55375:1250;;;:::o;8925:317::-;9040:6;9015:21;:31;;9007:73;;;;-1:-1:-1;;;9007:73:0;;38040:2:1;9007:73:0;;;38022:21:1;38079:2;38059:18;;;38052:30;38118:31;38098:18;;;38091:59;38167:18;;9007:73:0;37838:353:1;9007:73:0;9094:12;9112:9;-1:-1:-1;;;;;9112:14:0;9134:6;9112:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9093:52;;;9164:7;9156:78;;;;-1:-1:-1;;;9156:78:0;;38608:2:1;9156:78:0;;;38590:21:1;38647:2;38627:18;;;38620:30;38686:34;38666:18;;;38659:62;38757:28;38737:18;;;38730:56;38803:19;;9156:78:0;38406:422:1;21445:120:0;20457:7;;;;20981:41;;;;-1:-1:-1;;;20981:41:0;;39035:2:1;20981:41:0;;;39017:21:1;39074:2;39054:18;;;39047:30;-1:-1:-1;;;39093:18:1;;;39086:50;39153:18;;20981:41:0;38833:344:1;20981:41:0;21504:7:::1;:15:::0;;-1:-1:-1;;21504:15:0::1;::::0;;21535:22:::1;16658:10:::0;21544:12:::1;21535:22;::::0;-1:-1:-1;;;;;4882:32:1;;;4864:51;;4852:2;4837:18;21535:22:0::1;;;;;;;21445:120::o:0;30521:203::-;30613:19;30621:2;30625:6;30613:7;:19::i;:::-;30663:6;30643:16;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;30685:31:0;;;;;;30697:2;;30701:6;;30709;;30685:31;:::i;:::-;;;;;;;;30521:203;;;:::o;19089:191::-;19182:6;;;-1:-1:-1;;;;;19199:17:0;;;19182:6;19199:17;;;-1:-1:-1;;;;;;19199:17:0;;;;;;19232:40;;19182:6;;;;;;;;19232:40;;19163:16;;19232:40;19152:128;19089:191;:::o;21186:118::-;20457:7;;;;20711:9;20703:38;;;;-1:-1:-1;;;20703:38:0;;39777:2:1;20703:38:0;;;39759:21:1;39816:2;39796:18;;;39789:30;-1:-1:-1;;;39835:18:1;;;39828:46;39891:18;;20703:38:0;39575:340:1;20703:38:0;21246:7:::1;:14:::0;;-1:-1:-1;;21246:14:0::1;21256:4;21246:14;::::0;;21276:20:::1;21283:12;16658:10:::0;;16578:98;57060:281;57181:8;-1:-1:-1;;;;;57172:17:0;:5;-1:-1:-1;;;;;57172:17:0;;;57164:55;;;;-1:-1:-1;;;57164:55:0;;40122:2:1;57164:55:0;;;40104:21:1;40161:2;40141:18;;;40134:30;40200:27;40180:18;;;40173:55;40245:18;;57164:55:0;39920:349:1;57164:55:0;-1:-1:-1;;;;;57230:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;57230:46:0;;;;;;;;;;57292:41;;636::1;;;57292::0;;609:18:1;57292:41:0;;;;;;;57060:281;;;:::o;70206:108::-;70266:13;70299:7;70292:14;;;;;:::i;3287:723::-;3343:13;3564:10;3560:53;;-1:-1:-1;;3591:10:0;;;;;;;;;;;;-1:-1:-1;;;3591:10:0;;;;;3287:723::o;3560:53::-;3638:5;3623:12;3679:78;3686:9;;3679:78;;3712:8;;;;:::i;:::-;;-1:-1:-1;3735:10:0;;-1:-1:-1;3743:2:0;3735:10;;:::i;:::-;;;3679:78;;;3767:19;3799:6;-1:-1:-1;;;;;3789:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3789:17:0;;3767:39;;3817:154;3824:10;;3817:154;;3851:11;3861:1;3851:11;;:::i;:::-;;-1:-1:-1;3920:10:0;3928:2;3920:5;:10;:::i;:::-;3907:24;;:2;:24;:::i;:::-;3894:39;;3877:6;3884;3877:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3877:56:0;;;;;;;;-1:-1:-1;3948:11:0;3957:2;3948:11;;:::i;:::-;;;3817:154;;50228:272;50342:28;50352:4;50358:2;50362:7;50342:9;:28::i;:::-;50389:48;50412:4;50418:2;50422:7;50431:5;50389:22;:48::i;:::-;50381:111;;;;-1:-1:-1;;;50381:111:0;;;;;;;:::i;51773:84::-;51832:17;51842:2;51832:17;;;;;;;;;;;;:9;:17::i;71441:374::-;20457:7;;;;71559:9;71551:40;;;;-1:-1:-1;;;71551:40:0;;41012:2:1;71551:40:0;;;40994:21:1;41051:2;41031:18;;;41024:30;-1:-1:-1;;;41070:18:1;;;41063:48;41128:18;;71551:40:0;40810:342:1;71551:40:0;71606:14;;-1:-1:-1;;;;;71606:14:0;:28;71602:142;;71675:14;;71660:53;;-1:-1:-1;;;71660:53:0;;;;;834:25:1;;;-1:-1:-1;;;;;71675:14:0;;;;71660:44;;807:18:1;;71660:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71659:54;71651:81;;;;-1:-1:-1;;;71651:81:0;;41359:2:1;71651:81:0;;;41341:21:1;41398:2;41378:18;;;41371:30;-1:-1:-1;;;41417:18:1;;;41410:45;41472:18;;71651:81:0;41157:339:1;57906:756:0;58018:4;-1:-1:-1;;;;;58039:13:0;;7959:19;:23;58035:620;;58075:72;;-1:-1:-1;;;58075:72:0;;-1:-1:-1;;;;;58075:36:0;;;;;:72;;16658:10;;58126:4;;58132:7;;58141:5;;58075:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58075:72:0;;;;;;;;-1:-1:-1;;58075:72:0;;;;;;;;;;;;:::i;:::-;;;58071:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58317:13:0;;58313:272;;58360:60;;-1:-1:-1;;;58360:60:0;;;;;;;:::i;58313:272::-;58535:6;58529:13;58520:6;58516:2;58512:15;58505:38;58071:529;-1:-1:-1;;;;;;58198:51:0;-1:-1:-1;;;58198:51:0;;-1:-1:-1;58191:58:0;;58035:620;-1:-1:-1;58639:4:0;57906:756;;;;;;:::o;52084:312::-;52189:13;;;;52214:9;52220:2;52214:5;:9::i;:::-;52256:54;52287:1;52291:2;52295:7;52304:5;52256:22;:54::i;:::-;52234:154;;;;-1:-1:-1;;;52234:154:0;;;;;;;:::i;52732:763::-;-1:-1:-1;;;;;52795:16:0;;52787:61;;;;-1:-1:-1;;;52787:61:0;;42451:2:1;52787:61:0;;;42433:21:1;;;42470:18;;;42463:30;42529:34;42509:18;;;42502:62;42581:18;;52787:61:0;42249:356:1;52787:61:0;52886:13;;;;52912:45;52869:14;52945:2;52886:13;52912:20;:45::i;:::-;-1:-1:-1;;;;;53001:16:0;;52970:28;53001:16;;;:12;:16;;;;;;;;53062:21;;;;;;;:12;:21;;;;;53096:22;;-1:-1:-1;;;;;;53096:22:0;;;;;;53175:18;;53137:57;;-1:-1:-1;;;53137:57:0;-1:-1:-1;;;;;;53137:57:0;;;;;;;;;;;;;53241:10;:17;;53205:54;;-1:-1:-1;;;53205:54:0;-1:-1:-1;;;;53205:54:0;;;;;;;;;53272:25;;53096:22;53272:25;;;;;;;;;;;;;;;;;;;;;;;;;;;53096:22;53272:25;;;;;;;;;;;;;;;;;;;;53308:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53361:18;;53001:16;;53062:21;52970:28;53361:18;;53096:22;;53361:18;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;53422:7;53397:33;;53418:2;-1:-1:-1;;;;;53397:33:0;53414:1;-1:-1:-1;;;;;53397:33:0;;;;;;;;;;;53443:44;47243:408;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;870:131::-;-1:-1:-1;;;;;945:31:1;;935:42;;925:70;;991:1;988;981:12;1006:435;1073:6;1081;1134:2;1122:9;1113:7;1109:23;1105:32;1102:52;;;1150:1;1147;1140:12;1102:52;1189:9;1176:23;1208:31;1233:5;1208:31;:::i;:::-;1258:5;-1:-1:-1;1315:2:1;1300:18;;1287:32;-1:-1:-1;;;;;1350:40:1;;1338:53;;1328:81;;1405:1;1402;1395:12;1328:81;1428:7;1418:17;;;1006:435;;;;;:::o;1446:127::-;1507:10;1502:3;1498:20;1495:1;1488:31;1538:4;1535:1;1528:15;1562:4;1559:1;1552:15;1578:252;1650:2;1644:9;1692:3;1680:16;;-1:-1:-1;;;;;1711:34:1;;1747:22;;;1708:62;1705:88;;;1773:18;;:::i;:::-;1809:2;1802:22;1578:252;:::o;1835:275::-;1906:2;1900:9;1971:2;1952:13;;-1:-1:-1;;1948:27:1;1936:40;;-1:-1:-1;;;;;1991:34:1;;2027:22;;;1988:62;1985:88;;;2053:18;;:::i;:::-;2089:2;2082:22;1835:275;;-1:-1:-1;1835:275:1:o;2115:712::-;2169:5;2222:3;2215:4;2207:6;2203:17;2199:27;2189:55;;2240:1;2237;2230:12;2189:55;2276:6;2263:20;2302:4;-1:-1:-1;;;;;2321:2:1;2318:26;2315:52;;;2347:18;;:::i;:::-;2393:2;2390:1;2386:10;2416:28;2440:2;2436;2432:11;2416:28;:::i;:::-;2478:15;;;2548;;;2544:24;;;2509:12;;;;2580:15;;;2577:35;;;2608:1;2605;2598:12;2577:35;2644:2;2636:6;2632:15;2621:26;;2656:142;2672:6;2667:3;2664:15;2656:142;;;2738:17;;2726:30;;2689:12;;;;2776;;;;2656:142;;;2816:5;2115:712;-1:-1:-1;;;;;;;2115:712:1:o;2832:624::-;2934:6;2942;2950;3003:2;2991:9;2982:7;2978:23;2974:32;2971:52;;;3019:1;3016;3009:12;2971:52;3058:9;3045:23;3077:31;3102:5;3077:31;:::i;:::-;3127:5;-1:-1:-1;3184:2:1;3169:18;;3156:32;3197:33;3156:32;3197:33;:::i;:::-;3249:7;-1:-1:-1;3307:2:1;3292:18;;3279:32;-1:-1:-1;;;;;3323:30:1;;3320:50;;;3366:1;3363;3356:12;3320:50;3389:61;3442:7;3433:6;3422:9;3418:22;3389:61;:::i;:::-;3379:71;;;2832:624;;;;;:::o;3461:316::-;3538:6;3546;3554;3607:2;3595:9;3586:7;3582:23;3578:32;3575:52;;;3623:1;3620;3613:12;3575:52;-1:-1:-1;;3646:23:1;;;3716:2;3701:18;;3688:32;;-1:-1:-1;3767:2:1;3752:18;;;3739:32;;3461:316;-1:-1:-1;3461:316:1:o;3782:258::-;3854:1;3864:113;3878:6;3875:1;3872:13;3864:113;;;3954:11;;;3948:18;3935:11;;;3928:39;3900:2;3893:10;3864:113;;;3995:6;3992:1;3989:13;3986:48;;;-1:-1:-1;;4030:1:1;4012:16;;4005:27;3782:258::o;4045:::-;4087:3;4125:5;4119:12;4152:6;4147:3;4140:19;4168:63;4224:6;4217:4;4212:3;4208:14;4201:4;4194:5;4190:16;4168:63;:::i;:::-;4285:2;4264:15;-1:-1:-1;;4260:29:1;4251:39;;;;4292:4;4247:50;;4045:258;-1:-1:-1;;4045:258:1:o;4308:220::-;4457:2;4446:9;4439:21;4420:4;4477:45;4518:2;4507:9;4503:18;4495:6;4477:45;:::i;4533:180::-;4592:6;4645:2;4633:9;4624:7;4620:23;4616:32;4613:52;;;4661:1;4658;4651:12;4613:52;-1:-1:-1;4684:23:1;;4533:180;-1:-1:-1;4533:180:1:o;4926:315::-;4994:6;5002;5055:2;5043:9;5034:7;5030:23;5026:32;5023:52;;;5071:1;5068;5061:12;5023:52;5110:9;5097:23;5129:31;5154:5;5129:31;:::i;:::-;5179:5;5231:2;5216:18;;;;5203:32;;-1:-1:-1;;;4926:315:1:o;5246:367::-;5309:8;5319:6;5373:3;5366:4;5358:6;5354:17;5350:27;5340:55;;5391:1;5388;5381:12;5340:55;-1:-1:-1;5414:20:1;;-1:-1:-1;;;;;5446:30:1;;5443:50;;;5489:1;5486;5479:12;5443:50;5526:4;5518:6;5514:17;5502:29;;5586:3;5579:4;5569:6;5566:1;5562:14;5554:6;5550:27;5546:38;5543:47;5540:67;;;5603:1;5600;5593:12;5618:711;5740:6;5748;5756;5764;5772;5780;5833:3;5821:9;5812:7;5808:23;5804:33;5801:53;;;5850:1;5847;5840:12;5801:53;5886:9;5873:23;5863:33;;5943:2;5932:9;5928:18;5915:32;5905:42;;5994:2;5983:9;5979:18;5966:32;5956:42;;6045:2;6034:9;6030:18;6017:32;6007:42;;6100:3;6089:9;6085:19;6072:33;-1:-1:-1;;;;;6120:6:1;6117:30;6114:50;;;6160:1;6157;6150:12;6114:50;6199:70;6261:7;6252:6;6241:9;6237:22;6199:70;:::i;:::-;5618:711;;;;-1:-1:-1;5618:711:1;;-1:-1:-1;5618:711:1;;6288:8;;5618:711;-1:-1:-1;;;5618:711:1:o;6334:255::-;6401:6;6454:2;6442:9;6433:7;6429:23;6425:32;6422:52;;;6470:1;6467;6460:12;6422:52;6509:9;6496:23;6528:31;6553:5;6528:31;:::i;6594:456::-;6671:6;6679;6687;6740:2;6728:9;6719:7;6715:23;6711:32;6708:52;;;6756:1;6753;6746:12;6708:52;6795:9;6782:23;6814:31;6839:5;6814:31;:::i;:::-;6864:5;-1:-1:-1;6921:2:1;6906:18;;6893:32;6934:33;6893:32;6934:33;:::i;:::-;6594:456;;6986:7;;-1:-1:-1;;;7040:2:1;7025:18;;;;7012:32;;6594:456::o;7055:186::-;7103:4;-1:-1:-1;;;;;7128:6:1;7125:30;7122:56;;;7158:18;;:::i;:::-;-1:-1:-1;7224:2:1;7203:15;-1:-1:-1;;7199:29:1;7230:4;7195:40;;7055:186::o;7246:462::-;7288:5;7341:3;7334:4;7326:6;7322:17;7318:27;7308:55;;7359:1;7356;7349:12;7308:55;7395:6;7382:20;7426:48;7442:31;7470:2;7442:31;:::i;:::-;7426:48;:::i;:::-;7499:2;7490:7;7483:19;7545:3;7538:4;7533:2;7525:6;7521:15;7517:26;7514:35;7511:55;;;7562:1;7559;7552:12;7511:55;7627:2;7620:4;7612:6;7608:17;7601:4;7592:7;7588:18;7575:55;7675:1;7650:16;;;7668:4;7646:27;7639:38;;;;7654:7;7246:462;-1:-1:-1;;;7246:462:1:o;7713:844::-;7833:6;7841;7849;7857;7910:3;7898:9;7889:7;7885:23;7881:33;7878:53;;;7927:1;7924;7917:12;7878:53;7966:9;7953:23;7985:31;8010:5;7985:31;:::i;:::-;8035:5;-1:-1:-1;8092:2:1;8077:18;;8064:32;8105:33;8064:32;8105:33;:::i;:::-;8157:7;-1:-1:-1;8215:2:1;8200:18;;8187:32;-1:-1:-1;;;;;8268:14:1;;;8265:34;;;8295:1;8292;8285:12;8265:34;8318:61;8371:7;8362:6;8351:9;8347:22;8318:61;:::i;:::-;8308:71;;8432:2;8421:9;8417:18;8404:32;8388:48;;8461:2;8451:8;8448:16;8445:36;;;8477:1;8474;8467:12;8445:36;;8500:51;8543:7;8532:8;8521:9;8517:24;8500:51;:::i;:::-;8490:61;;;7713:844;;;;;;;:::o;8562:248::-;8630:6;8638;8691:2;8679:9;8670:7;8666:23;8662:32;8659:52;;;8707:1;8704;8697:12;8659:52;-1:-1:-1;;8730:23:1;;;8800:2;8785:18;;;8772:32;;-1:-1:-1;8562:248:1:o;11027:592::-;11098:6;11106;11159:2;11147:9;11138:7;11134:23;11130:32;11127:52;;;11175:1;11172;11165:12;11127:52;11215:9;11202:23;-1:-1:-1;;;;;11285:2:1;11277:6;11274:14;11271:34;;;11301:1;11298;11291:12;11271:34;11339:6;11328:9;11324:22;11314:32;;11384:7;11377:4;11373:2;11369:13;11365:27;11355:55;;11406:1;11403;11396:12;11355:55;11446:2;11433:16;11472:2;11464:6;11461:14;11458:34;;;11488:1;11485;11478:12;11458:34;11533:7;11528:2;11519:6;11515:2;11511:15;11507:24;11504:37;11501:57;;;11554:1;11551;11544:12;11501:57;11585:2;11577:11;;;;;11607:6;;-1:-1:-1;11027:592:1;;-1:-1:-1;;;;11027:592:1:o;11624:642::-;11737:6;11745;11753;11761;11769;11822:3;11810:9;11801:7;11797:23;11793:33;11790:53;;;11839:1;11836;11829:12;11790:53;11875:9;11862:23;11852:33;;11932:2;11921:9;11917:18;11904:32;11894:42;;11983:2;11972:9;11968:18;11955:32;11945:42;;12038:2;12027:9;12023:18;12010:32;-1:-1:-1;;;;;12057:6:1;12054:30;12051:50;;;12097:1;12094;12087:12;12051:50;12136:70;12198:7;12189:6;12178:9;12174:22;12136:70;:::i;:::-;11624:642;;;;-1:-1:-1;11624:642:1;;-1:-1:-1;12225:8:1;;12110:96;11624:642;-1:-1:-1;;;11624:642:1:o;12271:118::-;12357:5;12350:13;12343:21;12336:5;12333:32;12323:60;;12379:1;12376;12369:12;12394:128;12459:20;;12488:28;12459:20;12488:28;:::i;12527:842::-;12615:6;12668:3;12656:9;12647:7;12643:23;12639:33;12636:53;;;12685:1;12682;12675:12;12636:53;12711:22;;:::i;:::-;12756:26;12772:9;12756:26;:::i;:::-;12749:5;12742:41;12815:35;12846:2;12835:9;12831:18;12815:35;:::i;:::-;12810:2;12803:5;12799:14;12792:59;12883:35;12914:2;12903:9;12899:18;12883:35;:::i;:::-;12878:2;12871:5;12867:14;12860:59;12979:2;12968:9;12964:18;12951:32;12946:2;12939:5;12935:14;12928:56;13045:3;13034:9;13030:19;13017:33;13011:3;13004:5;13000:15;12993:58;13112:3;13101:9;13097:19;13084:33;13078:3;13071:5;13067:15;13060:58;13179:3;13168:9;13164:19;13151:33;13145:3;13138:5;13134:15;13127:58;13246:3;13235:9;13231:19;13218:33;13212:3;13205:5;13201:15;13194:58;13271:3;13334:2;13323:9;13319:18;13306:32;13301:2;13294:5;13290:14;13283:56;;13358:5;13348:15;;;12527:842;;;;:::o;13947:382::-;14012:6;14020;14073:2;14061:9;14052:7;14048:23;14044:32;14041:52;;;14089:1;14086;14079:12;14041:52;14128:9;14115:23;14147:31;14172:5;14147:31;:::i;:::-;14197:5;-1:-1:-1;14254:2:1;14239:18;;14226:32;14267:30;14226:32;14267:30;:::i;14334:632::-;14505:2;14557:21;;;14627:13;;14530:18;;;14649:22;;;14476:4;;14505:2;14728:15;;;;14702:2;14687:18;;;14476:4;14771:169;14785:6;14782:1;14779:13;14771:169;;;14846:13;;14834:26;;14915:15;;;;14880:12;;;;14807:1;14800:9;14771:169;;;-1:-1:-1;14957:3:1;;14334:632;-1:-1:-1;;;;;;14334:632:1:o;14971:665::-;15066:6;15074;15082;15090;15143:3;15131:9;15122:7;15118:23;15114:33;15111:53;;;15160:1;15157;15150:12;15111:53;15199:9;15186:23;15218:31;15243:5;15218:31;:::i;:::-;15268:5;-1:-1:-1;15325:2:1;15310:18;;15297:32;15338:33;15297:32;15338:33;:::i;:::-;15390:7;-1:-1:-1;15444:2:1;15429:18;;15416:32;;-1:-1:-1;15499:2:1;15484:18;;15471:32;-1:-1:-1;;;;;15515:30:1;;15512:50;;;15558:1;15555;15548:12;15512:50;15581:49;15622:7;15613:6;15602:9;15598:22;15581:49;:::i;15906:388::-;15974:6;15982;16035:2;16023:9;16014:7;16010:23;16006:32;16003:52;;;16051:1;16048;16041:12;16003:52;16090:9;16077:23;16109:31;16134:5;16109:31;:::i;:::-;16159:5;-1:-1:-1;16216:2:1;16201:18;;16188:32;16229:33;16188:32;16229:33;:::i;16632:356::-;16834:2;16816:21;;;16853:18;;;16846:30;16912:34;16907:2;16892:18;;16885:62;16979:2;16964:18;;16632:356::o;16993:344::-;17195:2;17177:21;;;17234:2;17214:18;;;17207:30;-1:-1:-1;;;17268:2:1;17253:18;;17246:50;17328:2;17313:18;;16993:344::o;17342:127::-;17403:10;17398:3;17394:20;17391:1;17384:31;17434:4;17431:1;17424:15;17458:4;17455:1;17448:15;17474:127;17535:10;17530:3;17526:20;17523:1;17516:31;17566:4;17563:1;17556:15;17590:4;17587:1;17580:15;17606:135;17645:3;-1:-1:-1;;17666:17:1;;17663:43;;;17686:18;;:::i;:::-;-1:-1:-1;17733:1:1;17722:13;;17606:135::o;17746:350::-;17948:2;17930:21;;;17987:2;17967:18;;;17960:30;18026:28;18021:2;18006:18;;17999:56;18087:2;18072:18;;17746:350::o;18452:380::-;18531:1;18527:12;;;;18574;;;18595:61;;18649:4;18641:6;18637:17;18627:27;;18595:61;18702:2;18694:6;18691:14;18671:18;18668:38;18665:161;;;18748:10;18743:3;18739:20;18736:1;18729:31;18783:4;18780:1;18773:15;18811:4;18808:1;18801:15;18665:161;;18452:380;;;:::o;21098:350::-;21300:2;21282:21;;;21339:2;21319:18;;;21312:30;21378:28;21373:2;21358:18;;21351:56;21439:2;21424:18;;21098:350::o;21804:128::-;21844:3;21875:1;21871:6;21868:1;21865:13;21862:39;;;21881:18;;:::i;:::-;-1:-1:-1;21917:9:1;;21804:128::o;22297:338::-;22499:2;22481:21;;;22538:2;22518:18;;;22511:30;-1:-1:-1;;;22572:2:1;22557:18;;22550:44;22626:2;22611:18;;22297:338::o;22640:168::-;22680:7;22746:1;22742;22738:6;22734:14;22731:1;22728:21;22723:1;22716:9;22709:17;22705:45;22702:71;;;22753:18;;:::i;:::-;-1:-1:-1;22793:9:1;;22640:168::o;22813:341::-;23015:2;22997:21;;;23054:2;23034:18;;;23027:30;-1:-1:-1;;;23088:2:1;23073:18;;23066:47;23145:2;23130:18;;22813:341::o;23581:413::-;23783:2;23765:21;;;23822:2;23802:18;;;23795:30;23861:34;23856:2;23841:18;;23834:62;-1:-1:-1;;;23927:2:1;23912:18;;23905:47;23984:3;23969:19;;23581:413::o;23999:127::-;24060:10;24055:3;24051:20;24048:1;24041:31;24091:4;24088:1;24081:15;24115:4;24112:1;24105:15;24131:120;24171:1;24197;24187:35;;24202:18;;:::i;:::-;-1:-1:-1;24236:9:1;;24131:120::o;24606:354::-;24808:2;24790:21;;;24847:2;24827:18;;;24820:30;24886:32;24881:2;24866:18;;24859:60;24951:2;24936:18;;24606:354::o;30030:1527::-;30254:3;30292:6;30286:13;30318:4;30331:51;30375:6;30370:3;30365:2;30357:6;30353:15;30331:51;:::i;:::-;30445:13;;30404:16;;;;30467:55;30445:13;30404:16;30489:15;;;30467:55;:::i;:::-;30611:13;;30544:20;;;30584:1;;30671;30693:18;;;;30746;;;;30773:93;;30851:4;30841:8;30837:19;30825:31;;30773:93;30914:2;30904:8;30901:16;30881:18;30878:40;30875:167;;;-1:-1:-1;;;30941:33:1;;30997:4;30994:1;30987:15;31027:4;30948:3;31015:17;30875:167;31058:18;31085:110;;;;31209:1;31204:328;;;;31051:481;;31085:110;-1:-1:-1;;31120:24:1;;31106:39;;31165:20;;;;-1:-1:-1;31085:110:1;;31204:328;29977:1;29970:14;;;30014:4;30001:18;;31299:1;31313:169;31327:8;31324:1;31321:15;31313:169;;;31409:14;;31394:13;;;31387:37;31452:16;;;;31344:10;;31313:169;;;31317:3;;31513:8;31506:5;31502:20;31495:27;;31051:481;-1:-1:-1;31548:3:1;;30030:1527;-1:-1:-1;;;;;;;;;;;30030:1527:1:o;31769:245::-;31836:6;31889:2;31877:9;31868:7;31864:23;31860:32;31857:52;;;31905:1;31902;31895:12;31857:52;31937:9;31931:16;31956:28;31978:5;31956:28;:::i;32840:635::-;32920:6;32973:2;32961:9;32952:7;32948:23;32944:32;32941:52;;;32989:1;32986;32979:12;32941:52;33022:9;33016:16;-1:-1:-1;;;;;33047:6:1;33044:30;33041:50;;;33087:1;33084;33077:12;33041:50;33110:22;;33163:4;33155:13;;33151:27;-1:-1:-1;33141:55:1;;33192:1;33189;33182:12;33141:55;33221:2;33215:9;33246:48;33262:31;33290:2;33262:31;:::i;33246:48::-;33317:2;33310:5;33303:17;33357:7;33352:2;33347;33343;33339:11;33335:20;33332:33;33329:53;;;33378:1;33375;33368:12;33329:53;33391:54;33442:2;33437;33430:5;33426:14;33421:2;33417;33413:11;33391:54;:::i;:::-;33464:5;32840:635;-1:-1:-1;;;;;32840:635:1:o;33480:184::-;33550:6;33603:2;33591:9;33582:7;33578:23;33574:32;33571:52;;;33619:1;33616;33609:12;33571:52;-1:-1:-1;33642:16:1;;33480:184;-1:-1:-1;33480:184:1:o;35556:439::-;35743:3;35781:6;35775:13;35797:53;35843:6;35838:3;35831:4;35823:6;35819:17;35797:53;:::i;:::-;35872:16;;;;35897:21;;;-1:-1:-1;35945:4:1;35934:16;;35927:32;35986:2;35975:14;;35556:439;-1:-1:-1;35556:439:1:o;37576:125::-;37616:4;37644:1;37641;37638:8;37635:34;;;37649:18;;:::i;:::-;-1:-1:-1;37686:9:1;;37576:125::o;37706:127::-;37767:10;37762:3;37758:20;37755:1;37748:31;37798:4;37795:1;37788:15;37822:4;37819:1;37812:15;39182:388;39416:1;39412;39407:3;39403:11;39399:19;39391:6;39387:32;39376:9;39369:51;39456:6;39451:2;39440:9;39436:18;39429:34;39499:2;39494;39483:9;39479:18;39472:30;39350:4;39519:45;39560:2;39549:9;39545:18;39537:6;39519:45;:::i;40274:112::-;40306:1;40332;40322:35;;40337:18;;:::i;:::-;-1:-1:-1;40371:9:1;;40274:112::o;40391:414::-;40593:2;40575:21;;;40632:2;40612:18;;;40605:30;40671:34;40666:2;40651:18;;40644:62;-1:-1:-1;;;40737:2:1;40722:18;;40715:48;40795:3;40780:19;;40391:414::o;41501:489::-;-1:-1:-1;;;;;41770:15:1;;;41752:34;;41822:15;;41817:2;41802:18;;41795:43;41869:2;41854:18;;41847:34;;;41917:3;41912:2;41897:18;;41890:31;;;41695:4;;41938:46;;41964:19;;41956:6;41938:46;:::i;:::-;41930:54;41501:489;-1:-1:-1;;;;;;41501:489:1:o;41995:249::-;42064:6;42117:2;42105:9;42096:7;42092:23;42088:32;42085:52;;;42133:1;42130;42123:12;42085:52;42165:9;42159:16;42184:30;42208:5;42184:30;:::i;42610:228::-;42649:3;42677:10;42714:2;42711:1;42707:10;42744:2;42741:1;42737:10;42775:3;42771:2;42767:12;42762:3;42759:21;42756:47;;;42783:18;;:::i;:::-;42819:13;;42610:228;-1:-1:-1;;;;42610:228:1:o
Swarm Source
ipfs://91e3e65b235f925c5e4d27c845b5a809d8a1acb0d146f79ab69e8bf12234a439
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.