Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
32 BSHJ
Holders
13
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 BSHJLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
IntegrityofJosephChambers
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-20 */ // Sources flattened with hardhat v2.11.1 https://hardhat.org // File @openzeppelin/contracts/security/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File @openzeppelin/contracts/finance/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. The distribution of shares is set at the * time of contract deployment and can't be updated thereafter. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; mapping(IERC20 => uint256) private _erc20TotalReleased; mapping(IERC20 => mapping(address => uint256)) private _erc20Released; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20 * contract. */ function totalReleased(IERC20 token) public view returns (uint256) { return _erc20TotalReleased[token]; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an * IERC20 contract. */ function released(IERC20 token, address account) public view returns (uint256) { return _erc20Released[token][account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Getter for the amount of payee's releasable Ether. */ function releasable(address account) public view returns (uint256) { uint256 totalReceived = address(this).balance + totalReleased(); return _pendingPayment(account, totalReceived, released(account)); } /** * @dev Getter for the amount of payee's releasable `token` tokens. `token` should be the address of an * IERC20 contract. */ function releasable(IERC20 token, address account) public view returns (uint256) { uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token); return _pendingPayment(account, totalReceived, released(token, account)); } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 payment = releasable(account); require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] += payment; _totalReleased += payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ function release(IERC20 token, address account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 payment = releasable(token, account); require(payment != 0, "PaymentSplitter: account is not due payment"); _erc20Released[token][account] += payment; _erc20TotalReleased[token] += payment; SafeERC20.safeTransfer(token, account, payment); emit ERC20PaymentReleased(token, account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @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 @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @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/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File contracts/IntegrityofJosephChambers.sol pragma solidity ^0.8.0; /* * @title ERC721 token for Integrity of Joseph Chambers * @author Digitizing.io */ contract IntegrityofJosephChambers is AccessControl, ReentrancyGuard, PaymentSplitter, IERC721Metadata, ERC721 { bytes32 public constant RESERVE_ROLE = keccak256("RESERVE_ROLE"); uint256 public totalSupply = 0; uint256 public constant MAX_SUPPLY = 5000; uint256 public remainingReserve = 100; uint256 public salePrice = 0.12 ether; uint256 public saleActiveTimestamp = type(uint256).max; uint256 public constant MAX_NFTS_PER_TX = 5; string private _baseTokenURI; constructor( string memory baseURI, address[] memory payees, uint256[] memory shares )ERC721("IntegrityofJosephChambers", "BSHJ") PaymentSplitter(payees, shares){ _baseTokenURI = baseURI; _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); } /// --------------------------- /// ------ Public Views ------- /// --------------------------- /** * @notice returns the start date of the mint */ function saleIsActive() public view returns(bool) { return block.timestamp > saleActiveTimestamp; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override(ERC721,IERC721Metadata) returns (string memory) { require(_exists(tokenId), 'token doesnt exist'); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId), '.json')) : ''; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, AccessControl, IERC165) returns (bool) { return super.supportsInterface(interfaceId); } /// --------------------------- /// -------- Internal --------- /// --------------------------- /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } /// --------------------------- /// --------- Public ---------- /// --------------------------- /** * @notice mint function for front end public mint, this function calls publicMintTo * * @param numberOfTokens the amount of tokens to purchase */ function publicMint(uint256 numberOfTokens) public payable { publicMintTo(msg.sender, numberOfTokens); } /** * @notice mint function for public mint * * @param _to address who you are minting to * @param numberOfTokens the amount of tokens to purchase */ function publicMintTo(address _to, uint256 numberOfTokens) nonReentrant public payable { require(saleIsActive(), "Sale must be active!"); require(numberOfTokens > 0 && numberOfTokens <= MAX_NFTS_PER_TX, "Greater than 0 and less than equal max tx"); require(salePrice * numberOfTokens == msg.value, "Not enough ETH sent"); uint256 supply = totalSupply; totalSupply += numberOfTokens; require(totalSupply + remainingReserve <= MAX_SUPPLY, "Purchase would exceed max supply"); for (uint256 i; i < numberOfTokens; i++) { _safeMint(_to, supply + i); } } /// --------------------------- /// --------- Admin ----------- /// --------------------------- /** * @notice mint function to obtain the reserved tokens, can only be called by correct role * * @param _to address who you are minting to * @param numberOfTokens the amount of tokens from the reserce to be minted */ function reserveTokens(address _to, uint256 numberOfTokens) public onlyRole(RESERVE_ROLE) { uint256 supply = totalSupply; totalSupply += numberOfTokens; require(numberOfTokens <= remainingReserve, "Exceeded reserve amount"); for (uint i = 0; i < numberOfTokens; i++) { _safeMint(_to, supply + i); } remainingReserve -= numberOfTokens; } /** * @dev Set the base token URI */ function setBaseTokenURI(string memory baseURI) public onlyRole(DEFAULT_ADMIN_ROLE) { _baseTokenURI = baseURI; } /** * @dev Set the mint start time. */ function setSaleActiveTimestamp(uint256 _saleActiveTimestamp) public onlyRole(DEFAULT_ADMIN_ROLE) { saleActiveTimestamp = _saleActiveTimestamp; } /** * @dev Set the mint price. */ function setPrice(uint256 _salePrice) public onlyRole(DEFAULT_ADMIN_ROLE) { salePrice = _salePrice; } /** * @notice withdraw all funds */ function withdrawAll() public onlyRole(DEFAULT_ADMIN_ROLE) { require(payable(msg.sender).send(address(this).balance)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"address[]","name":"payees","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFTS_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"publicMintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remainingReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","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":[],"name":"saleActiveTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_saleActiveTimestamp","type":"uint256"}],"name":"setSaleActiveTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526000600f5560646010556701aa535d3d0c00006011556000196012553480156200002d57600080fd5b5060405162003302380380620033028339810160408190526200005091620006d9565b6040518060400160405280601981526020017f496e746567726974796f664a6f736570684368616d6265727300000000000000815250604051806040016040528060048152602001632129a42560e11b81525083836001808190555080518251146200011e5760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620001715760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015260640162000115565b60005b8251811015620001dd57620001c8838281518110620001975762000197620007e5565b6020026020010151838381518110620001b457620001b4620007e5565b60200260200101516200023a60201b60201c565b80620001d48162000811565b91505062000174565b50508251620001f591506009906020850190620004d8565b5080516200020b90600a906020840190620004d8565b505083516200022391506013906020860190620004d8565b506200023160003362000428565b50505062000884565b6001600160a01b038216620002a75760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b606482015260840162000115565b60008111620002f95760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015260640162000115565b6001600160a01b03821660009081526004602052604090205415620003755760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b606482015260840162000115565b60068054600181019091557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0384169081179091556000908152600460205260409020819055600254620003df9082906200082d565b600255604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b62000434828262000438565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000434576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620004943390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b828054620004e69062000848565b90600052602060002090601f0160209004810192826200050a576000855562000555565b82601f106200052557805160ff191683800117855562000555565b8280016001018555821562000555579182015b828111156200055557825182559160200191906001019062000538565b506200056392915062000567565b5090565b5b8082111562000563576000815560010162000568565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620005bf57620005bf6200057e565b604052919050565b60006001600160401b03821115620005e357620005e36200057e565b5060051b60200190565b600082601f830112620005ff57600080fd5b81516020620006186200061283620005c7565b62000594565b82815260059290921b840181019181810190868411156200063857600080fd5b8286015b848110156200066c5780516001600160a01b03811681146200065e5760008081fd5b83529183019183016200063c565b509695505050505050565b600082601f8301126200068957600080fd5b815160206200069c6200061283620005c7565b82815260059290921b84018101918181019086841115620006bc57600080fd5b8286015b848110156200066c5780518352918301918301620006c0565b600080600060608486031215620006ef57600080fd5b83516001600160401b03808211156200070757600080fd5b818601915086601f8301126200071c57600080fd5b8151818111156200073157620007316200057e565b602062000747601f8301601f1916820162000594565b82815289828487010111156200075c57600080fd5b60005b838110156200077c5785810183015182820184015282016200075f565b838111156200078e5760008385840101525b509088015190965092505080821115620007a757600080fd5b620007b587838801620005ed565b93506040860151915080821115620007cc57600080fd5b50620007db8682870162000677565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620008265762000826620007fb565b5060010190565b60008219821115620008435762000843620007fb565b500190565b600181811c908216806200085d57607f821691505b6020821081036200087e57634e487b7160e01b600052602260045260246000fd5b50919050565b612a6e80620008946000396000f3fe6080604052600436106102765760003560e01c806370a082311161014f578063a3f8eace116100c1578063d79779b21161007a578063d79779b2146107e0578063e33b7de314610816578063e985e9c51461082b578063eb8d244414610874578063f51f96dd1461088b578063f88ca86b146108a157600080fd5b8063a3f8eace1461070a578063b88d4fde1461072a578063c45ac0501461074a578063c87b56dd1461076a578063ce7c2ac21461078a578063d547741f146107c057600080fd5b806391d148541161011357806391d148541461065457806395d89b41146106745780639852595c14610689578063a060ae18146106bf578063a217fddf146106d5578063a22cb465146106ea57600080fd5b806370a08231146105bf57806378cf19e9146105df578063853828b6146105ff5780638b83209b1461061457806391b7f5ed1461063457600080fd5b80632db11544116101e85780633a98ef39116101ac5780633a98ef39146104f1578063406072a91461050657806342842e0e1461054c57806348b750441461056c5780635b06d8531461058c5780636352211e1461059f57600080fd5b80632db11544146104685780632f2ff15d1461047b57806330176e131461049b57806332cb6b0c146104bb57806336568abe146104d157600080fd5b80631608b47b1161023a5780631608b47b1461039857806318160ddd146103ae57806319165587146103c4578063191fd57d146103e457806323b872dd14610418578063248a9ca31461043857600080fd5b806301ffc9a7146102c457806306fdde03146102f9578063081812fc1461031b578063095ea7b3146103535780631168a6311461037557600080fd5b366102bf577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156102d057600080fd5b506102e46102df366004612372565b6108c1565b60405190151581526020015b60405180910390f35b34801561030557600080fd5b5061030e6108d2565b6040516102f091906123e7565b34801561032757600080fd5b5061033b6103363660046123fa565b610964565b6040516001600160a01b0390911681526020016102f0565b34801561035f57600080fd5b5061037361036e366004612428565b61098b565b005b34801561038157600080fd5b5061038a600581565b6040519081526020016102f0565b3480156103a457600080fd5b5061038a60125481565b3480156103ba57600080fd5b5061038a600f5481565b3480156103d057600080fd5b506103736103df366004612454565b610aa5565b3480156103f057600080fd5b5061038a7fbf575aa07286781f90c1bdc8f4940c6c29874a0c25a1f1fe7661650b409c01ff81565b34801561042457600080fd5b50610373610433366004612471565b610b9e565b34801561044457600080fd5b5061038a6104533660046123fa565b60009081526020819052604090206001015490565b6103736104763660046123fa565b610bcf565b34801561048757600080fd5b506103736104963660046124b2565b610bdc565b3480156104a757600080fd5b506103736104b636600461256e565b610c01565b3480156104c757600080fd5b5061038a61138881565b3480156104dd57600080fd5b506103736104ec3660046124b2565b610c1f565b3480156104fd57600080fd5b5060025461038a565b34801561051257600080fd5b5061038a6105213660046125b7565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b34801561055857600080fd5b50610373610567366004612471565b610c9d565b34801561057857600080fd5b506103736105873660046125b7565b610cb8565b61037361059a366004612428565b610ddb565b3480156105ab57600080fd5b5061033b6105ba3660046123fa565b610fee565b3480156105cb57600080fd5b5061038a6105da366004612454565b61104e565b3480156105eb57600080fd5b506103736105fa366004612428565b6110d4565b34801561060b57600080fd5b506103736111b1565b34801561062057600080fd5b5061033b61062f3660046123fa565b6111e0565b34801561064057600080fd5b5061037361064f3660046123fa565b611210565b34801561066057600080fd5b506102e461066f3660046124b2565b611221565b34801561068057600080fd5b5061030e61124a565b34801561069557600080fd5b5061038a6106a4366004612454565b6001600160a01b031660009081526005602052604090205490565b3480156106cb57600080fd5b5061038a60105481565b3480156106e157600080fd5b5061038a600081565b3480156106f657600080fd5b506103736107053660046125f3565b611259565b34801561071657600080fd5b5061038a610725366004612454565b611264565b34801561073657600080fd5b50610373610745366004612621565b6112ac565b34801561075657600080fd5b5061038a6107653660046125b7565b6112e4565b34801561077657600080fd5b5061030e6107853660046123fa565b6113af565b34801561079657600080fd5b5061038a6107a5366004612454565b6001600160a01b031660009081526004602052604090205490565b3480156107cc57600080fd5b506103736107db3660046124b2565b611466565b3480156107ec57600080fd5b5061038a6107fb366004612454565b6001600160a01b031660009081526007602052604090205490565b34801561082257600080fd5b5060035461038a565b34801561083757600080fd5b506102e46108463660046125b7565b6001600160a01b039182166000908152600e6020908152604080832093909416825291909152205460ff1690565b34801561088057600080fd5b5060125442116102e4565b34801561089757600080fd5b5061038a60115481565b3480156108ad57600080fd5b506103736108bc3660046123fa565b61148b565b60006108cc8261149c565b92915050565b6060600980546108e1906126a1565b80601f016020809104026020016040519081016040528092919081815260200182805461090d906126a1565b801561095a5780601f1061092f5761010080835404028352916020019161095a565b820191906000526020600020905b81548152906001019060200180831161093d57829003601f168201915b5050505050905090565b600061096f826114dc565b506000908152600d60205260409020546001600160a01b031690565b600061099682610fee565b9050806001600160a01b0316836001600160a01b031603610a085760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610a245750610a248133610846565b610a965760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016109ff565b610aa0838361153b565b505050565b6001600160a01b038116600090815260046020526040902054610ada5760405162461bcd60e51b81526004016109ff906126db565b6000610ae582611264565b905080600003610b075760405162461bcd60e51b81526004016109ff90612721565b6001600160a01b03821660009081526005602052604081208054839290610b2f908490612782565b925050819055508060036000828254610b489190612782565b90915550610b58905082826115a9565b604080516001600160a01b0384168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a15050565b610ba833826116c2565b610bc45760405162461bcd60e51b81526004016109ff9061279a565b610aa0838383611740565b610bd93382610ddb565b50565b600082815260208190526040902060010154610bf7816118dc565b610aa083836118e6565b6000610c0c816118dc565b8151610aa09060139060208501906122c3565b6001600160a01b0381163314610c8f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016109ff565b610c99828261196a565b5050565b610aa0838383604051806020016040528060008152506112ac565b6001600160a01b038116600090815260046020526040902054610ced5760405162461bcd60e51b81526004016109ff906126db565b6000610cf983836112e4565b905080600003610d1b5760405162461bcd60e51b81526004016109ff90612721565b6001600160a01b03808416600090815260086020908152604080832093861683529290529081208054839290610d52908490612782565b90915550506001600160a01b03831660009081526007602052604081208054839290610d7f908490612782565b90915550610d9090508383836119cf565b604080516001600160a01b038481168252602082018490528516917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a2505050565b600260015403610e2d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109ff565b60026001556012544211610e7a5760405162461bcd60e51b815260206004820152601460248201527353616c65206d757374206265206163746976652160601b60448201526064016109ff565b600081118015610e8b575060058111155b610ee95760405162461bcd60e51b815260206004820152602960248201527f47726561746572207468616e203020616e64206c657373207468616e206571756044820152680c2d840dac2f040e8f60bb1b60648201526084016109ff565b3481601154610ef891906127e8565b14610f3b5760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da08115512081cd95b9d606a1b60448201526064016109ff565b600f80549082906000610f4e8385612782565b9091555050601054600f5461138891610f6691612782565b1115610fb45760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c7960448201526064016109ff565b60005b82811015610fe457610fd284610fcd8385612782565b611a21565b80610fdc81612807565b915050610fb7565b5050600180555050565b6000818152600b60205260408120546001600160a01b0316806108cc5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109ff565b60006001600160a01b0382166110b85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016109ff565b506001600160a01b03166000908152600c602052604090205490565b7fbf575aa07286781f90c1bdc8f4940c6c29874a0c25a1f1fe7661650b409c01ff6110fe816118dc565b600f805490839060006111118385612782565b90915550506010548311156111685760405162461bcd60e51b815260206004820152601760248201527f4578636565646564207265736572766520616d6f756e7400000000000000000060448201526064016109ff565b60005b838110156111935761118185610fcd8385612782565b8061118b81612807565b91505061116b565b5082601060008282546111a69190612820565b909155505050505050565b60006111bc816118dc565b60405133904780156108fc02916000818181858888f19350505050610bd957600080fd5b6000600682815481106111f5576111f5612837565b6000918252602090912001546001600160a01b031692915050565b600061121b816118dc565b50601155565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600a80546108e1906126a1565b610c99338383611a3b565b60008061127060035490565b61127a9047612782565b90506112a583826112a0866001600160a01b031660009081526005602052604090205490565b611b09565b9392505050565b6112b633836116c2565b6112d25760405162461bcd60e51b81526004016109ff9061279a565b6112de84848484611b47565b50505050565b6001600160a01b03821660009081526007602052604081205481906040516370a0823160e01b81523060048201526001600160a01b038616906370a0823190602401602060405180830381865afa158015611343573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611367919061284d565b6113719190612782565b6001600160a01b038086166000908152600860209081526040808320938816835292905220549091506113a79084908390611b09565b949350505050565b6000818152600b60205260409020546060906001600160a01b031661140b5760405162461bcd60e51b81526020600482015260126024820152711d1bdad95b88191bd95cdb9d08195e1a5cdd60721b60448201526064016109ff565b6000611415611b7a565b9050805160000361143557604051806020016040528060008152506112a5565b8061143f84611b89565b604051602001611450929190612866565b6040516020818303038152906040529392505050565b600082815260208190526040902060010154611481816118dc565b610aa0838361196a565b6000611496816118dc565b50601255565b60006001600160e01b031982166380ac58cd60e01b14806114cd57506001600160e01b03198216635b5e139f60e01b145b806108cc57506108cc82611bcd565b6000818152600b60205260409020546001600160a01b0316610bd95760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109ff565b6000818152600d6020526040902080546001600160a01b0319166001600160a01b038416908117909155819061157082610fee565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b804710156115f95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109ff565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611646576040519150601f19603f3d011682016040523d82523d6000602084013e61164b565b606091505b5050905080610aa05760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109ff565b6000806116ce83610fee565b9050806001600160a01b0316846001600160a01b0316148061171557506001600160a01b038082166000908152600e602090815260408083209388168352929052205460ff165b806113a75750836001600160a01b031661172e84610964565b6001600160a01b031614949350505050565b826001600160a01b031661175382610fee565b6001600160a01b0316146117b75760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016109ff565b6001600160a01b0382166118195760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109ff565b61182460008261153b565b6001600160a01b0383166000908152600c6020526040812080546001929061184d908490612820565b90915550506001600160a01b0382166000908152600c6020526040812080546001929061187b908490612782565b90915550506000818152600b602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610bd98133611c02565b6118f08282611221565b610c99576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556119263390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6119748282611221565b15610c99576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610aa0908490611c66565b610c99828260405180602001604052806000815250611d38565b816001600160a01b0316836001600160a01b031603611a9c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109ff565b6001600160a01b038381166000818152600e6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6002546001600160a01b03841660009081526004602052604081205490918391611b3390866127e8565b611b3d91906128a5565b6113a79190612820565b611b52848484611740565b611b5e84848484611d6b565b6112de5760405162461bcd60e51b81526004016109ff906128c7565b6060601380546108e1906126a1565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480611ba35750819003601f19909101908152919050565b60006001600160e01b03198216637965db0b60e01b14806108cc57506301ffc9a760e01b6001600160e01b03198316146108cc565b611c0c8282611221565b610c9957611c24816001600160a01b03166014611e6c565b611c2f836020611e6c565b604051602001611c40929190612919565b60408051601f198184030181529082905262461bcd60e51b82526109ff916004016123e7565b6000611cbb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166120089092919063ffffffff16565b805190915015610aa05780806020019051810190611cd9919061298e565b610aa05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016109ff565b611d428383612017565b611d4f6000848484611d6b565b610aa05760405162461bcd60e51b81526004016109ff906128c7565b60006001600160a01b0384163b15611e6157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611daf9033908990889088906004016129ab565b6020604051808303816000875af1925050508015611dea575060408051601f3d908101601f19168201909252611de7918101906129e8565b60015b611e47573d808015611e18576040519150601f19603f3d011682016040523d82523d6000602084013e611e1d565b606091505b508051600003611e3f5760405162461bcd60e51b81526004016109ff906128c7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506113a7565b506001949350505050565b60606000611e7b8360026127e8565b611e86906002612782565b67ffffffffffffffff811115611e9e57611e9e6124e2565b6040519080825280601f01601f191660200182016040528015611ec8576020820181803683370190505b509050600360fc1b81600081518110611ee357611ee3612837565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611f1257611f12612837565b60200101906001600160f81b031916908160001a9053506000611f368460026127e8565b611f41906001612782565b90505b6001811115611fb9576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611f7557611f75612837565b1a60f81b828281518110611f8b57611f8b612837565b60200101906001600160f81b031916908160001a90535060049490941c93611fb281612a05565b9050611f44565b5083156112a55760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ff565b60606113a78484600085612159565b6001600160a01b03821661206d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109ff565b6000818152600b60205260409020546001600160a01b0316156120d25760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109ff565b6001600160a01b0382166000908152600c602052604081208054600192906120fb908490612782565b90915550506000818152600b602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060824710156121ba5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016109ff565b6001600160a01b0385163b6122115760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109ff565b600080866001600160a01b0316858760405161222d9190612a1c565b60006040518083038185875af1925050503d806000811461226a576040519150601f19603f3d011682016040523d82523d6000602084013e61226f565b606091505b509150915061227f82828661228a565b979650505050505050565b606083156122995750816112a5565b8251156122a95782518084602001fd5b8160405162461bcd60e51b81526004016109ff91906123e7565b8280546122cf906126a1565b90600052602060002090601f0160209004810192826122f15760008555612337565b82601f1061230a57805160ff1916838001178555612337565b82800160010185558215612337579182015b8281111561233757825182559160200191906001019061231c565b50612343929150612347565b5090565b5b808211156123435760008155600101612348565b6001600160e01b031981168114610bd957600080fd5b60006020828403121561238457600080fd5b81356112a58161235c565b60005b838110156123aa578181015183820152602001612392565b838111156112de5750506000910152565b600081518084526123d381602086016020860161238f565b601f01601f19169290920160200192915050565b6020815260006112a560208301846123bb565b60006020828403121561240c57600080fd5b5035919050565b6001600160a01b0381168114610bd957600080fd5b6000806040838503121561243b57600080fd5b823561244681612413565b946020939093013593505050565b60006020828403121561246657600080fd5b81356112a581612413565b60008060006060848603121561248657600080fd5b833561249181612413565b925060208401356124a181612413565b929592945050506040919091013590565b600080604083850312156124c557600080fd5b8235915060208301356124d781612413565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612513576125136124e2565b604051601f8501601f19908116603f0116810190828211818310171561253b5761253b6124e2565b8160405280935085815286868601111561255457600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561258057600080fd5b813567ffffffffffffffff81111561259757600080fd5b8201601f810184136125a857600080fd5b6113a7848235602084016124f8565b600080604083850312156125ca57600080fd5b82356125d581612413565b915060208301356124d781612413565b8015158114610bd957600080fd5b6000806040838503121561260657600080fd5b823561261181612413565b915060208301356124d7816125e5565b6000806000806080858703121561263757600080fd5b843561264281612413565b9350602085013561265281612413565b925060408501359150606085013567ffffffffffffffff81111561267557600080fd5b8501601f8101871361268657600080fd5b612695878235602084016124f8565b91505092959194509250565b600181811c908216806126b557607f821691505b6020821081036126d557634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156127955761279561276c565b500190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b60008160001904831182151516156128025761280261276c565b500290565b6000600182016128195761281961276c565b5060010190565b6000828210156128325761283261276c565b500390565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561285f57600080fd5b5051919050565b6000835161287881846020880161238f565b83519083019061288c81836020880161238f565b64173539b7b760d91b9101908152600501949350505050565b6000826128c257634e487b7160e01b600052601260045260246000fd5b500490565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161295181601785016020880161238f565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161298281602884016020880161238f565b01602801949350505050565b6000602082840312156129a057600080fd5b81516112a5816125e5565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129de908301846123bb565b9695505050505050565b6000602082840312156129fa57600080fd5b81516112a58161235c565b600081612a1457612a1461276c565b506000190190565b60008251612a2e81846020870161238f565b919091019291505056fea26469706673582212207ed9428a195c9317f4cfaaeb43f1458913f34da993ebc8ab98f57eae3f76381a64736f6c634300080d0033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d534b48353242585a546b6d7667506f3747706a6a6b326e6b3546684475774e76314b755a46457436634b62442f000000000000000000000000000000000000000000000000000000000000000000000000000000000007000000000000000000000000459f1b1ee38f6e1380bdc25f12dfef033cf3475e0000000000000000000000004ece314198318b9353c3b38cd98bff143ad38f31000000000000000000000000fc7520744d21068af77e15a69fd52753ab816611000000000000000000000000544b14fb19262a19fd3304bbedbc1a149eb416f0000000000000000000000000623191609d54d2779fd9cdcfb336539ed183e66d0000000000000000000000005e8a883a366afba4a44788587fe27c759d282c80000000000000000000000000cc2c9a3a33f1dddaba47d71c80f81e808a5910ed0000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000119400000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000271
Deployed Bytecode
0x6080604052600436106102765760003560e01c806370a082311161014f578063a3f8eace116100c1578063d79779b21161007a578063d79779b2146107e0578063e33b7de314610816578063e985e9c51461082b578063eb8d244414610874578063f51f96dd1461088b578063f88ca86b146108a157600080fd5b8063a3f8eace1461070a578063b88d4fde1461072a578063c45ac0501461074a578063c87b56dd1461076a578063ce7c2ac21461078a578063d547741f146107c057600080fd5b806391d148541161011357806391d148541461065457806395d89b41146106745780639852595c14610689578063a060ae18146106bf578063a217fddf146106d5578063a22cb465146106ea57600080fd5b806370a08231146105bf57806378cf19e9146105df578063853828b6146105ff5780638b83209b1461061457806391b7f5ed1461063457600080fd5b80632db11544116101e85780633a98ef39116101ac5780633a98ef39146104f1578063406072a91461050657806342842e0e1461054c57806348b750441461056c5780635b06d8531461058c5780636352211e1461059f57600080fd5b80632db11544146104685780632f2ff15d1461047b57806330176e131461049b57806332cb6b0c146104bb57806336568abe146104d157600080fd5b80631608b47b1161023a5780631608b47b1461039857806318160ddd146103ae57806319165587146103c4578063191fd57d146103e457806323b872dd14610418578063248a9ca31461043857600080fd5b806301ffc9a7146102c457806306fdde03146102f9578063081812fc1461031b578063095ea7b3146103535780631168a6311461037557600080fd5b366102bf577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156102d057600080fd5b506102e46102df366004612372565b6108c1565b60405190151581526020015b60405180910390f35b34801561030557600080fd5b5061030e6108d2565b6040516102f091906123e7565b34801561032757600080fd5b5061033b6103363660046123fa565b610964565b6040516001600160a01b0390911681526020016102f0565b34801561035f57600080fd5b5061037361036e366004612428565b61098b565b005b34801561038157600080fd5b5061038a600581565b6040519081526020016102f0565b3480156103a457600080fd5b5061038a60125481565b3480156103ba57600080fd5b5061038a600f5481565b3480156103d057600080fd5b506103736103df366004612454565b610aa5565b3480156103f057600080fd5b5061038a7fbf575aa07286781f90c1bdc8f4940c6c29874a0c25a1f1fe7661650b409c01ff81565b34801561042457600080fd5b50610373610433366004612471565b610b9e565b34801561044457600080fd5b5061038a6104533660046123fa565b60009081526020819052604090206001015490565b6103736104763660046123fa565b610bcf565b34801561048757600080fd5b506103736104963660046124b2565b610bdc565b3480156104a757600080fd5b506103736104b636600461256e565b610c01565b3480156104c757600080fd5b5061038a61138881565b3480156104dd57600080fd5b506103736104ec3660046124b2565b610c1f565b3480156104fd57600080fd5b5060025461038a565b34801561051257600080fd5b5061038a6105213660046125b7565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b34801561055857600080fd5b50610373610567366004612471565b610c9d565b34801561057857600080fd5b506103736105873660046125b7565b610cb8565b61037361059a366004612428565b610ddb565b3480156105ab57600080fd5b5061033b6105ba3660046123fa565b610fee565b3480156105cb57600080fd5b5061038a6105da366004612454565b61104e565b3480156105eb57600080fd5b506103736105fa366004612428565b6110d4565b34801561060b57600080fd5b506103736111b1565b34801561062057600080fd5b5061033b61062f3660046123fa565b6111e0565b34801561064057600080fd5b5061037361064f3660046123fa565b611210565b34801561066057600080fd5b506102e461066f3660046124b2565b611221565b34801561068057600080fd5b5061030e61124a565b34801561069557600080fd5b5061038a6106a4366004612454565b6001600160a01b031660009081526005602052604090205490565b3480156106cb57600080fd5b5061038a60105481565b3480156106e157600080fd5b5061038a600081565b3480156106f657600080fd5b506103736107053660046125f3565b611259565b34801561071657600080fd5b5061038a610725366004612454565b611264565b34801561073657600080fd5b50610373610745366004612621565b6112ac565b34801561075657600080fd5b5061038a6107653660046125b7565b6112e4565b34801561077657600080fd5b5061030e6107853660046123fa565b6113af565b34801561079657600080fd5b5061038a6107a5366004612454565b6001600160a01b031660009081526004602052604090205490565b3480156107cc57600080fd5b506103736107db3660046124b2565b611466565b3480156107ec57600080fd5b5061038a6107fb366004612454565b6001600160a01b031660009081526007602052604090205490565b34801561082257600080fd5b5060035461038a565b34801561083757600080fd5b506102e46108463660046125b7565b6001600160a01b039182166000908152600e6020908152604080832093909416825291909152205460ff1690565b34801561088057600080fd5b5060125442116102e4565b34801561089757600080fd5b5061038a60115481565b3480156108ad57600080fd5b506103736108bc3660046123fa565b61148b565b60006108cc8261149c565b92915050565b6060600980546108e1906126a1565b80601f016020809104026020016040519081016040528092919081815260200182805461090d906126a1565b801561095a5780601f1061092f5761010080835404028352916020019161095a565b820191906000526020600020905b81548152906001019060200180831161093d57829003601f168201915b5050505050905090565b600061096f826114dc565b506000908152600d60205260409020546001600160a01b031690565b600061099682610fee565b9050806001600160a01b0316836001600160a01b031603610a085760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610a245750610a248133610846565b610a965760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c000060648201526084016109ff565b610aa0838361153b565b505050565b6001600160a01b038116600090815260046020526040902054610ada5760405162461bcd60e51b81526004016109ff906126db565b6000610ae582611264565b905080600003610b075760405162461bcd60e51b81526004016109ff90612721565b6001600160a01b03821660009081526005602052604081208054839290610b2f908490612782565b925050819055508060036000828254610b489190612782565b90915550610b58905082826115a9565b604080516001600160a01b0384168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a15050565b610ba833826116c2565b610bc45760405162461bcd60e51b81526004016109ff9061279a565b610aa0838383611740565b610bd93382610ddb565b50565b600082815260208190526040902060010154610bf7816118dc565b610aa083836118e6565b6000610c0c816118dc565b8151610aa09060139060208501906122c3565b6001600160a01b0381163314610c8f5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016109ff565b610c99828261196a565b5050565b610aa0838383604051806020016040528060008152506112ac565b6001600160a01b038116600090815260046020526040902054610ced5760405162461bcd60e51b81526004016109ff906126db565b6000610cf983836112e4565b905080600003610d1b5760405162461bcd60e51b81526004016109ff90612721565b6001600160a01b03808416600090815260086020908152604080832093861683529290529081208054839290610d52908490612782565b90915550506001600160a01b03831660009081526007602052604081208054839290610d7f908490612782565b90915550610d9090508383836119cf565b604080516001600160a01b038481168252602082018490528516917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a2505050565b600260015403610e2d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109ff565b60026001556012544211610e7a5760405162461bcd60e51b815260206004820152601460248201527353616c65206d757374206265206163746976652160601b60448201526064016109ff565b600081118015610e8b575060058111155b610ee95760405162461bcd60e51b815260206004820152602960248201527f47726561746572207468616e203020616e64206c657373207468616e206571756044820152680c2d840dac2f040e8f60bb1b60648201526084016109ff565b3481601154610ef891906127e8565b14610f3b5760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da08115512081cd95b9d606a1b60448201526064016109ff565b600f80549082906000610f4e8385612782565b9091555050601054600f5461138891610f6691612782565b1115610fb45760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c7960448201526064016109ff565b60005b82811015610fe457610fd284610fcd8385612782565b611a21565b80610fdc81612807565b915050610fb7565b5050600180555050565b6000818152600b60205260408120546001600160a01b0316806108cc5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109ff565b60006001600160a01b0382166110b85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016109ff565b506001600160a01b03166000908152600c602052604090205490565b7fbf575aa07286781f90c1bdc8f4940c6c29874a0c25a1f1fe7661650b409c01ff6110fe816118dc565b600f805490839060006111118385612782565b90915550506010548311156111685760405162461bcd60e51b815260206004820152601760248201527f4578636565646564207265736572766520616d6f756e7400000000000000000060448201526064016109ff565b60005b838110156111935761118185610fcd8385612782565b8061118b81612807565b91505061116b565b5082601060008282546111a69190612820565b909155505050505050565b60006111bc816118dc565b60405133904780156108fc02916000818181858888f19350505050610bd957600080fd5b6000600682815481106111f5576111f5612837565b6000918252602090912001546001600160a01b031692915050565b600061121b816118dc565b50601155565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600a80546108e1906126a1565b610c99338383611a3b565b60008061127060035490565b61127a9047612782565b90506112a583826112a0866001600160a01b031660009081526005602052604090205490565b611b09565b9392505050565b6112b633836116c2565b6112d25760405162461bcd60e51b81526004016109ff9061279a565b6112de84848484611b47565b50505050565b6001600160a01b03821660009081526007602052604081205481906040516370a0823160e01b81523060048201526001600160a01b038616906370a0823190602401602060405180830381865afa158015611343573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611367919061284d565b6113719190612782565b6001600160a01b038086166000908152600860209081526040808320938816835292905220549091506113a79084908390611b09565b949350505050565b6000818152600b60205260409020546060906001600160a01b031661140b5760405162461bcd60e51b81526020600482015260126024820152711d1bdad95b88191bd95cdb9d08195e1a5cdd60721b60448201526064016109ff565b6000611415611b7a565b9050805160000361143557604051806020016040528060008152506112a5565b8061143f84611b89565b604051602001611450929190612866565b6040516020818303038152906040529392505050565b600082815260208190526040902060010154611481816118dc565b610aa0838361196a565b6000611496816118dc565b50601255565b60006001600160e01b031982166380ac58cd60e01b14806114cd57506001600160e01b03198216635b5e139f60e01b145b806108cc57506108cc82611bcd565b6000818152600b60205260409020546001600160a01b0316610bd95760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016109ff565b6000818152600d6020526040902080546001600160a01b0319166001600160a01b038416908117909155819061157082610fee565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b804710156115f95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109ff565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611646576040519150601f19603f3d011682016040523d82523d6000602084013e61164b565b606091505b5050905080610aa05760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109ff565b6000806116ce83610fee565b9050806001600160a01b0316846001600160a01b0316148061171557506001600160a01b038082166000908152600e602090815260408083209388168352929052205460ff165b806113a75750836001600160a01b031661172e84610964565b6001600160a01b031614949350505050565b826001600160a01b031661175382610fee565b6001600160a01b0316146117b75760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016109ff565b6001600160a01b0382166118195760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109ff565b61182460008261153b565b6001600160a01b0383166000908152600c6020526040812080546001929061184d908490612820565b90915550506001600160a01b0382166000908152600c6020526040812080546001929061187b908490612782565b90915550506000818152600b602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610bd98133611c02565b6118f08282611221565b610c99576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556119263390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6119748282611221565b15610c99576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610aa0908490611c66565b610c99828260405180602001604052806000815250611d38565b816001600160a01b0316836001600160a01b031603611a9c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109ff565b6001600160a01b038381166000818152600e6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6002546001600160a01b03841660009081526004602052604081205490918391611b3390866127e8565b611b3d91906128a5565b6113a79190612820565b611b52848484611740565b611b5e84848484611d6b565b6112de5760405162461bcd60e51b81526004016109ff906128c7565b6060601380546108e1906126a1565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480611ba35750819003601f19909101908152919050565b60006001600160e01b03198216637965db0b60e01b14806108cc57506301ffc9a760e01b6001600160e01b03198316146108cc565b611c0c8282611221565b610c9957611c24816001600160a01b03166014611e6c565b611c2f836020611e6c565b604051602001611c40929190612919565b60408051601f198184030181529082905262461bcd60e51b82526109ff916004016123e7565b6000611cbb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166120089092919063ffffffff16565b805190915015610aa05780806020019051810190611cd9919061298e565b610aa05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016109ff565b611d428383612017565b611d4f6000848484611d6b565b610aa05760405162461bcd60e51b81526004016109ff906128c7565b60006001600160a01b0384163b15611e6157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611daf9033908990889088906004016129ab565b6020604051808303816000875af1925050508015611dea575060408051601f3d908101601f19168201909252611de7918101906129e8565b60015b611e47573d808015611e18576040519150601f19603f3d011682016040523d82523d6000602084013e611e1d565b606091505b508051600003611e3f5760405162461bcd60e51b81526004016109ff906128c7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506113a7565b506001949350505050565b60606000611e7b8360026127e8565b611e86906002612782565b67ffffffffffffffff811115611e9e57611e9e6124e2565b6040519080825280601f01601f191660200182016040528015611ec8576020820181803683370190505b509050600360fc1b81600081518110611ee357611ee3612837565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611f1257611f12612837565b60200101906001600160f81b031916908160001a9053506000611f368460026127e8565b611f41906001612782565b90505b6001811115611fb9576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611f7557611f75612837565b1a60f81b828281518110611f8b57611f8b612837565b60200101906001600160f81b031916908160001a90535060049490941c93611fb281612a05565b9050611f44565b5083156112a55760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ff565b60606113a78484600085612159565b6001600160a01b03821661206d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109ff565b6000818152600b60205260409020546001600160a01b0316156120d25760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109ff565b6001600160a01b0382166000908152600c602052604081208054600192906120fb908490612782565b90915550506000818152600b602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060824710156121ba5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016109ff565b6001600160a01b0385163b6122115760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109ff565b600080866001600160a01b0316858760405161222d9190612a1c565b60006040518083038185875af1925050503d806000811461226a576040519150601f19603f3d011682016040523d82523d6000602084013e61226f565b606091505b509150915061227f82828661228a565b979650505050505050565b606083156122995750816112a5565b8251156122a95782518084602001fd5b8160405162461bcd60e51b81526004016109ff91906123e7565b8280546122cf906126a1565b90600052602060002090601f0160209004810192826122f15760008555612337565b82601f1061230a57805160ff1916838001178555612337565b82800160010185558215612337579182015b8281111561233757825182559160200191906001019061231c565b50612343929150612347565b5090565b5b808211156123435760008155600101612348565b6001600160e01b031981168114610bd957600080fd5b60006020828403121561238457600080fd5b81356112a58161235c565b60005b838110156123aa578181015183820152602001612392565b838111156112de5750506000910152565b600081518084526123d381602086016020860161238f565b601f01601f19169290920160200192915050565b6020815260006112a560208301846123bb565b60006020828403121561240c57600080fd5b5035919050565b6001600160a01b0381168114610bd957600080fd5b6000806040838503121561243b57600080fd5b823561244681612413565b946020939093013593505050565b60006020828403121561246657600080fd5b81356112a581612413565b60008060006060848603121561248657600080fd5b833561249181612413565b925060208401356124a181612413565b929592945050506040919091013590565b600080604083850312156124c557600080fd5b8235915060208301356124d781612413565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612513576125136124e2565b604051601f8501601f19908116603f0116810190828211818310171561253b5761253b6124e2565b8160405280935085815286868601111561255457600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561258057600080fd5b813567ffffffffffffffff81111561259757600080fd5b8201601f810184136125a857600080fd5b6113a7848235602084016124f8565b600080604083850312156125ca57600080fd5b82356125d581612413565b915060208301356124d781612413565b8015158114610bd957600080fd5b6000806040838503121561260657600080fd5b823561261181612413565b915060208301356124d7816125e5565b6000806000806080858703121561263757600080fd5b843561264281612413565b9350602085013561265281612413565b925060408501359150606085013567ffffffffffffffff81111561267557600080fd5b8501601f8101871361268657600080fd5b612695878235602084016124f8565b91505092959194509250565b600181811c908216806126b557607f821691505b6020821081036126d557634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156127955761279561276c565b500190565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b60008160001904831182151516156128025761280261276c565b500290565b6000600182016128195761281961276c565b5060010190565b6000828210156128325761283261276c565b500390565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561285f57600080fd5b5051919050565b6000835161287881846020880161238f565b83519083019061288c81836020880161238f565b64173539b7b760d91b9101908152600501949350505050565b6000826128c257634e487b7160e01b600052601260045260246000fd5b500490565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161295181601785016020880161238f565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161298281602884016020880161238f565b01602801949350505050565b6000602082840312156129a057600080fd5b81516112a5816125e5565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129de908301846123bb565b9695505050505050565b6000602082840312156129fa57600080fd5b81516112a58161235c565b600081612a1457612a1461276c565b506000190190565b60008251612a2e81846020870161238f565b919091019291505056fea26469706673582212207ed9428a195c9317f4cfaaeb43f1458913f34da993ebc8ab98f57eae3f76381a64736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d534b48353242585a546b6d7667506f3747706a6a6b326e6b3546684475774e76314b755a46457436634b62442f000000000000000000000000000000000000000000000000000000000000000000000000000000000007000000000000000000000000459f1b1ee38f6e1380bdc25f12dfef033cf3475e0000000000000000000000004ece314198318b9353c3b38cd98bff143ad38f31000000000000000000000000fc7520744d21068af77e15a69fd52753ab816611000000000000000000000000544b14fb19262a19fd3304bbedbc1a149eb416f0000000000000000000000000623191609d54d2779fd9cdcfb336539ed183e66d0000000000000000000000005e8a883a366afba4a44788587fe27c759d282c80000000000000000000000000cc2c9a3a33f1dddaba47d71c80f81e808a5910ed0000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000119400000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000271
-----Decoded View---------------
Arg [0] : baseURI (string): ipfs://QmSKH52BXZTkmvgPo7Gpjjk2nk5FhDuwNv1KuZFEt6cKbD/
Arg [1] : payees (address[]): 0x459F1b1ee38F6e1380bDC25f12DfeF033cF3475E,0x4Ece314198318b9353c3B38cd98BFF143ad38F31,0xfC7520744d21068aF77E15a69fd52753AB816611,0x544b14FB19262a19fD3304bbeDbc1A149eb416f0,0x623191609D54D2779FD9CdCFb336539ED183E66d,0x5e8A883a366aFBA4a44788587Fe27c759D282C80,0xcc2C9a3a33f1Dddaba47D71c80f81e808a5910eD
Arg [2] : shares (uint256[]): 4500,2000,1000,625,625,625,625
-----Encoded View---------------
22 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [4] : 697066733a2f2f516d534b48353242585a546b6d7667506f3747706a6a6b326e
Arg [5] : 6b3546684475774e76314b755a46457436634b62442f00000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [7] : 000000000000000000000000459f1b1ee38f6e1380bdc25f12dfef033cf3475e
Arg [8] : 0000000000000000000000004ece314198318b9353c3b38cd98bff143ad38f31
Arg [9] : 000000000000000000000000fc7520744d21068af77e15a69fd52753ab816611
Arg [10] : 000000000000000000000000544b14fb19262a19fd3304bbedbc1a149eb416f0
Arg [11] : 000000000000000000000000623191609d54d2779fd9cdcfb336539ed183e66d
Arg [12] : 0000000000000000000000005e8a883a366afba4a44788587fe27c759d282c80
Arg [13] : 000000000000000000000000cc2c9a3a33f1dddaba47d71c80f81e808a5910ed
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [15] : 0000000000000000000000000000000000000000000000000000000000001194
Arg [16] : 00000000000000000000000000000000000000000000000000000000000007d0
Arg [17] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000271
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000271
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000271
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000271
Deployed Bytecode Sourcemap
67592:6879:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25452:40;3626:10;25452:40;;;-1:-1:-1;;;;;206:32:1;;;188:51;;25482:9:0;270:2:1;255:18;;248:34;161:18;25452:40:0;;;;;;;67592:6879;;;;;69154:185;;;;;;;;;;-1:-1:-1;69154:185:0;;;;;:::i;:::-;;:::i;:::-;;;844:14:1;;837:22;819:41;;807:2;792:18;69154:185:0;;;;;;;;55168:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;56681:171::-;;;;;;;;;;-1:-1:-1;56681:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1971:32:1;;;1953:51;;1941:2;1926:18;56681:171:0;1807:203:1;56198:417:0;;;;;;;;;;-1:-1:-1;56198:417:0;;;;;:::i;:::-;;:::i;:::-;;68023:43;;;;;;;;;;;;68065:1;68023:43;;;;;2617:25:1;;;2605:2;2590:18;68023:43:0;2471:177:1;67960:54:0;;;;;;;;;;;;;;;;67785:30;;;;;;;;;;;;;;;;27973:453;;;;;;;;;;-1:-1:-1;27973:453:0;;;;;:::i;:::-;;:::i;67712:64::-;;;;;;;;;;;;67751:25;67712:64;;57381:336;;;;;;;;;;-1:-1:-1;57381:336:0;;;;;:::i;:::-;;:::i;42229:131::-;;;;;;;;;;-1:-1:-1;42229:131:0;;;;;:::i;:::-;42303:7;42330:12;;;;;;;;;;:22;;;;42229:131;71958:118;;;;;;:::i;:::-;;:::i;42670:147::-;;;;;;;;;;-1:-1:-1;42670:147:0;;;;;:::i;:::-;;:::i;73752:126::-;;;;;;;;;;-1:-1:-1;73752:126:0;;;;;:::i;:::-;;:::i;67822:41::-;;;;;;;;;;;;67859:4;67822:41;;43814:218;;;;;;;;;;-1:-1:-1;43814:218:0;;;;;:::i;:::-;;:::i;25583:91::-;;;;;;;;;;-1:-1:-1;25654:12:0;;25583:91;;26712:135;;;;;;;;;;-1:-1:-1;26712:135:0;;;;;:::i;:::-;-1:-1:-1;;;;;26809:21:0;;;26782:7;26809:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;26712:135;57788:185;;;;;;;;;;-1:-1:-1;57788:185:0;;;;;:::i;:::-;;:::i;28694:514::-;;;;;;;;;;-1:-1:-1;28694:514:0;;;;;:::i;:::-;;:::i;72267:644::-;;;;;;:::i;:::-;;:::i;54879:222::-;;;;;;;;;;-1:-1:-1;54879:222:0;;;;;:::i;:::-;;:::i;54610:207::-;;;;;;;;;;-1:-1:-1;54610:207:0;;;;;:::i;:::-;;:::i;73282:408::-;;;;;;;;;;-1:-1:-1;73282:408:0;;;;;:::i;:::-;;:::i;74334:134::-;;;;;;;;;;;;;:::i;26938:100::-;;;;;;;;;;-1:-1:-1;26938:100:0;;;;;:::i;:::-;;:::i;74160:115::-;;;;;;;;;;-1:-1:-1;74160:115:0;;;;;:::i;:::-;;:::i;40689:147::-;;;;;;;;;;-1:-1:-1;40689:147:0;;;;;:::i;:::-;;:::i;55337:104::-;;;;;;;;;;;;;:::i;26434:109::-;;;;;;;;;;-1:-1:-1;26434:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;26517:18:0;26490:7;26517:18;;;:9;:18;;;;;;;26434:109;67870:37;;;;;;;;;;;;;;;;39794:49;;;;;;;;;;-1:-1:-1;39794:49:0;39839:4;39794:49;;56924:155;;;;;;;;;;-1:-1:-1;56924:155:0;;;;;:::i;:::-;;:::i;27128:225::-;;;;;;;;;;-1:-1:-1;27128:225:0;;;;;:::i;:::-;;:::i;58044:323::-;;;;;;;;;;-1:-1:-1;58044:323:0;;;;;:::i;:::-;;:::i;27513:260::-;;;;;;;;;;-1:-1:-1;27513:260:0;;;;;:::i;:::-;;:::i;68809:337::-;;;;;;;;;;-1:-1:-1;68809:337:0;;;;;:::i;:::-;;:::i;26230:105::-;;;;;;;;;;-1:-1:-1;26230:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;26311:16:0;26284:7;26311:16;;;:7;:16;;;;;;;26230:105;43110:149;;;;;;;;;;-1:-1:-1;43110:149:0;;;;;:::i;:::-;;:::i;26020:119::-;;;;;;;;;;-1:-1:-1;26020:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;26105:26:0;26078:7;26105:26;;;:19;:26;;;;;;;26020:119;25768:95;;;;;;;;;;-1:-1:-1;25841:14:0;;25768:95;;57150:164;;;;;;;;;;-1:-1:-1;57150:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;57271:25:0;;;57247:4;57271:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;57150:164;68590:113;;;;;;;;;;-1:-1:-1;68676:19:0;;68658:15;:37;68590:113;;67914:37;;;;;;;;;;;;;;;;73942:159;;;;;;;;;;-1:-1:-1;73942:159:0;;;;;:::i;:::-;;:::i;69154:185::-;69271:4;69295:36;69319:11;69295:23;:36::i;:::-;69288:43;69154:185;-1:-1:-1;;69154:185:0:o;55168:100::-;55222:13;55255:5;55248:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55168:100;:::o;56681:171::-;56757:7;56777:23;56792:7;56777:14;:23::i;:::-;-1:-1:-1;56820:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;56820:24:0;;56681:171::o;56198:417::-;56279:13;56295:23;56310:7;56295:14;:23::i;:::-;56279:39;;56343:5;-1:-1:-1;;;;;56337:11:0;:2;-1:-1:-1;;;;;56337:11:0;;56329:57;;;;-1:-1:-1;;;56329:57:0;;8501:2:1;56329:57:0;;;8483:21:1;8540:2;8520:18;;;8513:30;8579:34;8559:18;;;8552:62;-1:-1:-1;;;8630:18:1;;;8623:31;8671:19;;56329:57:0;;;;;;;;;3626:10;-1:-1:-1;;;;;56421:21:0;;;;:62;;-1:-1:-1;56446:37:0;56463:5;3626:10;57150:164;:::i;56446:37::-;56399:174;;;;-1:-1:-1;;;56399:174:0;;8903:2:1;56399:174:0;;;8885:21:1;8942:2;8922:18;;;8915:30;8981:34;8961:18;;;8954:62;9052:32;9032:18;;;9025:60;9102:19;;56399:174:0;8701:426:1;56399:174:0;56586:21;56595:2;56599:7;56586:8;:21::i;:::-;56268:347;56198:417;;:::o;27973:453::-;-1:-1:-1;;;;;28049:16:0;;28068:1;28049:16;;;:7;:16;;;;;;28041:71;;;;-1:-1:-1;;;28041:71:0;;;;;;;:::i;:::-;28125:15;28143:19;28154:7;28143:10;:19::i;:::-;28125:37;;28183:7;28194:1;28183:12;28175:68;;;;-1:-1:-1;;;28175:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28256:18:0;;;;;;:9;:18;;;;;:29;;28278:7;;28256:18;:29;;28278:7;;28256:29;:::i;:::-;;;;;;;;28314:7;28296:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;28334:35:0;;-1:-1:-1;28352:7:0;28361;28334:17;:35::i;:::-;28385:33;;;-1:-1:-1;;;;;206:32:1;;188:51;;270:2;255:18;;248:34;;;28385:33:0;;161:18:1;28385:33:0;;;;;;;28030:396;27973:453;:::o;57381:336::-;57576:41;3626:10;57609:7;57576:18;:41::i;:::-;57568:100;;;;-1:-1:-1;;;57568:100:0;;;;;;;:::i;:::-;57681:28;57691:4;57697:2;57701:7;57681:9;:28::i;71958:118::-;72028:40;72041:10;72053:14;72028:12;:40::i;:::-;71958:118;:::o;42670:147::-;42303:7;42330:12;;;;;;;;;;:22;;;40285:16;40296:4;40285:10;:16::i;:::-;42784:25:::1;42795:4;42801:7;42784:10;:25::i;73752:126::-:0;39839:4;40285:16;39839:4;40285:10;:16::i;:::-;73847:23;;::::1;::::0;:13:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;43814:218::-:0;-1:-1:-1;;;;;43910:23:0;;3626:10;43910:23;43902:83;;;;-1:-1:-1;;;43902:83:0;;11120:2:1;43902:83:0;;;11102:21:1;11159:2;11139:18;;;11132:30;11198:34;11178:18;;;11171:62;-1:-1:-1;;;11249:18:1;;;11242:45;11304:19;;43902:83:0;10918:411:1;43902:83:0;43998:26;44010:4;44016:7;43998:11;:26::i;:::-;43814:218;;:::o;57788:185::-;57926:39;57943:4;57949:2;57953:7;57926:39;;;;;;;;;;;;:16;:39::i;28694:514::-;-1:-1:-1;;;;;28776:16:0;;28795:1;28776:16;;;:7;:16;;;;;;28768:71;;;;-1:-1:-1;;;28768:71:0;;;;;;;:::i;:::-;28852:15;28870:26;28881:5;28888:7;28870:10;:26::i;:::-;28852:44;;28917:7;28928:1;28917:12;28909:68;;;;-1:-1:-1;;;28909:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28990:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;29024:7;;28990:21;:41;;29024:7;;28990:41;:::i;:::-;;;;-1:-1:-1;;;;;;;29042:26:0;;;;;;:19;:26;;;;;:37;;29072:7;;29042:26;:37;;29072:7;;29042:37;:::i;:::-;;;;-1:-1:-1;29092:47:0;;-1:-1:-1;29115:5:0;29122:7;29131;29092:22;:47::i;:::-;29155:45;;;-1:-1:-1;;;;;206:32:1;;;188:51;;270:2;255:18;;248:34;;;29155:45:0;;;;;161:18:1;29155:45:0;;;;;;;28757:451;28694:514;;:::o;72267:644::-;1914:1;2512:7;;:19;2504:63;;;;-1:-1:-1;;;2504:63:0;;11536:2:1;2504:63:0;;;11518:21:1;11575:2;11555:18;;;11548:30;11614:33;11594:18;;;11587:61;11665:18;;2504:63:0;11334:355:1;2504:63:0;1914:1;2645:7;:18;68676:19;;68658:15;:37;72365:47:::1;;;::::0;-1:-1:-1;;;72365:47:0;;11896:2:1;72365:47:0::1;::::0;::::1;11878:21:1::0;11935:2;11915:18;;;11908:30;-1:-1:-1;;;11954:18:1;;;11947:50;12014:18;;72365:47:0::1;11694:344:1::0;72365:47:0::1;72448:1;72431:14;:18;:55;;;;;68065:1;72453:14;:33;;72431:55;72423:109;;;::::0;-1:-1:-1;;;72423:109:0;;12245:2:1;72423:109:0::1;::::0;::::1;12227:21:1::0;12284:2;12264:18;;;12257:30;12323:34;12303:18;;;12296:62;-1:-1:-1;;;12374:18:1;;;12367:39;12423:19;;72423:109:0::1;12043:405:1::0;72423:109:0::1;72582:9;72564:14;72552:9;;:26;;;;:::i;:::-;:39;72544:71;;;::::0;-1:-1:-1;;;72544:71:0;;12828:2:1;72544:71:0::1;::::0;::::1;12810:21:1::0;12867:2;12847:18;;;12840:30;-1:-1:-1;;;12886:18:1;;;12879:49;12945:18;;72544:71:0::1;12626:343:1::0;72544:71:0::1;72645:11;::::0;;;72682:14;;72628::::1;72667:29;72682:14:::0;72645:11;72667:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;72729:16:0::1;::::0;72715:11:::1;::::0;67859:4:::1;::::0;72715:30:::1;::::0;::::1;:::i;:::-;:44;;72707:89;;;::::0;-1:-1:-1;;;72707:89:0;;13176:2:1;72707:89:0::1;::::0;::::1;13158:21:1::0;;;13195:18;;;13188:30;13254:34;13234:18;;;13227:62;13306:18;;72707:89:0::1;12974:356:1::0;72707:89:0::1;72815:9;72810:94;72830:14;72826:1;:18;72810:94;;;72866:26;72876:3:::0;72881:10:::1;72890:1:::0;72881:6;:10:::1;:::i;:::-;72866:9;:26::i;:::-;72846:3:::0;::::1;::::0;::::1;:::i;:::-;;;;72810:94;;;-1:-1:-1::0;;1870:1:0;2824:22;;-1:-1:-1;;72267:644:0:o;54879:222::-;54951:7;54987:16;;;:7;:16;;;;;;-1:-1:-1;;;;;54987:16:0;;55014:56;;;;-1:-1:-1;;;55014:56:0;;13677:2:1;55014:56:0;;;13659:21:1;13716:2;13696:18;;;13689:30;-1:-1:-1;;;13735:18:1;;;13728:54;13799:18;;55014:56:0;13475:348:1;54610:207:0;54682:7;-1:-1:-1;;;;;54710:19:0;;54702:73;;;;-1:-1:-1;;;54702:73:0;;14030:2:1;54702:73:0;;;14012:21:1;14069:2;14049:18;;;14042:30;14108:34;14088:18;;;14081:62;-1:-1:-1;;;14159:18:1;;;14152:39;14208:19;;54702:73:0;13828:405:1;54702:73:0;-1:-1:-1;;;;;;54793:16:0;;;;;:9;:16;;;;;;;54610:207::o;73282:408::-;67751:25;40285:16;40296:4;40285:10;:16::i;:::-;73400:11:::1;::::0;;;73437:14;;73383::::1;73422:29;73437:14:::0;73400:11;73422:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;73488:16:0::1;::::0;73470:34;::::1;;73462:70;;;::::0;-1:-1:-1;;;73462:70:0;;14440:2:1;73462:70:0::1;::::0;::::1;14422:21:1::0;14479:2;14459:18;;;14452:30;14518:25;14498:18;;;14491:53;14561:18;;73462:70:0::1;14238:347:1::0;73462:70:0::1;73548:6;73543:95;73564:14;73560:1;:18;73543:95;;;73600:26;73610:3:::0;73615:10:::1;73624:1:::0;73615:6;:10:::1;:::i;73600:26::-;73580:3:::0;::::1;::::0;::::1;:::i;:::-;;;;73543:95;;;;73668:14;73648:16;;:34;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;73282:408:0:o;74334:134::-;39839:4;40285:16;39839:4;40285:10;:16::i;:::-;74412:47:::1;::::0;74420:10:::1;::::0;74437:21:::1;74412:47:::0;::::1;;;::::0;::::1;::::0;;;74437:21;74420:10;74412:47;::::1;;;;;;74404:56;;;::::0;::::1;26938:100:::0;26989:7;27016;27024:5;27016:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;27016:14:0;;26938:100;-1:-1:-1;;26938:100:0:o;74160:115::-;39839:4;40285:16;39839:4;40285:10;:16::i;:::-;-1:-1:-1;74245:9:0::1;:22:::0;74160:115::o;40689:147::-;40775:4;40799:12;;;;;;;;;;;-1:-1:-1;;;;;40799:29:0;;;;;;;;;;;;;;;40689:147::o;55337:104::-;55393:13;55426:7;55419:14;;;;;:::i;56924:155::-;57019:52;3626:10;57052:8;57062;57019:18;:52::i;27128:225::-;27186:7;27206:21;27254:15;25841:14;;;25768:95;27254:15;27230:39;;:21;:39;:::i;:::-;27206:63;;27287:58;27303:7;27312:13;27327:17;27336:7;-1:-1:-1;;;;;26517:18:0;26490:7;26517:18;;;:9;:18;;;;;;;26434:109;27327:17;27287:15;:58::i;:::-;27280:65;27128:225;-1:-1:-1;;;27128:225:0:o;58044:323::-;58218:41;3626:10;58251:7;58218:18;:41::i;:::-;58210:100;;;;-1:-1:-1;;;58210:100:0;;;;;;;:::i;:::-;58321:38;58335:4;58341:2;58345:7;58354:4;58321:13;:38::i;:::-;58044:323;;;;:::o;27513:260::-;-1:-1:-1;;;;;26105:26:0;;27585:7;26105:26;;;:19;:26;;;;;;27585:7;;27629:30;;-1:-1:-1;;;27629:30:0;;27653:4;27629:30;;;1953:51:1;-1:-1:-1;;;;;27629:15:0;;;;;1926:18:1;;27629:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;-1:-1:-1;;;;;26809:21:0;;;26782:7;26809:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;27605:77;;-1:-1:-1;27700:65:0;;27716:7;;27605:77;;27287:15;:58::i;27700:65::-;27693:72;27513:260;-1:-1:-1;;;;27513:260:0:o;68809:337::-;59939:4;59963:16;;;:7;:16;;;;;;68906:13;;-1:-1:-1;;;;;59963:16:0;68932:47;;;;-1:-1:-1;;;68932:47:0;;15243:2:1;68932:47:0;;;15225:21:1;15282:2;15262:18;;;15255:30;-1:-1:-1;;;15301:18:1;;;15294:48;15359:18;;68932:47:0;15041:342:1;68932:47:0;68990:21;69014:10;:8;:10::i;:::-;68990:34;;69048:7;69042:21;69067:1;69042:26;:96;;;;;;;;;;;;;;;;;69095:7;69104:18;69114:7;69104:9;:18::i;:::-;69078:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69035:103;68809:337;-1:-1:-1;;;68809:337:0:o;43110:149::-;42303:7;42330:12;;;;;;;;;;:22;;;40285:16;40296:4;40285:10;:16::i;:::-;43225:26:::1;43237:4;43243:7;43225:11;:26::i;73942:159::-:0;39839:4;40285:16;39839:4;40285:10;:16::i;:::-;-1:-1:-1;74051:19:0::1;:42:::0;73942:159::o;54241:305::-;54343:4;-1:-1:-1;;;;;;54380:40:0;;-1:-1:-1;;;54380:40:0;;:105;;-1:-1:-1;;;;;;;54437:48:0;;-1:-1:-1;;;54437:48:0;54380:105;:158;;;;54502:36;54526:11;54502:23;:36::i;64656:135::-;59939:4;59963:16;;;:7;:16;;;;;;-1:-1:-1;;;;;59963:16:0;64730:53;;;;-1:-1:-1;;;64730:53:0;;13677:2:1;64730:53:0;;;13659:21:1;13716:2;13696:18;;;13689:30;-1:-1:-1;;;13735:18:1;;;13728:54;13799:18;;64730:53:0;13475:348:1;63935:174:0;64010:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;64010:29:0;-1:-1:-1;;;;;64010:29:0;;;;;;;;:24;;64064:23;64010:24;64064:14;:23::i;:::-;-1:-1:-1;;;;;64055:46:0;;;;;;;;;;;63935:174;;:::o;6260:317::-;6375:6;6350:21;:31;;6342:73;;;;-1:-1:-1;;;6342:73:0;;16232:2:1;6342:73:0;;;16214:21:1;16271:2;16251:18;;;16244:30;16310:31;16290:18;;;16283:59;16359:18;;6342:73:0;16030:353:1;6342:73:0;6429:12;6447:9;-1:-1:-1;;;;;6447:14:0;6469:6;6447:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6428:52;;;6499:7;6491:78;;;;-1:-1:-1;;;6491:78:0;;16800:2:1;6491:78:0;;;16782:21:1;16839:2;16819:18;;;16812:30;16878:34;16858:18;;;16851:62;16949:28;16929:18;;;16922:56;16995:19;;6491:78:0;16598:422:1;60168:264:0;60261:4;60278:13;60294:23;60309:7;60294:14;:23::i;:::-;60278:39;;60347:5;-1:-1:-1;;;;;60336:16:0;:7;-1:-1:-1;;;;;60336:16:0;;:52;;;-1:-1:-1;;;;;;57271:25:0;;;57247:4;57271:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;60356:32;60336:87;;;;60416:7;-1:-1:-1;;;;;60392:31:0;:20;60404:7;60392:11;:20::i;:::-;-1:-1:-1;;;;;60392:31:0;;;60168:264;-1:-1:-1;;;;60168:264:0:o;63191:625::-;63350:4;-1:-1:-1;;;;;63323:31:0;:23;63338:7;63323:14;:23::i;:::-;-1:-1:-1;;;;;63323:31:0;;63315:81;;;;-1:-1:-1;;;63315:81:0;;17227:2:1;63315:81:0;;;17209:21:1;17266:2;17246:18;;;17239:30;17305:34;17285:18;;;17278:62;-1:-1:-1;;;17356:18:1;;;17349:35;17401:19;;63315:81:0;17025:401:1;63315:81:0;-1:-1:-1;;;;;63415:16:0;;63407:65;;;;-1:-1:-1;;;63407:65:0;;17633:2:1;63407:65:0;;;17615:21:1;17672:2;17652:18;;;17645:30;17711:34;17691:18;;;17684:62;-1:-1:-1;;;17762:18:1;;;17755:34;17806:19;;63407:65:0;17431:400:1;63407:65:0;63589:29;63606:1;63610:7;63589:8;:29::i;:::-;-1:-1:-1;;;;;63631:15:0;;;;;;:9;:15;;;;;:20;;63650:1;;63631:15;:20;;63650:1;;63631:20;:::i;:::-;;;;-1:-1:-1;;;;;;;63662:13:0;;;;;;:9;:13;;;;;:18;;63679:1;;63662:13;:18;;63679:1;;63662:18;:::i;:::-;;;;-1:-1:-1;;63691:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;63691:21:0;-1:-1:-1;;;;;63691:21:0;;;;;;;;;63730:27;;63691:16;;63730:27;;;;;;;56268:347;56198:417;;:::o;41140:105::-;41207:30;41218:4;3626:10;41207;:30::i;45411:238::-;45495:22;45503:4;45509:7;45495;:22::i;:::-;45490:152;;45534:6;:12;;;;;;;;;;;-1:-1:-1;;;;;45534:29:0;;;;;;;;;:36;;-1:-1:-1;;45534:36:0;45566:4;45534:36;;;45617:12;3626:10;;3546:98;45617:12;-1:-1:-1;;;;;45590:40:0;45608:7;-1:-1:-1;;;;;45590:40:0;45602:4;45590:40;;;;;;;;;;45411:238;;:::o;45829:239::-;45913:22;45921:4;45927:7;45913;:22::i;:::-;45909:152;;;45984:5;45952:12;;;;;;;;;;;-1:-1:-1;;;;;45952:29:0;;;;;;;;;;:37;;-1:-1:-1;;45952:37:0;;;46009:40;3626:10;;45952:12;;46009:40;;45984:5;46009:40;45829:239;;:::o;18293:211::-;18437:58;;;-1:-1:-1;;;;;206:32:1;;18437:58:0;;;188:51:1;255:18;;;;248:34;;;18437:58:0;;;;;;;;;;161:18:1;;;;18437:58:0;;;;;;;;-1:-1:-1;;;;;18437:58:0;-1:-1:-1;;;18437:58:0;;;18410:86;;18430:5;;18410:19;:86::i;60774:110::-;60850:26;60860:2;60864:7;60850:26;;;;;;;;;;;;:9;:26::i;64252:315::-;64407:8;-1:-1:-1;;;;;64398:17:0;:5;-1:-1:-1;;;;;64398:17:0;;64390:55;;;;-1:-1:-1;;;64390:55:0;;18038:2:1;64390:55:0;;;18020:21:1;18077:2;18057:18;;;18050:30;18116:27;18096:18;;;18089:55;18161:18;;64390:55:0;17836:349:1;64390:55:0;-1:-1:-1;;;;;64456:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;64456:46:0;;;;;;;;;;64518:41;;819::1;;;64518::0;;792:18:1;64518:41:0;;;;;;;64252:315;;;:::o;29386:248::-;29596:12;;-1:-1:-1;;;;;29576:16:0;;29532:7;29576:16;;;:7;:16;;;;;;29532:7;;29611:15;;29560:32;;:13;:32;:::i;:::-;29559:49;;;;:::i;:::-;:67;;;;:::i;59248:313::-;59404:28;59414:4;59420:2;59424:7;59404:9;:28::i;:::-;59451:47;59474:4;59480:2;59484:7;59493:4;59451:22;:47::i;:::-;59443:110;;;;-1:-1:-1;;;59443:110:0;;;;;;;:::i;69700:114::-;69760:13;69793;69786:20;;;;;:::i;69916:1745::-;69981:17;70415:4;70408;70402:11;70398:22;70507:1;70501:4;70494:15;70582:4;70579:1;70575:12;70568:19;;;70664:1;70659:3;70652:14;70768:3;71007:5;70989:428;71055:1;71050:3;71046:11;71039:18;;71226:2;71220:4;71216:13;71212:2;71208:22;71203:3;71195:36;71320:2;71310:13;;71377:25;70989:428;71377:25;-1:-1:-1;71447:13:0;;;-1:-1:-1;;71562:14:0;;;71624:19;;;71562:14;69916:1745;-1:-1:-1;69916:1745:0:o;40393:204::-;40478:4;-1:-1:-1;;;;;;40502:47:0;;-1:-1:-1;;;40502:47:0;;:87;;-1:-1:-1;;;;;;;;;;37757:40:0;;;40553:36;37648:157;41535:505;41624:22;41632:4;41638:7;41624;:22::i;:::-;41619:414;;41812:41;41840:7;-1:-1:-1;;;;;41812:41:0;41850:2;41812:19;:41::i;:::-;41926:38;41954:4;41961:2;41926:19;:38::i;:::-;41717:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;41717:270:0;;;;;;;;;;-1:-1:-1;;;41663:358:0;;;;;;;:::i;21360:716::-;21784:23;21810:69;21838:4;21810:69;;;;;;;;;;;;;;;;;21818:5;-1:-1:-1;;;;;21810:27:0;;;:69;;;;;:::i;:::-;21894:17;;21784:95;;-1:-1:-1;21894:21:0;21890:179;;21991:10;21980:30;;;;;;;;;;;;:::i;:::-;21972:85;;;;-1:-1:-1;;;21972:85:0;;20074:2:1;21972:85:0;;;20056:21:1;20113:2;20093:18;;;20086:30;20152:34;20132:18;;;20125:62;-1:-1:-1;;;20203:18:1;;;20196:40;20253:19;;21972:85:0;19872:406:1;61111:319:0;61240:18;61246:2;61250:7;61240:5;:18::i;:::-;61291:53;61322:1;61326:2;61330:7;61339:4;61291:22;:53::i;:::-;61269:153;;;;-1:-1:-1;;;61269:153:0;;;;;;;:::i;65355:853::-;65509:4;-1:-1:-1;;;;;65530:13:0;;5294:19;:23;65526:675;;65566:71;;-1:-1:-1;;;65566:71:0;;-1:-1:-1;;;;;65566:36:0;;;;;:71;;3626:10;;65617:4;;65623:7;;65632:4;;65566:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65566:71:0;;;;;;;;-1:-1:-1;;65566:71:0;;;;;;;;;;;;:::i;:::-;;;65562:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65807:6;:13;65824:1;65807:18;65803:328;;65850:60;;-1:-1:-1;;;65850:60:0;;;;;;;:::i;65803:328::-;66081:6;66075:13;66066:6;66062:2;66058:15;66051:38;65562:584;-1:-1:-1;;;;;;65688:51:0;-1:-1:-1;;;65688:51:0;;-1:-1:-1;65681:58:0;;65526:675;-1:-1:-1;66185:4:0;65355:853;;;;;;:::o;32043:451::-;32118:13;32144:19;32176:10;32180:6;32176:1;:10;:::i;:::-;:14;;32189:1;32176:14;:::i;:::-;32166:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32166:25:0;;32144:47;;-1:-1:-1;;;32202:6:0;32209:1;32202:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;32202:15:0;;;;;;;;;-1:-1:-1;;;32228:6:0;32235:1;32228:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;32228:15:0;;;;;;;;-1:-1:-1;32259:9:0;32271:10;32275:6;32271:1;:10;:::i;:::-;:14;;32284:1;32271:14;:::i;:::-;32259:26;;32254:135;32291:1;32287;:5;32254:135;;;-1:-1:-1;;;32339:5:0;32347:3;32339:11;32326:25;;;;;;;:::i;:::-;;;;32314:6;32321:1;32314:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;32314:37:0;;;;;;;;-1:-1:-1;32376:1:0;32366:11;;;;;32294:3;;;:::i;:::-;;;32254:135;;;-1:-1:-1;32407:10:0;;32399:55;;;;-1:-1:-1;;;32399:55:0;;21374:2:1;32399:55:0;;;21356:21:1;;;21393:18;;;21386:30;21452:34;21432:18;;;21425:62;21504:18;;32399:55:0;21172:356:1;7744:229:0;7881:12;7913:52;7935:6;7943:4;7949:1;7952:12;7913:21;:52::i;61766:439::-;-1:-1:-1;;;;;61846:16:0;;61838:61;;;;-1:-1:-1;;;61838:61:0;;21735:2:1;61838:61:0;;;21717:21:1;;;21754:18;;;21747:30;21813:34;21793:18;;;21786:62;21865:18;;61838:61:0;21533:356:1;61838:61:0;59939:4;59963:16;;;:7;:16;;;;;;-1:-1:-1;;;;;59963:16:0;:30;61910:58;;;;-1:-1:-1;;;61910:58:0;;22096:2:1;61910:58:0;;;22078:21:1;22135:2;22115:18;;;22108:30;22174;22154:18;;;22147:58;22222:18;;61910:58:0;21894:352:1;61910:58:0;-1:-1:-1;;;;;62039:13:0;;;;;;:9;:13;;;;;:18;;62056:1;;62039:13;:18;;62056:1;;62039:18;:::i;:::-;;;;-1:-1:-1;;62068:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;62068:21:0;-1:-1:-1;;;;;62068:21:0;;;;;;;;62107:33;;62068:16;;;62107:33;;62068:16;;62107:33;43814:218;;:::o;8864:510::-;9034:12;9092:5;9067:21;:30;;9059:81;;;;-1:-1:-1;;;9059:81:0;;22453:2:1;9059:81:0;;;22435:21:1;22492:2;22472:18;;;22465:30;22531:34;22511:18;;;22504:62;-1:-1:-1;;;22582:18:1;;;22575:36;22628:19;;9059:81:0;22251:402:1;9059:81:0;-1:-1:-1;;;;;5294:19:0;;;9151:60;;;;-1:-1:-1;;;9151:60:0;;22860:2:1;9151:60:0;;;22842:21:1;22899:2;22879:18;;;22872:30;22938:31;22918:18;;;22911:59;22987:18;;9151:60:0;22658:353:1;9151:60:0;9225:12;9239:23;9266:6;-1:-1:-1;;;;;9266:11:0;9285:5;9292:4;9266:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9224:73;;;;9315:51;9332:7;9341:10;9353:12;9315:16;:51::i;:::-;9308:58;8864:510;-1:-1:-1;;;;;;;8864:510:0:o;11550:762::-;11700:12;11729:7;11725:580;;;-1:-1:-1;11760:10:0;11753:17;;11725:580;11874:17;;:21;11870:424;;12122:10;12116:17;12183:15;12170:10;12166:2;12162:19;12155:44;11870:424;12265:12;12258:20;;-1:-1:-1;;;12258:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;293:131:1;-1:-1:-1;;;;;;367:32:1;;357:43;;347:71;;414:1;411;404:12;429:245;487:6;540:2;528:9;519:7;515:23;511:32;508:52;;;556:1;553;546:12;508:52;595:9;582:23;614:30;638:5;614:30;:::i;871:258::-;943:1;953:113;967:6;964:1;961:13;953:113;;;1043:11;;;1037:18;1024:11;;;1017:39;989:2;982:10;953:113;;;1084:6;1081:1;1078:13;1075:48;;;-1:-1:-1;;1119:1:1;1101:16;;1094:27;871:258::o;1134:::-;1176:3;1214:5;1208:12;1241:6;1236:3;1229:19;1257:63;1313:6;1306:4;1301:3;1297:14;1290:4;1283:5;1279:16;1257:63;:::i;:::-;1374:2;1353:15;-1:-1:-1;;1349:29:1;1340:39;;;;1381:4;1336:50;;1134:258;-1:-1:-1;;1134:258:1:o;1397:220::-;1546:2;1535:9;1528:21;1509:4;1566:45;1607:2;1596:9;1592:18;1584:6;1566:45;:::i;1622:180::-;1681:6;1734:2;1722:9;1713:7;1709:23;1705:32;1702:52;;;1750:1;1747;1740:12;1702:52;-1:-1:-1;1773:23:1;;1622:180;-1:-1:-1;1622:180:1:o;2015:131::-;-1:-1:-1;;;;;2090:31:1;;2080:42;;2070:70;;2136:1;2133;2126:12;2151:315;2219:6;2227;2280:2;2268:9;2259:7;2255:23;2251:32;2248:52;;;2296:1;2293;2286:12;2248:52;2335:9;2322:23;2354:31;2379:5;2354:31;:::i;:::-;2404:5;2456:2;2441:18;;;;2428:32;;-1:-1:-1;;;2151:315:1:o;2653:255::-;2720:6;2773:2;2761:9;2752:7;2748:23;2744:32;2741:52;;;2789:1;2786;2779:12;2741:52;2828:9;2815:23;2847:31;2872:5;2847:31;:::i;3095:456::-;3172:6;3180;3188;3241:2;3229:9;3220:7;3216:23;3212:32;3209:52;;;3257:1;3254;3247:12;3209:52;3296:9;3283:23;3315:31;3340:5;3315:31;:::i;:::-;3365:5;-1:-1:-1;3422:2:1;3407:18;;3394:32;3435:33;3394:32;3435:33;:::i;:::-;3095:456;;3487:7;;-1:-1:-1;;;3541:2:1;3526:18;;;;3513:32;;3095:456::o;3741:315::-;3809:6;3817;3870:2;3858:9;3849:7;3845:23;3841:32;3838:52;;;3886:1;3883;3876:12;3838:52;3922:9;3909:23;3899:33;;3982:2;3971:9;3967:18;3954:32;3995:31;4020:5;3995:31;:::i;:::-;4045:5;4035:15;;;3741:315;;;;;:::o;4061:127::-;4122:10;4117:3;4113:20;4110:1;4103:31;4153:4;4150:1;4143:15;4177:4;4174:1;4167:15;4193:632;4258:5;4288:18;4329:2;4321:6;4318:14;4315:40;;;4335:18;;:::i;:::-;4410:2;4404:9;4378:2;4464:15;;-1:-1:-1;;4460:24:1;;;4486:2;4456:33;4452:42;4440:55;;;4510:18;;;4530:22;;;4507:46;4504:72;;;4556:18;;:::i;:::-;4596:10;4592:2;4585:22;4625:6;4616:15;;4655:6;4647;4640:22;4695:3;4686:6;4681:3;4677:16;4674:25;4671:45;;;4712:1;4709;4702:12;4671:45;4762:6;4757:3;4750:4;4742:6;4738:17;4725:44;4817:1;4810:4;4801:6;4793;4789:19;4785:30;4778:41;;;;4193:632;;;;;:::o;4830:451::-;4899:6;4952:2;4940:9;4931:7;4927:23;4923:32;4920:52;;;4968:1;4965;4958:12;4920:52;5008:9;4995:23;5041:18;5033:6;5030:30;5027:50;;;5073:1;5070;5063:12;5027:50;5096:22;;5149:4;5141:13;;5137:27;-1:-1:-1;5127:55:1;;5178:1;5175;5168:12;5127:55;5201:74;5267:7;5262:2;5249:16;5244:2;5240;5236:11;5201:74;:::i;5286:402::-;5368:6;5376;5429:2;5417:9;5408:7;5404:23;5400:32;5397:52;;;5445:1;5442;5435:12;5397:52;5484:9;5471:23;5503:31;5528:5;5503:31;:::i;:::-;5553:5;-1:-1:-1;5610:2:1;5595:18;;5582:32;5623:33;5582:32;5623:33;:::i;5945:118::-;6031:5;6024:13;6017:21;6010:5;6007:32;5997:60;;6053:1;6050;6043:12;6068:382;6133:6;6141;6194:2;6182:9;6173:7;6169:23;6165:32;6162:52;;;6210:1;6207;6200:12;6162:52;6249:9;6236:23;6268:31;6293:5;6268:31;:::i;:::-;6318:5;-1:-1:-1;6375:2:1;6360:18;;6347:32;6388:30;6347:32;6388:30;:::i;6455:795::-;6550:6;6558;6566;6574;6627:3;6615:9;6606:7;6602:23;6598:33;6595:53;;;6644:1;6641;6634:12;6595:53;6683:9;6670:23;6702:31;6727:5;6702:31;:::i;:::-;6752:5;-1:-1:-1;6809:2:1;6794:18;;6781:32;6822:33;6781:32;6822:33;:::i;:::-;6874:7;-1:-1:-1;6928:2:1;6913:18;;6900:32;;-1:-1:-1;6983:2:1;6968:18;;6955:32;7010:18;6999:30;;6996:50;;;7042:1;7039;7032:12;6996:50;7065:22;;7118:4;7110:13;;7106:27;-1:-1:-1;7096:55:1;;7147:1;7144;7137:12;7096:55;7170:74;7236:7;7231:2;7218:16;7213:2;7209;7205:11;7170:74;:::i;:::-;7160:84;;;6455:795;;;;;;;:::o;7914:380::-;7993:1;7989:12;;;;8036;;;8057:61;;8111:4;8103:6;8099:17;8089:27;;8057:61;8164:2;8156:6;8153:14;8133:18;8130:38;8127:161;;8210:10;8205:3;8201:20;8198:1;8191:31;8245:4;8242:1;8235:15;8273:4;8270:1;8263:15;8127:161;;7914:380;;;:::o;9132:402::-;9334:2;9316:21;;;9373:2;9353:18;;;9346:30;9412:34;9407:2;9392:18;;9385:62;-1:-1:-1;;;9478:2:1;9463:18;;9456:36;9524:3;9509:19;;9132:402::o;9539:407::-;9741:2;9723:21;;;9780:2;9760:18;;;9753:30;9819:34;9814:2;9799:18;;9792:62;-1:-1:-1;;;9885:2:1;9870:18;;9863:41;9936:3;9921:19;;9539:407::o;9951:127::-;10012:10;10007:3;10003:20;10000:1;9993:31;10043:4;10040:1;10033:15;10067:4;10064:1;10057:15;10083:128;10123:3;10154:1;10150:6;10147:1;10144:13;10141:39;;;10160:18;;:::i;:::-;-1:-1:-1;10196:9:1;;10083:128::o;10503:410::-;10705:2;10687:21;;;10744:2;10724:18;;;10717:30;10783:34;10778:2;10763:18;;10756:62;-1:-1:-1;;;10849:2:1;10834:18;;10827:44;10903:3;10888:19;;10503:410::o;12453:168::-;12493:7;12559:1;12555;12551:6;12547:14;12544:1;12541:21;12536:1;12529:9;12522:17;12518:45;12515:71;;;12566:18;;:::i;:::-;-1:-1:-1;12606:9:1;;12453:168::o;13335:135::-;13374:3;13395:17;;;13392:43;;13415:18;;:::i;:::-;-1:-1:-1;13462:1:1;13451:13;;13335:135::o;14590:125::-;14630:4;14658:1;14655;14652:8;14649:34;;;14663:18;;:::i;:::-;-1:-1:-1;14700:9:1;;14590:125::o;14720:127::-;14781:10;14776:3;14772:20;14769:1;14762:31;14812:4;14809:1;14802:15;14836:4;14833:1;14826:15;14852:184;14922:6;14975:2;14963:9;14954:7;14950:23;14946:32;14943:52;;;14991:1;14988;14981:12;14943:52;-1:-1:-1;15014:16:1;;14852:184;-1:-1:-1;14852:184:1:o;15388:637::-;15668:3;15706:6;15700:13;15722:53;15768:6;15763:3;15756:4;15748:6;15744:17;15722:53;:::i;:::-;15838:13;;15797:16;;;;15860:57;15838:13;15797:16;15894:4;15882:17;;15860:57;:::i;:::-;-1:-1:-1;;;15939:20:1;;15968:22;;;16017:1;16006:13;;15388:637;-1:-1:-1;;;;15388:637:1:o;18190:217::-;18230:1;18256;18246:132;;18300:10;18295:3;18291:20;18288:1;18281:31;18335:4;18332:1;18325:15;18363:4;18360:1;18353:15;18246:132;-1:-1:-1;18392:9:1;;18190:217::o;18412:414::-;18614:2;18596:21;;;18653:2;18633:18;;;18626:30;18692:34;18687:2;18672:18;;18665:62;-1:-1:-1;;;18758:2:1;18743:18;;18736:48;18816:3;18801:19;;18412:414::o;18831:786::-;19242:25;19237:3;19230:38;19212:3;19297:6;19291:13;19313:62;19368:6;19363:2;19358:3;19354:12;19347:4;19339:6;19335:17;19313:62;:::i;:::-;-1:-1:-1;;;19434:2:1;19394:16;;;19426:11;;;19419:40;19484:13;;19506:63;19484:13;19555:2;19547:11;;19540:4;19528:17;;19506:63;:::i;:::-;19589:17;19608:2;19585:26;;18831:786;-1:-1:-1;;;;18831:786:1:o;19622:245::-;19689:6;19742:2;19730:9;19721:7;19717:23;19713:32;19710:52;;;19758:1;19755;19748:12;19710:52;19790:9;19784:16;19809:28;19831:5;19809:28;:::i;20283:489::-;-1:-1:-1;;;;;20552:15:1;;;20534:34;;20604:15;;20599:2;20584:18;;20577:43;20651:2;20636:18;;20629:34;;;20699:3;20694:2;20679:18;;20672:31;;;20477:4;;20720:46;;20746:19;;20738:6;20720:46;:::i;:::-;20712:54;20283:489;-1:-1:-1;;;;;;20283:489:1:o;20777:249::-;20846:6;20899:2;20887:9;20878:7;20874:23;20870:32;20867:52;;;20915:1;20912;20905:12;20867:52;20947:9;20941:16;20966:30;20990:5;20966:30;:::i;21031:136::-;21070:3;21098:5;21088:39;;21107:18;;:::i;:::-;-1:-1:-1;;;21143:18:1;;21031:136::o;23016:274::-;23145:3;23183:6;23177:13;23199:53;23245:6;23240:3;23233:4;23225:6;23221:17;23199:53;:::i;:::-;23268:16;;;;;23016:274;-1:-1:-1;;23016:274:1:o
Swarm Source
ipfs://7ed9428a195c9317f4cfaaeb43f1458913f34da993ebc8ab98f57eae3f76381a
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.