ETH Price: $3,125.85 (-0.62%)

Token

 

Overview

Max Total Supply

973

Holders

573

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x167beb5bb21bede7461ef8716f765371e45588db
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CosmicLabsShop

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-20
*/

// File: openzeppelin-solidity/contracts/utils/math/SafeMath.sol



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.3.2 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.3.2 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.3.2 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.3.2 (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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts v4.3.2 (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens 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 amount
    ) 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, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: cosmicToken.sol

pragma solidity 0.8.7;




/// SPDX-License-Identifier: UNLICENSED

interface IDuck {
	function balanceOG(address _user) external view returns(uint256);
}

contract CosmicToken is ERC20("CosmicUtilityToken", "CUT") 
{
   
    using SafeMath for uint256;
   
    uint256 public totalTokensBurned = 0;
    address[] internal stakeholders;
    address  payable private owner;
    

    //token Genesis per day
    uint256 constant public GENESIS_RATE = 20 ether; 
    
    //token duck per day
    uint256 constant public DUCK_RATE = 5 ether; 
    
    //token for  genesis minting
	uint256 constant public GENESIS_ISSUANCE = 280 ether;
	
	//token for duck minting
	uint256 constant public DUCK_ISSUANCE = 70 ether;
	
	
	
	// Tue Mar 18 2031 17:46:47 GMT+0000
	uint256 constant public END = 1931622407;

	mapping(address => uint256) public rewards;
	mapping(address => uint256) public lastUpdate;
	
	
    IDuck public ducksContract;
   
    constructor(address initDuckContract) 
    {
        owner = payable(msg.sender);
        ducksContract = IDuck(initDuckContract);
    }
   

    function WhoOwns() public view returns (address) {
        return owner;
    }
   
    modifier Owned {
         require(msg.sender == owner);
         _;
 }
   
    function getContractAddress() public view returns (address) {
        return address(this);
    }

	function min(uint256 a, uint256 b) internal pure returns (uint256) {
		return a < b ? a : b;
	}    
	
	modifier contractAddressOnly
    {
         require(msg.sender == address(ducksContract));
         _;
    }
    
   	// called when minting many NFTs
	function updateRewardOnMint(address _user, uint256 _tokenId) external contractAddressOnly
	{
	    if(_tokenId <= 1000)
		{
            _mint(_user,GENESIS_ISSUANCE);	  	        
		}
		else if(_tokenId >= 1001)
		{
            _mint(_user,DUCK_ISSUANCE);	  	        	        
		}
	}
	

	function getReward(address _to, uint256 totalPayout) external contractAddressOnly
	{
		_mint(_to, (totalPayout * 10 ** 18));
		
	}
	
	function burn(address _from, uint256 _amount) external 
	{
	    require(msg.sender == _from, "You do not own these tokens");
		_burn(_from, _amount);
		totalTokensBurned += _amount;
	}


  
   
}
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.3.2 (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol


// OpenZeppelin Contracts v4.3.2 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.3.2 (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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.3.2 (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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts v4.3.2 (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts v4.3.2 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.3.2 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/ERC1155.sol


// OpenZeppelin Contracts v4.3.2 (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

    // Mapping from account to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == type(IERC1155MetadataURI).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC1155-isApprovedForAll}.
     */
    function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[account][operator];
    }

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/extensions/ERC1155Burnable.sol


// OpenZeppelin Contracts v4.3.2 (token/ERC1155/extensions/ERC1155Burnable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burnBatch(account, ids, values);
    }
}

// File: cosmicPass.sol

pragma solidity 0.8.7;


contract CosmicLabsShop is ERC1155Burnable, Ownable {
   
    using Strings for uint256;
    CosmicToken public cosmictoken;
   
    string public baseURI;
    string public baseExtension = ".json";
    
    uint256 public babyPrice = 250 ether;
    uint256 public cosmicPrice = 750 ether;
    uint256 public genesisPrice = 1500 ether;
    uint256 public generatorPrice = 700 ether;
    
    bool public fusionGeneratorOpen = false;
    
    modifier isFusionMintOpen
    {
        require(fusionGeneratorOpen == true);
        _;
    }

    constructor(string memory _initBaseURI, address _yield) ERC1155(_initBaseURI)
    {
        setBaseURI(_initBaseURI);
        cosmictoken = CosmicToken(_yield);
    }   
    
    function setYieldToken(address _yield) public onlyOwner
    {
        cosmictoken = CosmicToken(_yield);
    }
    
    function openFusionGenerator(bool _open) public onlyOwner
    {
        fusionGeneratorOpen = _open;
    }
    
    function setBabyPrice(uint256 _price) public onlyOwner
    {
        babyPrice = (_price * 10 ** 18);
    }
    function setCosmicPrice(uint256 _price) public onlyOwner
    {
        cosmicPrice = (_price * 10 ** 18);
    }
    function setGenesisPrice(uint256 _price) public onlyOwner
    {
        genesisPrice = (_price * 10 ** 18);
    }
    function setGeneratorPrice(uint256 _price) public onlyOwner
    {
        generatorPrice = (_price * 10 ** 18);
    }
    
    function doYouOwn(uint256 tokenId) internal view returns (bool) 
    {
        return balanceOf(msg.sender, tokenId) != 0;
    }
    
    function BabyAlphaPass() public payable 
    {
        require(cosmictoken.balanceOf(msg.sender) >= babyPrice, "You Don't Have 250 Cosmic Tokens!");
        
        cosmictoken.transferFrom(tx.origin, address(this), babyPrice);
        cosmictoken.burn(address(this), babyPrice);
        _mint(msg.sender, 1, 1, "");
    }
    
    function CosmicAlphaPass() public payable 
    {
        require(doYouOwn(1), "You Don't Own a Baby Alpha Pass!");
        require(cosmictoken.balanceOf(msg.sender) >= cosmicPrice, "You Don't Have 750 Cosmic Tokens!");
        
        cosmictoken.transferFrom(tx.origin, address(this), cosmicPrice);
        cosmictoken.burn(address(this), cosmicPrice);
        _mint(msg.sender, 2, 1, "");
    }
    
    function GenesisAlphaPass() public payable 
    {
        require(doYouOwn(1), "You Don't Own a Baby Alpha Pass!");
        require(doYouOwn(2), "You Don't Own a Cosmic Alpha Pass!");
        require(cosmictoken.balanceOf(msg.sender) >= genesisPrice, "You Don't Have 1500 Cosmic Tokens!");
        
        cosmictoken.transferFrom(tx.origin, address(this), genesisPrice);
        cosmictoken.burn(address(this), genesisPrice);
        _mint(msg.sender, 3, 1, "");
    }
    
    function FusionGenerator() public payable isFusionMintOpen
    {
        require(cosmictoken.balanceOf(msg.sender) >= generatorPrice, "You Don't Have 700 Cosmic Tokens!");
        
        cosmictoken.transferFrom(tx.origin, address(this), generatorPrice);
        cosmictoken.burn(address(this), generatorPrice);
        _mint(msg.sender, 4, 1, "");
    }
   
    function withdrawContractEther(address payable recipient) external onlyOwner
    {
        recipient.transfer(getBalance());
    }
    function getBalance() public view returns(uint)
    {
        return address(this).balance;
    }
   
    function _baseURI() internal view virtual returns (string memory) {
        return baseURI;
    }
   
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }
   
    function uri(uint256 tokenId) public view override virtual returns (string memory)
    {
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : "";
    }
   

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"address","name":"_yield","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"BabyAlphaPass","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"CosmicAlphaPass","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"FusionGenerator","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"GenesisAlphaPass","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"babyPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cosmicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cosmictoken","outputs":[{"internalType":"contract CosmicToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fusionGeneratorOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generatorPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_open","type":"bool"}],"name":"openFusionGenerator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setBabyPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setCosmicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setGeneratorPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setGenesisPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_yield","type":"address"}],"name":"setYieldToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"}],"name":"withdrawContractEther","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526005608081905264173539b7b760d91b60a0908152620000289160069190620001bb565b50680d8d726b7177a800006007556828a857425466f80000600855685150ae84a8cdf000006009556825f273933db5700000600a55600b805460ff191690553480156200007457600080fd5b50604051620032823803806200328283398101604081905262000097916200027e565b81620000a381620000e1565b50620000af33620000fa565b620000ba826200014c565b600480546001600160a01b0319166001600160a01b039290921691909117905550620003c2565b8051620000f6906002906020840190620001bb565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6003546001600160a01b03163314620001ab5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b8051620000f69060059060208401905b828054620001c9906200036f565b90600052602060002090601f016020900481019282620001ed576000855562000238565b82601f106200020857805160ff191683800117855562000238565b8280016001018555821562000238579182015b82811115620002385782518255916020019190600101906200021b565b50620002469291506200024a565b5090565b5b808211156200024657600081556001016200024b565b80516001600160a01b03811681146200027957600080fd5b919050565b600080604083850312156200029257600080fd5b82516001600160401b0380821115620002aa57600080fd5b818501915085601f830112620002bf57600080fd5b815181811115620002d457620002d4620003ac565b604051601f8201601f19908116603f01168101908382118183101715620002ff57620002ff620003ac565b816040528281526020935088848487010111156200031c57600080fd5b600091505b8282101562000340578482018401518183018501529083019062000321565b82821115620003525760008484830101525b95506200036491505085820162000261565b925050509250929050565b600181811c908216806200038457607f821691505b60208210811415620003a657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b612eb080620003d26000396000f3fe6080604052600436106101f75760003560e01c80636c0360eb1161010d578063a22cb465116100a0578063e985e9c51161006f578063e985e9c51461053f578063f242432a14610588578063f2fde38b146105a8578063f5298aca146105c8578063ffe4760b146105e857600080fd5b8063a22cb465146104e2578063bf3d3ef314610502578063c66828621461050a578063d6b2dbcb1461051f57600080fd5b806388386103116100dc57806388386103146104745780638d8671631461048a5780638da5cb5b146104a4578063a16d605a146104c257600080fd5b80636c0360eb14610414578063715018a614610429578063728cce7c1461043e578063729fce8d1461045457600080fd5b80632eb2c2d6116101905780634feafc091161015f5780634feafc091461036657806355f804b31461039e578063576fa317146103be57806361f36462146103d45780636b20c454146103f457600080fd5b80632eb2c2d6146102f15780633ddec871146103115780634cc647e5146103195780634e1273f41461033957600080fd5b8063108b1894116101cc578063108b1894146102ae57806311182661146102b657806312065fe0146102be57806323ffce85146102d157600080fd5b80626d2a76146101fc578062fdd58e1461021e57806301ffc9a7146102515780630e89341c14610281575b600080fd5b34801561020857600080fd5b5061021c61021736600461275a565b6105fe565b005b34801561022a57600080fd5b5061023e610239366004612569565b610649565b6040519081526020015b60405180910390f35b34801561025d57600080fd5b5061027161026c3660046126d7565b6106db565b6040519015158152602001610248565b34801561028d57600080fd5b506102a161029c36600461275a565b61072d565b60405161024891906129bf565b61021c61078e565b61021c610985565b3480156102ca57600080fd5b504761023e565b3480156102dd57600080fd5b5061021c6102ec366004612358565b610b65565b3480156102fd57600080fd5b5061021c61030c3660046123ae565b610bb1565b61021c610c48565b34801561032557600080fd5b5061021c61033436600461275a565b610ee1565b34801561034557600080fd5b506103596103543660046125ca565b610f23565b604051610248919061297e565b34801561037257600080fd5b50600454610386906001600160a01b031681565b6040516001600160a01b039091168152602001610248565b3480156103aa57600080fd5b5061021c6103b9366004612711565b61104d565b3480156103ca57600080fd5b5061023e60085481565b3480156103e057600080fd5b5061021c6103ef36600461275a565b61108e565b34801561040057600080fd5b5061021c61040f3660046124c5565b6110d0565b34801561042057600080fd5b506102a1611118565b34801561043557600080fd5b5061021c6111a6565b34801561044a57600080fd5b5061023e60095481565b34801561046057600080fd5b5061021c61046f36600461269d565b6111da565b34801561048057600080fd5b5061023e600a5481565b34801561049657600080fd5b50600b546102719060ff1681565b3480156104b057600080fd5b506003546001600160a01b0316610386565b3480156104ce57600080fd5b5061021c6104dd366004612358565b611217565b3480156104ee57600080fd5b5061021c6104fd36600461253b565b611276565b61021c611281565b34801561051657600080fd5b506102a16114b8565b34801561052b57600080fd5b5061021c61053a36600461275a565b6114c5565b34801561054b57600080fd5b5061027161055a366004612375565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561059457600080fd5b5061021c6105a336600461245c565b611507565b3480156105b457600080fd5b5061021c6105c3366004612358565b61154c565b3480156105d457600080fd5b5061021c6105e3366004612595565b6115e7565b3480156105f457600080fd5b5061023e60075481565b6003546001600160a01b031633146106315760405162461bcd60e51b815260040161062890612b79565b60405180910390fd5b61064381670de0b6b3a7640000612c46565b600a5550565b60006001600160a01b0383166106b55760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610628565b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061070c57506001600160e01b031982166303a24d0760e21b145b8061072757506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600061073961162a565b905060008151116107595760405180602001604052806000815250610787565b80610763846116bc565b6006604051602001610777939291906127f3565b6040516020818303038152906040525b9392505050565b600b5460ff1615156001146107a257600080fd5b600a54600480546040516370a0823160e01b815233928101929092526001600160a01b0316906370a082319060240160206040518083038186803b1580156107e957600080fd5b505afa1580156107fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108219190612773565b10156108795760405162461bcd60e51b815260206004820152602160248201527f596f7520446f6e277420486176652037303020436f736d696320546f6b656e736044820152602160f81b6064820152608401610628565b60048054600a546040516323b872dd60e01b81526001600160a01b03909216926323b872dd926108ad923292309201612915565b602060405180830381600087803b1580156108c757600080fd5b505af11580156108db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ff91906126ba565b5060048054600a54604051632770a7eb60e21b8152309381019390935260248301526001600160a01b031690639dc29fac90604401600060405180830381600087803b15801561094e57600080fd5b505af1158015610962573d6000803e3d6000fd5b505050506109833360046001604051806020016040528060008152506117c2565b565b600754600480546040516370a0823160e01b815233928101929092526001600160a01b0316906370a082319060240160206040518083038186803b1580156109cc57600080fd5b505afa1580156109e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a049190612773565b1015610a5c5760405162461bcd60e51b815260206004820152602160248201527f596f7520446f6e277420486176652032353020436f736d696320546f6b656e736044820152602160f81b6064820152608401610628565b600480546007546040516323b872dd60e01b81526001600160a01b03909216926323b872dd92610a90923292309201612915565b602060405180830381600087803b158015610aaa57600080fd5b505af1158015610abe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae291906126ba565b5060048054600754604051632770a7eb60e21b8152309381019390935260248301526001600160a01b031690639dc29fac90604401600060405180830381600087803b158015610b3157600080fd5b505af1158015610b45573d6000803e3d6000fd5b5050505061098333600180604051806020016040528060008152506117c2565b6003546001600160a01b03163314610b8f5760405162461bcd60e51b815260040161062890612b79565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038516331480610bcd5750610bcd853361055a565b610c345760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610628565b610c4185858585856118cc565b5050505050565b610c526001611a68565b610c9e5760405162461bcd60e51b815260206004820181905260248201527f596f7520446f6e2774204f776e2061204261627920416c7068612050617373216044820152606401610628565b610ca86002611a68565b610cff5760405162461bcd60e51b815260206004820152602260248201527f596f7520446f6e2774204f776e206120436f736d696320416c70686120506173604482015261732160f01b6064820152608401610628565b600954600480546040516370a0823160e01b815233928101929092526001600160a01b0316906370a082319060240160206040518083038186803b158015610d4657600080fd5b505afa158015610d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7e9190612773565b1015610dd75760405162461bcd60e51b815260206004820152602260248201527f596f7520446f6e27742048617665203135303020436f736d696320546f6b656e604482015261732160f01b6064820152608401610628565b600480546009546040516323b872dd60e01b81526001600160a01b03909216926323b872dd92610e0b923292309201612915565b602060405180830381600087803b158015610e2557600080fd5b505af1158015610e39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5d91906126ba565b5060048054600954604051632770a7eb60e21b8152309381019390935260248301526001600160a01b031690639dc29fac90604401600060405180830381600087803b158015610eac57600080fd5b505af1158015610ec0573d6000803e3d6000fd5b505050506109833360036001604051806020016040528060008152506117c2565b6003546001600160a01b03163314610f0b5760405162461bcd60e51b815260040161062890612b79565b610f1d81670de0b6b3a7640000612c46565b60075550565b60608151835114610f885760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610628565b6000835167ffffffffffffffff811115610fa457610fa4612d85565b604051908082528060200260200182016040528015610fcd578160200160208202803683370190505b50905060005b845181101561104557611018858281518110610ff157610ff1612d6f565b602002602001015185838151811061100b5761100b612d6f565b6020026020010151610649565b82828151811061102a5761102a612d6f565b602090810291909101015261103e81612d14565b9050610fd3565b509392505050565b6003546001600160a01b031633146110775760405162461bcd60e51b815260040161062890612b79565b805161108a9060059060208401906121ca565b5050565b6003546001600160a01b031633146110b85760405162461bcd60e51b815260040161062890612b79565b6110ca81670de0b6b3a7640000612c46565b60095550565b6001600160a01b0383163314806110ec57506110ec833361055a565b6111085760405162461bcd60e51b815260040161062890612a5e565b611113838383611a7c565b505050565b6005805461112590612cac565b80601f016020809104026020016040519081016040528092919081815260200182805461115190612cac565b801561119e5780601f106111735761010080835404028352916020019161119e565b820191906000526020600020905b81548152906001019060200180831161118157829003601f168201915b505050505081565b6003546001600160a01b031633146111d05760405162461bcd60e51b815260040161062890612b79565b6109836000611bf8565b6003546001600160a01b031633146112045760405162461bcd60e51b815260040161062890612b79565b600b805460ff1916911515919091179055565b6003546001600160a01b031633146112415760405162461bcd60e51b815260040161062890612b79565b6040516001600160a01b038216904780156108fc02916000818181858888f1935050505015801561108a573d6000803e3d6000fd5b61108a338383611c4a565b61128b6001611a68565b6112d75760405162461bcd60e51b815260206004820181905260248201527f596f7520446f6e2774204f776e2061204261627920416c7068612050617373216044820152606401610628565b600854600480546040516370a0823160e01b815233928101929092526001600160a01b0316906370a082319060240160206040518083038186803b15801561131e57600080fd5b505afa158015611332573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113569190612773565b10156113ae5760405162461bcd60e51b815260206004820152602160248201527f596f7520446f6e277420486176652037353020436f736d696320546f6b656e736044820152602160f81b6064820152608401610628565b600480546008546040516323b872dd60e01b81526001600160a01b03909216926323b872dd926113e2923292309201612915565b602060405180830381600087803b1580156113fc57600080fd5b505af1158015611410573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143491906126ba565b5060048054600854604051632770a7eb60e21b8152309381019390935260248301526001600160a01b031690639dc29fac90604401600060405180830381600087803b15801561148357600080fd5b505af1158015611497573d6000803e3d6000fd5b505050506109833360026001604051806020016040528060008152506117c2565b6006805461112590612cac565b6003546001600160a01b031633146114ef5760405162461bcd60e51b815260040161062890612b79565b61150181670de0b6b3a7640000612c46565b60085550565b6001600160a01b0385163314806115235750611523853361055a565b61153f5760405162461bcd60e51b815260040161062890612a5e565b610c418585858585611d2b565b6003546001600160a01b031633146115765760405162461bcd60e51b815260040161062890612b79565b6001600160a01b0381166115db5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610628565b6115e481611bf8565b50565b6001600160a01b0383163314806116035750611603833361055a565b61161f5760405162461bcd60e51b815260040161062890612a5e565b611113838383611e48565b60606005805461163990612cac565b80601f016020809104026020016040519081016040528092919081815260200182805461166590612cac565b80156116b25780601f10611687576101008083540402835291602001916116b2565b820191906000526020600020905b81548152906001019060200180831161169557829003601f168201915b5050505050905090565b6060816116e05750506040805180820190915260018152600360fc1b602082015290565b8160005b811561170a57806116f481612d14565b91506117039050600a83612c32565b91506116e4565b60008167ffffffffffffffff81111561172557611725612d85565b6040519080825280601f01601f19166020018201604052801561174f576020820181803683370190505b5090505b84156117ba57611764600183612c65565b9150611771600a86612d2f565b61177c906030612c1a565b60f81b81838151811061179157611791612d6f565b60200101906001600160f81b031916908160001a9053506117b3600a86612c32565b9450611753565b949350505050565b6001600160a01b0384166118225760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610628565b3361183c8160008761183388611f4a565b610c4188611f4a565b6000848152602081815260408083206001600160a01b03891684529091528120805485929061186c908490612c1a565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610c4181600087878787611f95565b81518351146118ed5760405162461bcd60e51b815260040161062890612bae565b6001600160a01b0384166119135760405162461bcd60e51b815260040161062890612aa7565b3360005b84518110156119fa57600085828151811061193457611934612d6f565b60200260200101519050600085838151811061195257611952612d6f565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156119a25760405162461bcd60e51b815260040161062890612b2f565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906119df908490612c1a565b92505081905550505050806119f390612d14565b9050611917565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611a4a929190612991565b60405180910390a4611a60818787878787612100565b505050505050565b6000611a743383610649565b151592915050565b6001600160a01b038316611aa25760405162461bcd60e51b815260040161062890612aec565b8051825114611ac35760405162461bcd60e51b815260040161062890612bae565b604080516020810190915260009081905233905b8351811015611b99576000848281518110611af457611af4612d6f565b602002602001015190506000848381518110611b1257611b12612d6f565b602090810291909101810151600084815280835260408082206001600160a01b038c168352909352919091205490915081811015611b625760405162461bcd60e51b815260040161062890612a1a565b6000928352602083815260408085206001600160a01b038b1686529091529092209103905580611b9181612d14565b915050611ad7565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611bea929190612991565b60405180910390a450505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611cbe5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610628565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611d515760405162461bcd60e51b815260040161062890612aa7565b33611d6181878761183388611f4a565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015611da25760405162461bcd60e51b815260040161062890612b2f565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611ddf908490612c1a565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611e3f828888888888611f95565b50505050505050565b6001600160a01b038316611e6e5760405162461bcd60e51b815260040161062890612aec565b33611e9e81856000611e7f87611f4a565b611e8887611f4a565b5050604080516020810190915260009052505050565b6000838152602081815260408083206001600160a01b038816845290915290205482811015611edf5760405162461bcd60e51b815260040161062890612a1a565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611f8457611f84612d6f565b602090810291909101015292915050565b6001600160a01b0384163b15611a605760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611fd99089908990889088908890600401612939565b602060405180830381600087803b158015611ff357600080fd5b505af1925050508015612023575060408051601f3d908101601f19168201909252612020918101906126f4565b60015b6120d05761202f612d9b565b806308c379a014156120695750612044612db7565b8061204f575061206b565b8060405162461bcd60e51b815260040161062891906129bf565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610628565b6001600160e01b0319811663f23a6e6160e01b14611e3f5760405162461bcd60e51b8152600401610628906129d2565b6001600160a01b0384163b15611a605760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061214490899089908890889088906004016128b7565b602060405180830381600087803b15801561215e57600080fd5b505af192505050801561218e575060408051601f3d908101601f1916820190925261218b918101906126f4565b60015b61219a5761202f612d9b565b6001600160e01b0319811663bc197c8160e01b14611e3f5760405162461bcd60e51b8152600401610628906129d2565b8280546121d690612cac565b90600052602060002090601f0160209004810192826121f8576000855561223e565b82601f1061221157805160ff191683800117855561223e565b8280016001018555821561223e579182015b8281111561223e578251825591602001919060010190612223565b5061224a92915061224e565b5090565b5b8082111561224a576000815560010161224f565b600067ffffffffffffffff83111561227d5761227d612d85565b604051612294601f8501601f191660200182612ce7565b8091508381528484840111156122a957600080fd5b83836020830137600060208583010152509392505050565b600082601f8301126122d257600080fd5b813560206122df82612bf6565b6040516122ec8282612ce7565b8381528281019150858301600585901b8701840188101561230c57600080fd5b60005b8581101561232b5781358452928401929084019060010161230f565b5090979650505050505050565b600082601f83011261234957600080fd5b61078783833560208501612263565b60006020828403121561236a57600080fd5b813561078781612e41565b6000806040838503121561238857600080fd5b823561239381612e41565b915060208301356123a381612e41565b809150509250929050565b600080600080600060a086880312156123c657600080fd5b85356123d181612e41565b945060208601356123e181612e41565b9350604086013567ffffffffffffffff808211156123fe57600080fd5b61240a89838a016122c1565b9450606088013591508082111561242057600080fd5b61242c89838a016122c1565b9350608088013591508082111561244257600080fd5b5061244f88828901612338565b9150509295509295909350565b600080600080600060a0868803121561247457600080fd5b853561247f81612e41565b9450602086013561248f81612e41565b93506040860135925060608601359150608086013567ffffffffffffffff8111156124b957600080fd5b61244f88828901612338565b6000806000606084860312156124da57600080fd5b83356124e581612e41565b9250602084013567ffffffffffffffff8082111561250257600080fd5b61250e878388016122c1565b9350604086013591508082111561252457600080fd5b50612531868287016122c1565b9150509250925092565b6000806040838503121561254e57600080fd5b823561255981612e41565b915060208301356123a381612e56565b6000806040838503121561257c57600080fd5b823561258781612e41565b946020939093013593505050565b6000806000606084860312156125aa57600080fd5b83356125b581612e41565b95602085013595506040909401359392505050565b600080604083850312156125dd57600080fd5b823567ffffffffffffffff808211156125f557600080fd5b818501915085601f83011261260957600080fd5b8135602061261682612bf6565b6040516126238282612ce7565b8381528281019150858301600585901b870184018b101561264357600080fd5b600096505b8487101561266f57803561265b81612e41565b835260019690960195918301918301612648565b509650508601359250508082111561268657600080fd5b50612693858286016122c1565b9150509250929050565b6000602082840312156126af57600080fd5b813561078781612e56565b6000602082840312156126cc57600080fd5b815161078781612e56565b6000602082840312156126e957600080fd5b813561078781612e64565b60006020828403121561270657600080fd5b815161078781612e64565b60006020828403121561272357600080fd5b813567ffffffffffffffff81111561273a57600080fd5b8201601f8101841361274b57600080fd5b6117ba84823560208401612263565b60006020828403121561276c57600080fd5b5035919050565b60006020828403121561278557600080fd5b5051919050565b600081518084526020808501945080840160005b838110156127bc578151875295820195908201906001016127a0565b509495945050505050565b600081518084526127df816020860160208601612c7c565b601f01601f19169290920160200192915050565b6000845160206128068285838a01612c7c565b8551918401916128198184848a01612c7c565b8554920191600090600181811c908083168061283657607f831692505b85831081141561285457634e487b7160e01b85526022600452602485fd5b8080156128685760018114612879576128a6565b60ff198516885283880195506128a6565b60008b81526020902060005b8581101561289e5781548a820152908401908801612885565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0386811682528516602082015260a0604082018190526000906128e39083018661278c565b82810360608401526128f5818661278c565b9050828103608084015261290981856127c7565b98975050505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612973908301846127c7565b979650505050505050565b602081526000610787602083018461278c565b6040815260006129a4604083018561278c565b82810360208401526129b6818561278c565b95945050505050565b60208152600061078760208301846127c7565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b600067ffffffffffffffff821115612c1057612c10612d85565b5060051b60200190565b60008219821115612c2d57612c2d612d43565b500190565b600082612c4157612c41612d59565b500490565b6000816000190483118215151615612c6057612c60612d43565b500290565b600082821015612c7757612c77612d43565b500390565b60005b83811015612c97578181015183820152602001612c7f565b83811115612ca6576000848401525b50505050565b600181811c90821680612cc057607f821691505b60208210811415612ce157634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715612d0d57612d0d612d85565b6040525050565b6000600019821415612d2857612d28612d43565b5060010190565b600082612d3e57612d3e612d59565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612db45760046000803e5060005160e01c5b90565b600060443d1015612dc55790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612df557505050505090565b8285019150815181811115612e0d5750505050505090565b843d8701016020828501011115612e275750505050505090565b612e3660208286010187612ce7565b509095945050505050565b6001600160a01b03811681146115e457600080fd5b80151581146115e457600080fd5b6001600160e01b0319811681146115e457600080fdfea2646970667358221220be42748038bf4eaf13e454a92cdbb8615d74aeb703e08c1552ed92137bd94ec264736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000003ba5cb0c136d2bb99c3fcfe49a5adf2970be127d000000000000000000000000000000000000000000000000000000000000005668747470733a2f2f636f736d69636c6162732e6d7970696e6174612e636c6f75642f697066732f516d66387277325677464473386a6737396434536a467352427437354858796b72656b59614a4a50746a747431482f00000000000000000000

Deployed Bytecode

0x6080604052600436106101f75760003560e01c80636c0360eb1161010d578063a22cb465116100a0578063e985e9c51161006f578063e985e9c51461053f578063f242432a14610588578063f2fde38b146105a8578063f5298aca146105c8578063ffe4760b146105e857600080fd5b8063a22cb465146104e2578063bf3d3ef314610502578063c66828621461050a578063d6b2dbcb1461051f57600080fd5b806388386103116100dc57806388386103146104745780638d8671631461048a5780638da5cb5b146104a4578063a16d605a146104c257600080fd5b80636c0360eb14610414578063715018a614610429578063728cce7c1461043e578063729fce8d1461045457600080fd5b80632eb2c2d6116101905780634feafc091161015f5780634feafc091461036657806355f804b31461039e578063576fa317146103be57806361f36462146103d45780636b20c454146103f457600080fd5b80632eb2c2d6146102f15780633ddec871146103115780634cc647e5146103195780634e1273f41461033957600080fd5b8063108b1894116101cc578063108b1894146102ae57806311182661146102b657806312065fe0146102be57806323ffce85146102d157600080fd5b80626d2a76146101fc578062fdd58e1461021e57806301ffc9a7146102515780630e89341c14610281575b600080fd5b34801561020857600080fd5b5061021c61021736600461275a565b6105fe565b005b34801561022a57600080fd5b5061023e610239366004612569565b610649565b6040519081526020015b60405180910390f35b34801561025d57600080fd5b5061027161026c3660046126d7565b6106db565b6040519015158152602001610248565b34801561028d57600080fd5b506102a161029c36600461275a565b61072d565b60405161024891906129bf565b61021c61078e565b61021c610985565b3480156102ca57600080fd5b504761023e565b3480156102dd57600080fd5b5061021c6102ec366004612358565b610b65565b3480156102fd57600080fd5b5061021c61030c3660046123ae565b610bb1565b61021c610c48565b34801561032557600080fd5b5061021c61033436600461275a565b610ee1565b34801561034557600080fd5b506103596103543660046125ca565b610f23565b604051610248919061297e565b34801561037257600080fd5b50600454610386906001600160a01b031681565b6040516001600160a01b039091168152602001610248565b3480156103aa57600080fd5b5061021c6103b9366004612711565b61104d565b3480156103ca57600080fd5b5061023e60085481565b3480156103e057600080fd5b5061021c6103ef36600461275a565b61108e565b34801561040057600080fd5b5061021c61040f3660046124c5565b6110d0565b34801561042057600080fd5b506102a1611118565b34801561043557600080fd5b5061021c6111a6565b34801561044a57600080fd5b5061023e60095481565b34801561046057600080fd5b5061021c61046f36600461269d565b6111da565b34801561048057600080fd5b5061023e600a5481565b34801561049657600080fd5b50600b546102719060ff1681565b3480156104b057600080fd5b506003546001600160a01b0316610386565b3480156104ce57600080fd5b5061021c6104dd366004612358565b611217565b3480156104ee57600080fd5b5061021c6104fd36600461253b565b611276565b61021c611281565b34801561051657600080fd5b506102a16114b8565b34801561052b57600080fd5b5061021c61053a36600461275a565b6114c5565b34801561054b57600080fd5b5061027161055a366004612375565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561059457600080fd5b5061021c6105a336600461245c565b611507565b3480156105b457600080fd5b5061021c6105c3366004612358565b61154c565b3480156105d457600080fd5b5061021c6105e3366004612595565b6115e7565b3480156105f457600080fd5b5061023e60075481565b6003546001600160a01b031633146106315760405162461bcd60e51b815260040161062890612b79565b60405180910390fd5b61064381670de0b6b3a7640000612c46565b600a5550565b60006001600160a01b0383166106b55760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610628565b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061070c57506001600160e01b031982166303a24d0760e21b145b8061072757506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600061073961162a565b905060008151116107595760405180602001604052806000815250610787565b80610763846116bc565b6006604051602001610777939291906127f3565b6040516020818303038152906040525b9392505050565b600b5460ff1615156001146107a257600080fd5b600a54600480546040516370a0823160e01b815233928101929092526001600160a01b0316906370a082319060240160206040518083038186803b1580156107e957600080fd5b505afa1580156107fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108219190612773565b10156108795760405162461bcd60e51b815260206004820152602160248201527f596f7520446f6e277420486176652037303020436f736d696320546f6b656e736044820152602160f81b6064820152608401610628565b60048054600a546040516323b872dd60e01b81526001600160a01b03909216926323b872dd926108ad923292309201612915565b602060405180830381600087803b1580156108c757600080fd5b505af11580156108db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ff91906126ba565b5060048054600a54604051632770a7eb60e21b8152309381019390935260248301526001600160a01b031690639dc29fac90604401600060405180830381600087803b15801561094e57600080fd5b505af1158015610962573d6000803e3d6000fd5b505050506109833360046001604051806020016040528060008152506117c2565b565b600754600480546040516370a0823160e01b815233928101929092526001600160a01b0316906370a082319060240160206040518083038186803b1580156109cc57600080fd5b505afa1580156109e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a049190612773565b1015610a5c5760405162461bcd60e51b815260206004820152602160248201527f596f7520446f6e277420486176652032353020436f736d696320546f6b656e736044820152602160f81b6064820152608401610628565b600480546007546040516323b872dd60e01b81526001600160a01b03909216926323b872dd92610a90923292309201612915565b602060405180830381600087803b158015610aaa57600080fd5b505af1158015610abe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae291906126ba565b5060048054600754604051632770a7eb60e21b8152309381019390935260248301526001600160a01b031690639dc29fac90604401600060405180830381600087803b158015610b3157600080fd5b505af1158015610b45573d6000803e3d6000fd5b5050505061098333600180604051806020016040528060008152506117c2565b6003546001600160a01b03163314610b8f5760405162461bcd60e51b815260040161062890612b79565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038516331480610bcd5750610bcd853361055a565b610c345760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610628565b610c4185858585856118cc565b5050505050565b610c526001611a68565b610c9e5760405162461bcd60e51b815260206004820181905260248201527f596f7520446f6e2774204f776e2061204261627920416c7068612050617373216044820152606401610628565b610ca86002611a68565b610cff5760405162461bcd60e51b815260206004820152602260248201527f596f7520446f6e2774204f776e206120436f736d696320416c70686120506173604482015261732160f01b6064820152608401610628565b600954600480546040516370a0823160e01b815233928101929092526001600160a01b0316906370a082319060240160206040518083038186803b158015610d4657600080fd5b505afa158015610d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7e9190612773565b1015610dd75760405162461bcd60e51b815260206004820152602260248201527f596f7520446f6e27742048617665203135303020436f736d696320546f6b656e604482015261732160f01b6064820152608401610628565b600480546009546040516323b872dd60e01b81526001600160a01b03909216926323b872dd92610e0b923292309201612915565b602060405180830381600087803b158015610e2557600080fd5b505af1158015610e39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5d91906126ba565b5060048054600954604051632770a7eb60e21b8152309381019390935260248301526001600160a01b031690639dc29fac90604401600060405180830381600087803b158015610eac57600080fd5b505af1158015610ec0573d6000803e3d6000fd5b505050506109833360036001604051806020016040528060008152506117c2565b6003546001600160a01b03163314610f0b5760405162461bcd60e51b815260040161062890612b79565b610f1d81670de0b6b3a7640000612c46565b60075550565b60608151835114610f885760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610628565b6000835167ffffffffffffffff811115610fa457610fa4612d85565b604051908082528060200260200182016040528015610fcd578160200160208202803683370190505b50905060005b845181101561104557611018858281518110610ff157610ff1612d6f565b602002602001015185838151811061100b5761100b612d6f565b6020026020010151610649565b82828151811061102a5761102a612d6f565b602090810291909101015261103e81612d14565b9050610fd3565b509392505050565b6003546001600160a01b031633146110775760405162461bcd60e51b815260040161062890612b79565b805161108a9060059060208401906121ca565b5050565b6003546001600160a01b031633146110b85760405162461bcd60e51b815260040161062890612b79565b6110ca81670de0b6b3a7640000612c46565b60095550565b6001600160a01b0383163314806110ec57506110ec833361055a565b6111085760405162461bcd60e51b815260040161062890612a5e565b611113838383611a7c565b505050565b6005805461112590612cac565b80601f016020809104026020016040519081016040528092919081815260200182805461115190612cac565b801561119e5780601f106111735761010080835404028352916020019161119e565b820191906000526020600020905b81548152906001019060200180831161118157829003601f168201915b505050505081565b6003546001600160a01b031633146111d05760405162461bcd60e51b815260040161062890612b79565b6109836000611bf8565b6003546001600160a01b031633146112045760405162461bcd60e51b815260040161062890612b79565b600b805460ff1916911515919091179055565b6003546001600160a01b031633146112415760405162461bcd60e51b815260040161062890612b79565b6040516001600160a01b038216904780156108fc02916000818181858888f1935050505015801561108a573d6000803e3d6000fd5b61108a338383611c4a565b61128b6001611a68565b6112d75760405162461bcd60e51b815260206004820181905260248201527f596f7520446f6e2774204f776e2061204261627920416c7068612050617373216044820152606401610628565b600854600480546040516370a0823160e01b815233928101929092526001600160a01b0316906370a082319060240160206040518083038186803b15801561131e57600080fd5b505afa158015611332573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113569190612773565b10156113ae5760405162461bcd60e51b815260206004820152602160248201527f596f7520446f6e277420486176652037353020436f736d696320546f6b656e736044820152602160f81b6064820152608401610628565b600480546008546040516323b872dd60e01b81526001600160a01b03909216926323b872dd926113e2923292309201612915565b602060405180830381600087803b1580156113fc57600080fd5b505af1158015611410573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143491906126ba565b5060048054600854604051632770a7eb60e21b8152309381019390935260248301526001600160a01b031690639dc29fac90604401600060405180830381600087803b15801561148357600080fd5b505af1158015611497573d6000803e3d6000fd5b505050506109833360026001604051806020016040528060008152506117c2565b6006805461112590612cac565b6003546001600160a01b031633146114ef5760405162461bcd60e51b815260040161062890612b79565b61150181670de0b6b3a7640000612c46565b60085550565b6001600160a01b0385163314806115235750611523853361055a565b61153f5760405162461bcd60e51b815260040161062890612a5e565b610c418585858585611d2b565b6003546001600160a01b031633146115765760405162461bcd60e51b815260040161062890612b79565b6001600160a01b0381166115db5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610628565b6115e481611bf8565b50565b6001600160a01b0383163314806116035750611603833361055a565b61161f5760405162461bcd60e51b815260040161062890612a5e565b611113838383611e48565b60606005805461163990612cac565b80601f016020809104026020016040519081016040528092919081815260200182805461166590612cac565b80156116b25780601f10611687576101008083540402835291602001916116b2565b820191906000526020600020905b81548152906001019060200180831161169557829003601f168201915b5050505050905090565b6060816116e05750506040805180820190915260018152600360fc1b602082015290565b8160005b811561170a57806116f481612d14565b91506117039050600a83612c32565b91506116e4565b60008167ffffffffffffffff81111561172557611725612d85565b6040519080825280601f01601f19166020018201604052801561174f576020820181803683370190505b5090505b84156117ba57611764600183612c65565b9150611771600a86612d2f565b61177c906030612c1a565b60f81b81838151811061179157611791612d6f565b60200101906001600160f81b031916908160001a9053506117b3600a86612c32565b9450611753565b949350505050565b6001600160a01b0384166118225760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610628565b3361183c8160008761183388611f4a565b610c4188611f4a565b6000848152602081815260408083206001600160a01b03891684529091528120805485929061186c908490612c1a565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610c4181600087878787611f95565b81518351146118ed5760405162461bcd60e51b815260040161062890612bae565b6001600160a01b0384166119135760405162461bcd60e51b815260040161062890612aa7565b3360005b84518110156119fa57600085828151811061193457611934612d6f565b60200260200101519050600085838151811061195257611952612d6f565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156119a25760405162461bcd60e51b815260040161062890612b2f565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906119df908490612c1a565b92505081905550505050806119f390612d14565b9050611917565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611a4a929190612991565b60405180910390a4611a60818787878787612100565b505050505050565b6000611a743383610649565b151592915050565b6001600160a01b038316611aa25760405162461bcd60e51b815260040161062890612aec565b8051825114611ac35760405162461bcd60e51b815260040161062890612bae565b604080516020810190915260009081905233905b8351811015611b99576000848281518110611af457611af4612d6f565b602002602001015190506000848381518110611b1257611b12612d6f565b602090810291909101810151600084815280835260408082206001600160a01b038c168352909352919091205490915081811015611b625760405162461bcd60e51b815260040161062890612a1a565b6000928352602083815260408085206001600160a01b038b1686529091529092209103905580611b9181612d14565b915050611ad7565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611bea929190612991565b60405180910390a450505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611cbe5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610628565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611d515760405162461bcd60e51b815260040161062890612aa7565b33611d6181878761183388611f4a565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015611da25760405162461bcd60e51b815260040161062890612b2f565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611ddf908490612c1a565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611e3f828888888888611f95565b50505050505050565b6001600160a01b038316611e6e5760405162461bcd60e51b815260040161062890612aec565b33611e9e81856000611e7f87611f4a565b611e8887611f4a565b5050604080516020810190915260009052505050565b6000838152602081815260408083206001600160a01b038816845290915290205482811015611edf5760405162461bcd60e51b815260040161062890612a1a565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611f8457611f84612d6f565b602090810291909101015292915050565b6001600160a01b0384163b15611a605760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611fd99089908990889088908890600401612939565b602060405180830381600087803b158015611ff357600080fd5b505af1925050508015612023575060408051601f3d908101601f19168201909252612020918101906126f4565b60015b6120d05761202f612d9b565b806308c379a014156120695750612044612db7565b8061204f575061206b565b8060405162461bcd60e51b815260040161062891906129bf565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610628565b6001600160e01b0319811663f23a6e6160e01b14611e3f5760405162461bcd60e51b8152600401610628906129d2565b6001600160a01b0384163b15611a605760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061214490899089908890889088906004016128b7565b602060405180830381600087803b15801561215e57600080fd5b505af192505050801561218e575060408051601f3d908101601f1916820190925261218b918101906126f4565b60015b61219a5761202f612d9b565b6001600160e01b0319811663bc197c8160e01b14611e3f5760405162461bcd60e51b8152600401610628906129d2565b8280546121d690612cac565b90600052602060002090601f0160209004810192826121f8576000855561223e565b82601f1061221157805160ff191683800117855561223e565b8280016001018555821561223e579182015b8281111561223e578251825591602001919060010190612223565b5061224a92915061224e565b5090565b5b8082111561224a576000815560010161224f565b600067ffffffffffffffff83111561227d5761227d612d85565b604051612294601f8501601f191660200182612ce7565b8091508381528484840111156122a957600080fd5b83836020830137600060208583010152509392505050565b600082601f8301126122d257600080fd5b813560206122df82612bf6565b6040516122ec8282612ce7565b8381528281019150858301600585901b8701840188101561230c57600080fd5b60005b8581101561232b5781358452928401929084019060010161230f565b5090979650505050505050565b600082601f83011261234957600080fd5b61078783833560208501612263565b60006020828403121561236a57600080fd5b813561078781612e41565b6000806040838503121561238857600080fd5b823561239381612e41565b915060208301356123a381612e41565b809150509250929050565b600080600080600060a086880312156123c657600080fd5b85356123d181612e41565b945060208601356123e181612e41565b9350604086013567ffffffffffffffff808211156123fe57600080fd5b61240a89838a016122c1565b9450606088013591508082111561242057600080fd5b61242c89838a016122c1565b9350608088013591508082111561244257600080fd5b5061244f88828901612338565b9150509295509295909350565b600080600080600060a0868803121561247457600080fd5b853561247f81612e41565b9450602086013561248f81612e41565b93506040860135925060608601359150608086013567ffffffffffffffff8111156124b957600080fd5b61244f88828901612338565b6000806000606084860312156124da57600080fd5b83356124e581612e41565b9250602084013567ffffffffffffffff8082111561250257600080fd5b61250e878388016122c1565b9350604086013591508082111561252457600080fd5b50612531868287016122c1565b9150509250925092565b6000806040838503121561254e57600080fd5b823561255981612e41565b915060208301356123a381612e56565b6000806040838503121561257c57600080fd5b823561258781612e41565b946020939093013593505050565b6000806000606084860312156125aa57600080fd5b83356125b581612e41565b95602085013595506040909401359392505050565b600080604083850312156125dd57600080fd5b823567ffffffffffffffff808211156125f557600080fd5b818501915085601f83011261260957600080fd5b8135602061261682612bf6565b6040516126238282612ce7565b8381528281019150858301600585901b870184018b101561264357600080fd5b600096505b8487101561266f57803561265b81612e41565b835260019690960195918301918301612648565b509650508601359250508082111561268657600080fd5b50612693858286016122c1565b9150509250929050565b6000602082840312156126af57600080fd5b813561078781612e56565b6000602082840312156126cc57600080fd5b815161078781612e56565b6000602082840312156126e957600080fd5b813561078781612e64565b60006020828403121561270657600080fd5b815161078781612e64565b60006020828403121561272357600080fd5b813567ffffffffffffffff81111561273a57600080fd5b8201601f8101841361274b57600080fd5b6117ba84823560208401612263565b60006020828403121561276c57600080fd5b5035919050565b60006020828403121561278557600080fd5b5051919050565b600081518084526020808501945080840160005b838110156127bc578151875295820195908201906001016127a0565b509495945050505050565b600081518084526127df816020860160208601612c7c565b601f01601f19169290920160200192915050565b6000845160206128068285838a01612c7c565b8551918401916128198184848a01612c7c565b8554920191600090600181811c908083168061283657607f831692505b85831081141561285457634e487b7160e01b85526022600452602485fd5b8080156128685760018114612879576128a6565b60ff198516885283880195506128a6565b60008b81526020902060005b8581101561289e5781548a820152908401908801612885565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0386811682528516602082015260a0604082018190526000906128e39083018661278c565b82810360608401526128f5818661278c565b9050828103608084015261290981856127c7565b98975050505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612973908301846127c7565b979650505050505050565b602081526000610787602083018461278c565b6040815260006129a4604083018561278c565b82810360208401526129b6818561278c565b95945050505050565b60208152600061078760208301846127c7565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b600067ffffffffffffffff821115612c1057612c10612d85565b5060051b60200190565b60008219821115612c2d57612c2d612d43565b500190565b600082612c4157612c41612d59565b500490565b6000816000190483118215151615612c6057612c60612d43565b500290565b600082821015612c7757612c77612d43565b500390565b60005b83811015612c97578181015183820152602001612c7f565b83811115612ca6576000848401525b50505050565b600181811c90821680612cc057607f821691505b60208210811415612ce157634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715612d0d57612d0d612d85565b6040525050565b6000600019821415612d2857612d28612d43565b5060010190565b600082612d3e57612d3e612d59565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115612db45760046000803e5060005160e01c5b90565b600060443d1015612dc55790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612df557505050505090565b8285019150815181811115612e0d5750505050505090565b843d8701016020828501011115612e275750505050505090565b612e3660208286010187612ce7565b509095945050505050565b6001600160a01b03811681146115e457600080fd5b80151581146115e457600080fd5b6001600160e01b0319811681146115e457600080fdfea2646970667358221220be42748038bf4eaf13e454a92cdbb8615d74aeb703e08c1552ed92137bd94ec264736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000003ba5cb0c136d2bb99c3fcfe49a5adf2970be127d000000000000000000000000000000000000000000000000000000000000005668747470733a2f2f636f736d69636c6162732e6d7970696e6174612e636c6f75642f697066732f516d66387277325677464473386a6737396434536a467352427437354858796b72656b59614a4a50746a747431482f00000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): https://cosmiclabs.mypinata.cloud/ipfs/Qmf8rw2VwFDs8jg79d4SjFsRBt75HXykrekYaJJPtjtt1H/
Arg [1] : _yield (address): 0x3BA5cB0C136D2bb99C3FcFe49A5aDF2970BE127d

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000003ba5cb0c136d2bb99c3fcfe49a5adf2970be127d
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000056
Arg [3] : 68747470733a2f2f636f736d69636c6162732e6d7970696e6174612e636c6f75
Arg [4] : 642f697066732f516d66387277325677464473386a6737396434536a46735242
Arg [5] : 7437354858796b72656b59614a4a50746a747431482f00000000000000000000


Deployed Bytecode Sourcemap

65596:4017:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66948:120;;;;;;;;;;-1:-1:-1;66948:120:0;;;;;:::i;:::-;;:::i;:::-;;50865:231;;;;;;;;;;-1:-1:-1;50865:231:0;;;;;:::i;:::-;;:::i;:::-;;;23616:25:1;;;23604:2;23589:18;50865:231:0;;;;;;;;49888:310;;;;;;;;;;-1:-1:-1;49888:310:0;;;;;:::i;:::-;;:::i;:::-;;;14522:14:1;;14515:22;14497:41;;14485:2;14470:18;49888:310:0;14357:187:1;69322:281:0;;;;;;;;;;-1:-1:-1;69322:281:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;68473:363::-;;;:::i;67223:330::-;;;:::i;68986:100::-;;;;;;;;;;-1:-1:-1;69057:21:0;68986:100;;66344:113;;;;;;;;;;-1:-1:-1;66344:113:0;;;;;:::i;:::-;;:::i;52804:442::-;;;;;;;;;;-1:-1:-1;52804:442:0;;;;;:::i;:::-;;:::i;67982:479::-;;;:::i;66590:110::-;;;;;;;;;;-1:-1:-1;66590:110:0;;;;;:::i;:::-;;:::i;51262:524::-;;;;;;;;;;-1:-1:-1;51262:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;65692:30::-;;;;;;;;;;-1:-1:-1;65692:30:0;;;;-1:-1:-1;;;;;65692:30:0;;;;;;-1:-1:-1;;;;;11522:32:1;;;11504:51;;11492:2;11477:18;65692:30:0;11358:203:1;69207:104:0;;;;;;;;;;-1:-1:-1;69207:104:0;;;;;:::i;:::-;;:::i;65855:38::-;;;;;;;;;;;;;;;;66826:116;;;;;;;;;;-1:-1:-1;66826:116:0;;;;;:::i;:::-;;:::i;65181:353::-;;;;;;;;;;-1:-1:-1;65181:353:0;;;;;:::i;:::-;;:::i;65734:21::-;;;;;;;;;;;;;:::i;30090:103::-;;;;;;;;;;;;;:::i;65900:40::-;;;;;;;;;;;;;;;;66469:109;;;;;;;;;;-1:-1:-1;66469:109:0;;;;;:::i;:::-;;:::i;65947:41::-;;;;;;;;;;;;;;;;66001:39;;;;;;;;;;-1:-1:-1;66001:39:0;;;;;;;;29439:87;;;;;;;;;;-1:-1:-1;29512:6:0;;-1:-1:-1;;;;;29512:6:0;29439:87;;68847:133;;;;;;;;;;-1:-1:-1;68847:133:0;;;;;:::i;:::-;;:::i;51859:155::-;;;;;;;;;;-1:-1:-1;51859:155:0;;;;;:::i;:::-;;:::i;67565:405::-;;;:::i;65762:37::-;;;;;;;;;;;;;:::i;66706:114::-;;;;;;;;;;-1:-1:-1;66706:114:0;;;;;:::i;:::-;;:::i;52086:168::-;;;;;;;;;;-1:-1:-1;52086:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;52209:27:0;;;52185:4;52209:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;52086:168;52326:401;;;;;;;;;;-1:-1:-1;52326:401:0;;;;;:::i;:::-;;:::i;30348:201::-;;;;;;;;;;-1:-1:-1;30348:201:0;;;;;:::i;:::-;;:::i;64852:321::-;;;;;;;;;;-1:-1:-1;64852:321:0;;;;;:::i;:::-;;:::i;65812:36::-;;;;;;;;;;;;;;;;66948:120;29512:6;;-1:-1:-1;;;;;29512:6:0;13691:10;29659:23;29651:68;;;;-1:-1:-1;;;29651:68:0;;;;;;;:::i;:::-;;;;;;;;;67042:17:::1;:6:::0;67051:8:::1;67042:17;:::i;:::-;67024:14;:36:::0;-1:-1:-1;66948:120:0:o;50865:231::-;50951:7;-1:-1:-1;;;;;50979:21:0;;50971:77;;;;-1:-1:-1;;;50971:77:0;;16033:2:1;50971:77:0;;;16015:21:1;16072:2;16052:18;;;16045:30;16111:34;16091:18;;;16084:62;-1:-1:-1;;;16162:18:1;;;16155:41;16213:19;;50971:77:0;15831:407:1;50971:77:0;-1:-1:-1;51066:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;51066:22:0;;;;;;;;;;;;50865:231::o;49888:310::-;49990:4;-1:-1:-1;;;;;;50027:41:0;;-1:-1:-1;;;50027:41:0;;:110;;-1:-1:-1;;;;;;;50085:52:0;;-1:-1:-1;;;50085:52:0;50027:110;:163;;;-1:-1:-1;;;;;;;;;;41108:40:0;;;50154:36;50007:183;49888:310;-1:-1:-1;;49888:310:0:o;69322:281::-;69390:13;69421:28;69452:10;:8;:10::i;:::-;69421:41;;69511:1;69486:14;69480:28;:32;:115;;;;;;;;;;;;;;;;;69539:14;69555:18;:7;:16;:18::i;:::-;69575:13;69522:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69480:115;69473:122;69322:281;-1:-1:-1;;;69322:281:0:o;68473:363::-;66103:19;;;;:27;;:19;:27;66095:36;;;;;;68593:14:::1;::::0;68556:11:::1;::::0;;:33:::1;::::0;-1:-1:-1;;;68556:33:0;;68578:10:::1;68556:33:::0;;::::1;11504:51:1::0;;;;-1:-1:-1;;;;;68556:11:0::1;::::0;:21:::1;::::0;11477:18:1;;68556:33:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;68548:97;;;::::0;-1:-1:-1;;;68548:97:0;;22459:2:1;68548:97:0::1;::::0;::::1;22441:21:1::0;22498:2;22478:18;;;22471:30;22537:34;22517:18;;;22510:62;-1:-1:-1;;;22588:18:1;;;22581:31;22629:19;;68548:97:0::1;22257:397:1::0;68548:97:0::1;68666:11;::::0;;68717:14:::1;::::0;68666:66:::1;::::0;-1:-1:-1;;;68666:66:0;;-1:-1:-1;;;;;68666:11:0;;::::1;::::0;:24:::1;::::0;:66:::1;::::0;68691:9:::1;::::0;68710:4:::1;::::0;68666:66:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;68743:11:0::1;::::0;;68775:14:::1;::::0;68743:47:::1;::::0;-1:-1:-1;;;68743:47:0;;68768:4:::1;68743:47:::0;;::::1;13516:51:1::0;;;;13583:18;;;13576:34;-1:-1:-1;;;;;68743:11:0::1;::::0;:16:::1;::::0;13489:18:1;;68743:47:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;68801:27;68807:10;68819:1;68822;68801:27;;;;;;;;;;;::::0;:5:::1;:27::i;:::-;68473:363::o:0;67223:330::-;67325:9;;67288:11;;;:33;;-1:-1:-1;;;67288:33:0;;67310:10;67288:33;;;11504:51:1;;;;-1:-1:-1;;;;;67288:11:0;;:21;;11477:18:1;;67288:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;67280:92;;;;-1:-1:-1;;;67280:92:0;;16852:2:1;67280:92:0;;;16834:21:1;16891:2;16871:18;;;16864:30;16930:34;16910:18;;;16903:62;-1:-1:-1;;;16981:18:1;;;16974:31;17022:19;;67280:92:0;16650:397:1;67280:92:0;67393:11;;;67444:9;;67393:61;;-1:-1:-1;;;67393:61:0;;-1:-1:-1;;;;;67393:11:0;;;;:24;;:61;;67418:9;;67437:4;;67393:61;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;67465:11:0;;;67497:9;;67465:42;;-1:-1:-1;;;67465:42:0;;67490:4;67465:42;;;13516:51:1;;;;13583:18;;;13576:34;-1:-1:-1;;;;;67465:11:0;;:16;;13489:18:1;;67465:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67518:27;67524:10;67536:1;67539;67518:27;;;;;;;;;;;;:5;:27::i;66344:113::-;29512:6;;-1:-1:-1;;;;;29512:6:0;13691:10;29659:23;29651:68;;;;-1:-1:-1;;;29651:68:0;;;;;;;:::i;:::-;66416:11:::1;:33:::0;;-1:-1:-1;;;;;;66416:33:0::1;-1:-1:-1::0;;;;;66416:33:0;;;::::1;::::0;;;::::1;::::0;;66344:113::o;52804:442::-;-1:-1:-1;;;;;53037:20:0;;13691:10;53037:20;;:60;;-1:-1:-1;53061:36:0;53078:4;13691:10;52086:168;:::i;53061:36::-;53015:160;;;;-1:-1:-1;;;53015:160:0;;20044:2:1;53015:160:0;;;20026:21:1;20083:2;20063:18;;;20056:30;20122:34;20102:18;;;20095:62;-1:-1:-1;;;20173:18:1;;;20166:48;20231:19;;53015:160:0;19842:414:1;53015:160:0;53186:52;53209:4;53215:2;53219:3;53224:7;53233:4;53186:22;:52::i;:::-;52804:442;;;;;:::o;67982:479::-;68050:11;68059:1;68050:8;:11::i;:::-;68042:56;;;;-1:-1:-1;;;68042:56:0;;18471:2:1;68042:56:0;;;18453:21:1;;;18490:18;;;18483:30;18549:34;18529:18;;;18522:62;18601:18;;68042:56:0;18269:356:1;68042:56:0;68117:11;68126:1;68117:8;:11::i;:::-;68109:58;;;;-1:-1:-1;;;68109:58:0;;18832:2:1;68109:58:0;;;18814:21:1;18871:2;18851:18;;;18844:30;18910:34;18890:18;;;18883:62;-1:-1:-1;;;18961:18:1;;;18954:32;19003:19;;68109:58:0;18630:398:1;68109:58:0;68223:12;;68186:11;;;:33;;-1:-1:-1;;;68186:33:0;;68208:10;68186:33;;;11504:51:1;;;;-1:-1:-1;;;;;68186:11:0;;:21;;11477:18:1;;68186:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;68178:96;;;;-1:-1:-1;;;68178:96:0;;19235:2:1;68178:96:0;;;19217:21:1;19274:2;19254:18;;;19247:30;19313:34;19293:18;;;19286:62;-1:-1:-1;;;19364:18:1;;;19357:32;19406:19;;68178:96:0;19033:398:1;68178:96:0;68295:11;;;68346:12;;68295:64;;-1:-1:-1;;;68295:64:0;;-1:-1:-1;;;;;68295:11:0;;;;:24;;:64;;68320:9;;68339:4;;68295:64;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;68370:11:0;;;68402:12;;68370:45;;-1:-1:-1;;;68370:45:0;;68395:4;68370:45;;;13516:51:1;;;;13583:18;;;13576:34;-1:-1:-1;;;;;68370:11:0;;:16;;13489:18:1;;68370:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68426:27;68432:10;68444:1;68447;68426:27;;;;;;;;;;;;:5;:27::i;66590:110::-;29512:6;;-1:-1:-1;;;;;29512:6:0;13691:10;29659:23;29651:68;;;;-1:-1:-1;;;29651:68:0;;;;;;;:::i;:::-;66674:17:::1;:6:::0;66683:8:::1;66674:17;:::i;:::-;66661:9;:31:::0;-1:-1:-1;66590:110:0:o;51262:524::-;51418:16;51479:3;:10;51460:8;:15;:29;51452:83;;;;-1:-1:-1;;;51452:83:0;;22049:2:1;51452:83:0;;;22031:21:1;22088:2;22068:18;;;22061:30;22127:34;22107:18;;;22100:62;-1:-1:-1;;;22178:18:1;;;22171:39;22227:19;;51452:83:0;21847:405:1;51452:83:0;51548:30;51595:8;:15;51581:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51581:30:0;;51548:63;;51629:9;51624:122;51648:8;:15;51644:1;:19;51624:122;;;51704:30;51714:8;51723:1;51714:11;;;;;;;;:::i;:::-;;;;;;;51727:3;51731:1;51727:6;;;;;;;;:::i;:::-;;;;;;;51704:9;:30::i;:::-;51685:13;51699:1;51685:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;51665:3;;;:::i;:::-;;;51624:122;;;-1:-1:-1;51765:13:0;51262:524;-1:-1:-1;;;51262:524:0:o;69207:104::-;29512:6;;-1:-1:-1;;;;;29512:6:0;13691:10;29659:23;29651:68;;;;-1:-1:-1;;;29651:68:0;;;;;;;:::i;:::-;69282:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;69207:104:::0;:::o;66826:116::-;29512:6;;-1:-1:-1;;;;;29512:6:0;13691:10;29659:23;29651:68;;;;-1:-1:-1;;;29651:68:0;;;;;;;:::i;:::-;66916:17:::1;:6:::0;66925:8:::1;66916:17;:::i;:::-;66900:12;:34:::0;-1:-1:-1;66826:116:0:o;65181:353::-;-1:-1:-1;;;;;65346:23:0;;13691:10;65346:23;;:66;;-1:-1:-1;65373:39:0;65390:7;13691:10;52086:168;:::i;65373:39::-;65324:157;;;;-1:-1:-1;;;65324:157:0;;;;;;;:::i;:::-;65494:32;65505:7;65514:3;65519:6;65494:10;:32::i;:::-;65181:353;;;:::o;65734:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30090:103::-;29512:6;;-1:-1:-1;;;;;29512:6:0;13691:10;29659:23;29651:68;;;;-1:-1:-1;;;29651:68:0;;;;;;;:::i;:::-;30155:30:::1;30182:1;30155:18;:30::i;66469:109::-:0;29512:6;;-1:-1:-1;;;;;29512:6:0;13691:10;29659:23;29651:68;;;;-1:-1:-1;;;29651:68:0;;;;;;;:::i;:::-;66543:19:::1;:27:::0;;-1:-1:-1;;66543:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;66469:109::o;68847:133::-;29512:6;;-1:-1:-1;;;;;29512:6:0;13691:10;29659:23;29651:68;;;;-1:-1:-1;;;29651:68:0;;;;;;;:::i;:::-;68940:32:::1;::::0;-1:-1:-1;;;;;68940:18:0;::::1;::::0;69057:21;68940:32;::::1;;;::::0;::::1;::::0;;;69057:21;68940:18;:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;51859:155:::0;51954:52;13691:10;51987:8;51997;51954:18;:52::i;67565:405::-;67632:11;67641:1;67632:8;:11::i;:::-;67624:56;;;;-1:-1:-1;;;67624:56:0;;18471:2:1;67624:56:0;;;18453:21:1;;;18490:18;;;18483:30;18549:34;18529:18;;;18522:62;18601:18;;67624:56:0;18269:356:1;67624:56:0;67736:11;;67699;;;:33;;-1:-1:-1;;;67699:33:0;;67721:10;67699:33;;;11504:51:1;;;;-1:-1:-1;;;;;67699:11:0;;:21;;11477:18:1;;67699:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;67691:94;;;;-1:-1:-1;;;67691:94:0;;17659:2:1;67691:94:0;;;17641:21:1;17698:2;17678:18;;;17671:30;17737:34;17717:18;;;17710:62;-1:-1:-1;;;17788:18:1;;;17781:31;17829:19;;67691:94:0;17457:397:1;67691:94:0;67806:11;;;67857;;67806:63;;-1:-1:-1;;;67806:63:0;;-1:-1:-1;;;;;67806:11:0;;;;:24;;:63;;67831:9;;67850:4;;67806:63;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;67880:11:0;;;67912;;67880:44;;-1:-1:-1;;;67880:44:0;;67905:4;67880:44;;;13516:51:1;;;;13583:18;;;13576:34;-1:-1:-1;;;;;67880:11:0;;:16;;13489:18:1;;67880:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67935:27;67941:10;67953:1;67956;67935:27;;;;;;;;;;;;:5;:27::i;65762:37::-;;;;;;;:::i;66706:114::-;29512:6;;-1:-1:-1;;;;;29512:6:0;13691:10;29659:23;29651:68;;;;-1:-1:-1;;;29651:68:0;;;;;;;:::i;:::-;66794:17:::1;:6:::0;66803:8:::1;66794:17;:::i;:::-;66779:11;:33:::0;-1:-1:-1;66706:114:0:o;52326:401::-;-1:-1:-1;;;;;52534:20:0;;13691:10;52534:20;;:60;;-1:-1:-1;52558:36:0;52575:4;13691:10;52086:168;:::i;52558:36::-;52512:151;;;;-1:-1:-1;;;52512:151:0;;;;;;;:::i;:::-;52674:45;52692:4;52698:2;52702;52706:6;52714:4;52674:17;:45::i;30348:201::-;29512:6;;-1:-1:-1;;;;;29512:6:0;13691:10;29659:23;29651:68;;;;-1:-1:-1;;;29651:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30437:22:0;::::1;30429:73;;;::::0;-1:-1:-1;;;30429:73:0;;16445:2:1;30429:73:0::1;::::0;::::1;16427:21:1::0;16484:2;16464:18;;;16457:30;16523:34;16503:18;;;16496:62;-1:-1:-1;;;16574:18:1;;;16567:36;16620:19;;30429:73:0::1;16243:402:1::0;30429:73:0::1;30513:28;30532:8;30513:18;:28::i;:::-;30348:201:::0;:::o;64852:321::-;-1:-1:-1;;;;;64992:23:0;;13691:10;64992:23;;:66;;-1:-1:-1;65019:39:0;65036:7;13691:10;52086:168;:::i;65019:39::-;64970:157;;;;-1:-1:-1;;;64970:157:0;;;;;;;:::i;:::-;65140:25;65146:7;65155:2;65159:5;65140;:25::i;69097:99::-;69148:13;69181:7;69174:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69097:99;:::o;11120:723::-;11176:13;11397:10;11393:53;;-1:-1:-1;;11424:10:0;;;;;;;;;;;;-1:-1:-1;;;11424:10:0;;;;;11120:723::o;11393:53::-;11471:5;11456:12;11512:78;11519:9;;11512:78;;11545:8;;;;:::i;:::-;;-1:-1:-1;11568:10:0;;-1:-1:-1;11576:2:0;11568:10;;:::i;:::-;;;11512:78;;;11600:19;11632:6;11622:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11622:17:0;;11600:39;;11650:154;11657:10;;11650:154;;11684:11;11694:1;11684:11;;:::i;:::-;;-1:-1:-1;11753:10:0;11761:2;11753:5;:10;:::i;:::-;11740:24;;:2;:24;:::i;:::-;11727:39;;11710:6;11717;11710:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;11710:56:0;;;;;;;;-1:-1:-1;11781:11:0;11790:2;11781:11;;:::i;:::-;;;11650:154;;;11828:6;11120:723;-1:-1:-1;;;;11120:723:0:o;57280:569::-;-1:-1:-1;;;;;57433:16:0;;57425:62;;;;-1:-1:-1;;;57425:62:0;;23270:2:1;57425:62:0;;;23252:21:1;23309:2;23289:18;;;23282:30;23348:34;23328:18;;;23321:62;-1:-1:-1;;;23399:18:1;;;23392:31;23440:19;;57425:62:0;23068:397:1;57425:62:0;13691:10;57544:102;13691:10;57500:16;57587:2;57591:21;57609:2;57591:17;:21::i;:::-;57614:25;57632:6;57614:17;:25::i;57544:102::-;57659:9;:13;;;;;;;;;;;-1:-1:-1;;;;;57659:17:0;;;;;;;;;:27;;57680:6;;57659:9;:27;;57680:6;;57659:27;:::i;:::-;;;;-1:-1:-1;;57702:52:0;;;23826:25:1;;;23882:2;23867:18;;23860:34;;;-1:-1:-1;;;;;57702:52:0;;;;57735:1;;57702:52;;;;;;23799:18:1;57702:52:0;;;;;;;57767:74;57798:8;57816:1;57820:2;57824;57828:6;57836:4;57767:30;:74::i;54888:1074::-;55115:7;:14;55101:3;:10;:28;55093:81;;;;-1:-1:-1;;;55093:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55193:16:0;;55185:66;;;;-1:-1:-1;;;55185:66:0;;;;;;;:::i;:::-;13691:10;55264:16;55381:421;55405:3;:10;55401:1;:14;55381:421;;;55437:10;55450:3;55454:1;55450:6;;;;;;;;:::i;:::-;;;;;;;55437:19;;55471:14;55488:7;55496:1;55488:10;;;;;;;;:::i;:::-;;;;;;;;;;;;55515:19;55537:13;;;;;;;;;;-1:-1:-1;;;;;55537:19:0;;;;;;;;;;;;55488:10;;-1:-1:-1;55579:21:0;;;;55571:76;;;;-1:-1:-1;;;55571:76:0;;;;;;;:::i;:::-;55691:9;:13;;;;;;;;;;;-1:-1:-1;;;;;55691:19:0;;;;;;;;;;55713:20;;;55691:42;;55763:17;;;;;;;:27;;55713:20;;55691:9;55763:27;;55713:20;;55763:27;:::i;:::-;;;;;;;;55422:380;;;55417:3;;;;:::i;:::-;;;55381:421;;;;55849:2;-1:-1:-1;;;;;55819:47:0;55843:4;-1:-1:-1;;;;;55819:47:0;55833:8;-1:-1:-1;;;;;55819:47:0;;55853:3;55858:7;55819:47;;;;;;;:::i;:::-;;;;;;;;55879:75;55915:8;55925:4;55931:2;55935:3;55940:7;55949:4;55879:35;:75::i;:::-;55082:880;54888:1074;;;;;:::o;67080:131::-;67138:4;67168:30;67178:10;67190:7;67168:9;:30::i;:::-;:35;;;67080:131;-1:-1:-1;;67080:131:0:o;60041:891::-;-1:-1:-1;;;;;60193:18:0;;60185:66;;;;-1:-1:-1;;;60185:66:0;;;;;;;:::i;:::-;60284:7;:14;60270:3;:10;:28;60262:81;;;;-1:-1:-1;;;60262:81:0;;;;;;;:::i;:::-;60400:66;;;;;;;;;60356:16;60400:66;;;;13691:10;;60479:373;60503:3;:10;60499:1;:14;60479:373;;;60535:10;60548:3;60552:1;60548:6;;;;;;;;:::i;:::-;;;;;;;60535:19;;60569:14;60586:7;60594:1;60586:10;;;;;;;;:::i;:::-;;;;;;;;;;;;60613:19;60635:13;;;;;;;;;;-1:-1:-1;;;;;60635:19:0;;;;;;;;;;;;60586:10;;-1:-1:-1;60677:21:0;;;;60669:70;;;;-1:-1:-1;;;60669:70:0;;;;;;;:::i;:::-;60783:9;:13;;;;;;;;;;;-1:-1:-1;;;;;60783:19:0;;;;;;;;;;60805:20;;60783:42;;60515:3;;;;:::i;:::-;;;;60479:373;;;;60907:1;-1:-1:-1;;;;;60869:55:0;60893:4;-1:-1:-1;;;;;60869:55:0;60883:8;-1:-1:-1;;;;;60869:55:0;;60911:3;60916:7;60869:55;;;;;;;:::i;:::-;;;;;;;;60174:758;60041:891;;;:::o;30709:191::-;30802:6;;;-1:-1:-1;;;;;30819:17:0;;;-1:-1:-1;;;;;;30819:17:0;;;;;;;30852:40;;30802:6;;;30819:17;30802:6;;30852:40;;30783:16;;30852:40;30772:128;30709:191;:::o;61074:331::-;61229:8;-1:-1:-1;;;;;61220:17:0;:5;-1:-1:-1;;;;;61220:17:0;;;61212:71;;;;-1:-1:-1;;;61212:71:0;;21639:2:1;61212:71:0;;;21621:21:1;21678:2;21658:18;;;21651:30;21717:34;21697:18;;;21690:62;-1:-1:-1;;;21768:18:1;;;21761:39;21817:19;;61212:71:0;21437:405:1;61212:71:0;-1:-1:-1;;;;;61294:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;61294:46:0;;;;;;;;;;61356:41;;14497::1;;;61356::0;;14470:18:1;61356:41:0;;;;;;;61074:331;;;:::o;53710:820::-;-1:-1:-1;;;;;53898:16:0;;53890:66;;;;-1:-1:-1;;;53890:66:0;;;;;;;:::i;:::-;13691:10;54013:96;13691:10;54044:4;54050:2;54054:21;54072:2;54054:17;:21::i;54013:96::-;54122:19;54144:13;;;;;;;;;;;-1:-1:-1;;;;;54144:19:0;;;;;;;;;;54182:21;;;;54174:76;;;;-1:-1:-1;;;54174:76:0;;;;;;;:::i;:::-;54286:9;:13;;;;;;;;;;;-1:-1:-1;;;;;54286:19:0;;;;;;;;;;54308:20;;;54286:42;;54350:17;;;;;;;:27;;54308:20;;54286:9;54350:27;;54308:20;;54350:27;:::i;:::-;;;;-1:-1:-1;;54395:46:0;;;23826:25:1;;;23882:2;23867:18;;23860:34;;;-1:-1:-1;;;;;54395:46:0;;;;;;;;;;;;;;23799:18:1;54395:46:0;;;;;;;54454:68;54485:8;54495:4;54501:2;54505;54509:6;54517:4;54454:30;:68::i;:::-;53879:651;;53710:820;;;;;:::o;59190:648::-;-1:-1:-1;;;;;59317:18:0;;59309:66;;;;-1:-1:-1;;;59309:66:0;;;;;;;:::i;:::-;13691:10;59432:102;13691:10;59463:4;59388:16;59481:21;59499:2;59481:17;:21::i;:::-;59504:25;59522:6;59504:17;:25::i;:::-;-1:-1:-1;;59432:102:0;;;;;;;;;-1:-1:-1;59432:102:0;;-1:-1:-1;;;54888:1074:0;59432:102;59547:19;59569:13;;;;;;;;;;;-1:-1:-1;;;;;59569:19:0;;;;;;;;;;59607:21;;;;59599:70;;;;-1:-1:-1;;;59599:70:0;;;;;;;:::i;:::-;59705:9;:13;;;;;;;;;;;-1:-1:-1;;;;;59705:19:0;;;;;;;;;;;;59727:20;;;59705:42;;59776:54;;23826:25:1;;;23867:18;;;23860:34;;;59705:19:0;;59776:54;;;;;;23799:18:1;59776:54:0;;;;;;;59298:540;;59190:648;;;:::o;64163:198::-;64283:16;;;64297:1;64283:16;;;;;;;;;64229;;64258:22;;64283:16;;;;;;;;;;;;-1:-1:-1;64283:16:0;64258:41;;64321:7;64310:5;64316:1;64310:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;64348:5;64163:198;-1:-1:-1;;64163:198:0:o;62590:744::-;-1:-1:-1;;;;;62805:13:0;;32103:20;32151:8;62801:526;;62841:72;;-1:-1:-1;;;62841:72:0;;-1:-1:-1;;;;;62841:38:0;;;;;:72;;62880:8;;62890:4;;62896:2;;62900:6;;62908:4;;62841:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62841:72:0;;;;;;;;-1:-1:-1;;62841:72:0;;;;;;;;;;;;:::i;:::-;;;62837:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;63189:6;63182:14;;-1:-1:-1;;;63182:14:0;;;;;;;;:::i;62837:479::-;;;63238:62;;-1:-1:-1;;;63238:62:0;;15203:2:1;63238:62:0;;;15185:21:1;15242:2;15222:18;;;15215:30;15281:34;15261:18;;;15254:62;-1:-1:-1;;;15332:18:1;;;15325:50;15392:19;;63238:62:0;15001:416:1;62837:479:0;-1:-1:-1;;;;;;62963:55:0;;-1:-1:-1;;;62963:55:0;62959:154;;63043:50;;-1:-1:-1;;;63043:50:0;;;;;;;:::i;63342:813::-;-1:-1:-1;;;;;63582:13:0;;32103:20;32151:8;63578:570;;63618:79;;-1:-1:-1;;;63618:79:0;;-1:-1:-1;;;;;63618:43:0;;;;;:79;;63662:8;;63672:4;;63678:3;;63683:7;;63692:4;;63618:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63618:79:0;;;;;;;;-1:-1:-1;;63618:79:0;;;;;;;;;;;;:::i;:::-;;;63614:523;;;;:::i;:::-;-1:-1:-1;;;;;;63779:60:0;;-1:-1:-1;;;63779:60:0;63775:159;;63864:50;;-1:-1:-1;;;63864:50:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:468:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;183:2;177:9;195:69;252:2;231:15;;-1:-1:-1;;227:29:1;258:4;223:40;177:9;195:69;:::i;:::-;282:6;273:15;;312:6;304;297:22;352:3;343:6;338:3;334:16;331:25;328:45;;;369:1;366;359:12;328:45;419:6;414:3;407:4;399:6;395:17;382:44;474:1;467:4;458:6;450;446:19;442:30;435:41;;14:468;;;;;:::o;487:735::-;541:5;594:3;587:4;579:6;575:17;571:27;561:55;;612:1;609;602:12;561:55;648:6;635:20;674:4;697:43;737:2;697:43;:::i;:::-;769:2;763:9;781:31;809:2;801:6;781:31;:::i;:::-;847:18;;;881:15;;;;-1:-1:-1;916:15:1;;;966:1;962:10;;;950:23;;946:32;;943:41;-1:-1:-1;940:61:1;;;997:1;994;987:12;940:61;1019:1;1029:163;1043:2;1040:1;1037:9;1029:163;;;1100:17;;1088:30;;1138:12;;;;1170;;;;1061:1;1054:9;1029:163;;;-1:-1:-1;1210:6:1;;487:735;-1:-1:-1;;;;;;;487:735:1:o;1227:220::-;1269:5;1322:3;1315:4;1307:6;1303:17;1299:27;1289:55;;1340:1;1337;1330:12;1289:55;1362:79;1437:3;1428:6;1415:20;1408:4;1400:6;1396:17;1362:79;:::i;1452:247::-;1511:6;1564:2;1552:9;1543:7;1539:23;1535:32;1532:52;;;1580:1;1577;1570:12;1532:52;1619:9;1606:23;1638:31;1663:5;1638:31;:::i;1964:388::-;2032:6;2040;2093:2;2081:9;2072:7;2068:23;2064:32;2061:52;;;2109:1;2106;2099:12;2061:52;2148:9;2135:23;2167:31;2192:5;2167:31;:::i;:::-;2217:5;-1:-1:-1;2274:2:1;2259:18;;2246:32;2287:33;2246:32;2287:33;:::i;:::-;2339:7;2329:17;;;1964:388;;;;;:::o;2357:1071::-;2511:6;2519;2527;2535;2543;2596:3;2584:9;2575:7;2571:23;2567:33;2564:53;;;2613:1;2610;2603:12;2564:53;2652:9;2639:23;2671:31;2696:5;2671:31;:::i;:::-;2721:5;-1:-1:-1;2778:2:1;2763:18;;2750:32;2791:33;2750:32;2791:33;:::i;:::-;2843:7;-1:-1:-1;2901:2:1;2886:18;;2873:32;2924:18;2954:14;;;2951:34;;;2981:1;2978;2971:12;2951:34;3004:61;3057:7;3048:6;3037:9;3033:22;3004:61;:::i;:::-;2994:71;;3118:2;3107:9;3103:18;3090:32;3074:48;;3147:2;3137:8;3134:16;3131:36;;;3163:1;3160;3153:12;3131:36;3186:63;3241:7;3230:8;3219:9;3215:24;3186:63;:::i;:::-;3176:73;;3302:3;3291:9;3287:19;3274:33;3258:49;;3332:2;3322:8;3319:16;3316:36;;;3348:1;3345;3338:12;3316:36;;3371:51;3414:7;3403:8;3392:9;3388:24;3371:51;:::i;:::-;3361:61;;;2357:1071;;;;;;;;:::o;3433:734::-;3537:6;3545;3553;3561;3569;3622:3;3610:9;3601:7;3597:23;3593:33;3590:53;;;3639:1;3636;3629:12;3590:53;3678:9;3665:23;3697:31;3722:5;3697:31;:::i;:::-;3747:5;-1:-1:-1;3804:2:1;3789:18;;3776:32;3817:33;3776:32;3817:33;:::i;:::-;3869:7;-1:-1:-1;3923:2:1;3908:18;;3895:32;;-1:-1:-1;3974:2:1;3959:18;;3946:32;;-1:-1:-1;4029:3:1;4014:19;;4001:33;4057:18;4046:30;;4043:50;;;4089:1;4086;4079:12;4043:50;4112:49;4153:7;4144:6;4133:9;4129:22;4112:49;:::i;4172:730::-;4299:6;4307;4315;4368:2;4356:9;4347:7;4343:23;4339:32;4336:52;;;4384:1;4381;4374:12;4336:52;4423:9;4410:23;4442:31;4467:5;4442:31;:::i;:::-;4492:5;-1:-1:-1;4548:2:1;4533:18;;4520:32;4571:18;4601:14;;;4598:34;;;4628:1;4625;4618:12;4598:34;4651:61;4704:7;4695:6;4684:9;4680:22;4651:61;:::i;:::-;4641:71;;4765:2;4754:9;4750:18;4737:32;4721:48;;4794:2;4784:8;4781:16;4778:36;;;4810:1;4807;4800:12;4778:36;;4833:63;4888:7;4877:8;4866:9;4862:24;4833:63;:::i;:::-;4823:73;;;4172:730;;;;;:::o;4907:382::-;4972:6;4980;5033:2;5021:9;5012:7;5008:23;5004:32;5001:52;;;5049:1;5046;5039:12;5001:52;5088:9;5075:23;5107:31;5132:5;5107:31;:::i;:::-;5157:5;-1:-1:-1;5214:2:1;5199:18;;5186:32;5227:30;5186:32;5227:30;:::i;5294:315::-;5362:6;5370;5423:2;5411:9;5402:7;5398:23;5394:32;5391:52;;;5439:1;5436;5429:12;5391:52;5478:9;5465:23;5497:31;5522:5;5497:31;:::i;:::-;5547:5;5599:2;5584:18;;;;5571:32;;-1:-1:-1;;;5294:315:1:o;5614:383::-;5691:6;5699;5707;5760:2;5748:9;5739:7;5735:23;5731:32;5728:52;;;5776:1;5773;5766:12;5728:52;5815:9;5802:23;5834:31;5859:5;5834:31;:::i;:::-;5884:5;5936:2;5921:18;;5908:32;;-1:-1:-1;5987:2:1;5972:18;;;5959:32;;5614:383;-1:-1:-1;;;5614:383:1:o;6002:1288::-;6120:6;6128;6181:2;6169:9;6160:7;6156:23;6152:32;6149:52;;;6197:1;6194;6187:12;6149:52;6237:9;6224:23;6266:18;6307:2;6299:6;6296:14;6293:34;;;6323:1;6320;6313:12;6293:34;6361:6;6350:9;6346:22;6336:32;;6406:7;6399:4;6395:2;6391:13;6387:27;6377:55;;6428:1;6425;6418:12;6377:55;6464:2;6451:16;6486:4;6509:43;6549:2;6509:43;:::i;:::-;6581:2;6575:9;6593:31;6621:2;6613:6;6593:31;:::i;:::-;6659:18;;;6693:15;;;;-1:-1:-1;6728:11:1;;;6770:1;6766:10;;;6758:19;;6754:28;;6751:41;-1:-1:-1;6748:61:1;;;6805:1;6802;6795:12;6748:61;6827:1;6818:10;;6837:238;6851:2;6848:1;6845:9;6837:238;;;6922:3;6909:17;6939:31;6964:5;6939:31;:::i;:::-;6983:18;;6869:1;6862:9;;;;;7021:12;;;;7053;;6837:238;;;-1:-1:-1;7094:6:1;-1:-1:-1;;7138:18:1;;7125:32;;-1:-1:-1;;7169:16:1;;;7166:36;;;7198:1;7195;7188:12;7166:36;;7221:63;7276:7;7265:8;7254:9;7250:24;7221:63;:::i;:::-;7211:73;;;6002:1288;;;;;:::o;7295:241::-;7351:6;7404:2;7392:9;7383:7;7379:23;7375:32;7372:52;;;7420:1;7417;7410:12;7372:52;7459:9;7446:23;7478:28;7500:5;7478:28;:::i;7541:245::-;7608:6;7661:2;7649:9;7640:7;7636:23;7632:32;7629:52;;;7677:1;7674;7667:12;7629:52;7709:9;7703:16;7728:28;7750:5;7728:28;:::i;7791:245::-;7849:6;7902:2;7890:9;7881:7;7877:23;7873:32;7870:52;;;7918:1;7915;7908:12;7870:52;7957:9;7944:23;7976:30;8000:5;7976:30;:::i;8041:249::-;8110:6;8163:2;8151:9;8142:7;8138:23;8134:32;8131:52;;;8179:1;8176;8169:12;8131:52;8211:9;8205:16;8230:30;8254:5;8230:30;:::i;8295:450::-;8364:6;8417:2;8405:9;8396:7;8392:23;8388:32;8385:52;;;8433:1;8430;8423:12;8385:52;8473:9;8460:23;8506:18;8498:6;8495:30;8492:50;;;8538:1;8535;8528:12;8492:50;8561:22;;8614:4;8606:13;;8602:27;-1:-1:-1;8592:55:1;;8643:1;8640;8633:12;8592:55;8666:73;8731:7;8726:2;8713:16;8708:2;8704;8700:11;8666:73;:::i;8750:180::-;8809:6;8862:2;8850:9;8841:7;8837:23;8833:32;8830:52;;;8878:1;8875;8868:12;8830:52;-1:-1:-1;8901:23:1;;8750:180;-1:-1:-1;8750:180:1:o;8935:184::-;9005:6;9058:2;9046:9;9037:7;9033:23;9029:32;9026:52;;;9074:1;9071;9064:12;9026:52;-1:-1:-1;9097:16:1;;8935:184;-1:-1:-1;8935:184:1:o;9124:435::-;9177:3;9215:5;9209:12;9242:6;9237:3;9230:19;9268:4;9297:2;9292:3;9288:12;9281:19;;9334:2;9327:5;9323:14;9355:1;9365:169;9379:6;9376:1;9373:13;9365:169;;;9440:13;;9428:26;;9474:12;;;;9509:15;;;;9401:1;9394:9;9365:169;;;-1:-1:-1;9550:3:1;;9124:435;-1:-1:-1;;;;;9124:435:1:o;9564:257::-;9605:3;9643:5;9637:12;9670:6;9665:3;9658:19;9686:63;9742:6;9735:4;9730:3;9726:14;9719:4;9712:5;9708:16;9686:63;:::i;:::-;9803:2;9782:15;-1:-1:-1;;9778:29:1;9769:39;;;;9810:4;9765:50;;9564:257;-1:-1:-1;;9564:257:1:o;9826:1527::-;10050:3;10088:6;10082:13;10114:4;10127:51;10171:6;10166:3;10161:2;10153:6;10149:15;10127:51;:::i;:::-;10241:13;;10200:16;;;;10263:55;10241:13;10200:16;10285:15;;;10263:55;:::i;:::-;10407:13;;10340:20;;;10380:1;;10467;10489:18;;;;10542;;;;10569:93;;10647:4;10637:8;10633:19;10621:31;;10569:93;10710:2;10700:8;10697:16;10677:18;10674:40;10671:167;;;-1:-1:-1;;;10737:33:1;;10793:4;10790:1;10783:15;10823:4;10744:3;10811:17;10671:167;10854:18;10881:110;;;;11005:1;11000:328;;;;10847:481;;10881:110;-1:-1:-1;;10916:24:1;;10902:39;;10961:20;;;;-1:-1:-1;10881:110:1;;11000:328;24166:1;24159:14;;;24203:4;24190:18;;11095:1;11109:169;11123:8;11120:1;11117:15;11109:169;;;11205:14;;11190:13;;;11183:37;11248:16;;;;11140:10;;11109:169;;;11113:3;;11309:8;11302:5;11298:20;11291:27;;10847:481;-1:-1:-1;11344:3:1;;9826:1527;-1:-1:-1;;;;;;;;;;;9826:1527:1:o;11566:826::-;-1:-1:-1;;;;;11963:15:1;;;11945:34;;12015:15;;12010:2;11995:18;;11988:43;11925:3;12062:2;12047:18;;12040:31;;;11888:4;;12094:57;;12131:19;;12123:6;12094:57;:::i;:::-;12199:9;12191:6;12187:22;12182:2;12171:9;12167:18;12160:50;12233:44;12270:6;12262;12233:44;:::i;:::-;12219:58;;12326:9;12318:6;12314:22;12308:3;12297:9;12293:19;12286:51;12354:32;12379:6;12371;12354:32;:::i;:::-;12346:40;11566:826;-1:-1:-1;;;;;;;;11566:826:1:o;12397:375::-;-1:-1:-1;;;;;12655:15:1;;;12637:34;;12707:15;;;;12702:2;12687:18;;12680:43;12754:2;12739:18;;12732:34;;;;12587:2;12572:18;;12397:375::o;12777:560::-;-1:-1:-1;;;;;13074:15:1;;;13056:34;;13126:15;;13121:2;13106:18;;13099:43;13173:2;13158:18;;13151:34;;;13216:2;13201:18;;13194:34;;;13036:3;13259;13244:19;;13237:32;;;12999:4;;13286:45;;13311:19;;13303:6;13286:45;:::i;:::-;13278:53;12777:560;-1:-1:-1;;;;;;;12777:560:1:o;13621:261::-;13800:2;13789:9;13782:21;13763:4;13820:56;13872:2;13861:9;13857:18;13849:6;13820:56;:::i;13887:465::-;14144:2;14133:9;14126:21;14107:4;14170:56;14222:2;14211:9;14207:18;14199:6;14170:56;:::i;:::-;14274:9;14266:6;14262:22;14257:2;14246:9;14242:18;14235:50;14302:44;14339:6;14331;14302:44;:::i;:::-;14294:52;13887:465;-1:-1:-1;;;;;13887:465:1:o;14777:219::-;14926:2;14915:9;14908:21;14889:4;14946:44;14986:2;14975:9;14971:18;14963:6;14946:44;:::i;15422:404::-;15624:2;15606:21;;;15663:2;15643:18;;;15636:30;15702:34;15697:2;15682:18;;15675:62;-1:-1:-1;;;15768:2:1;15753:18;;15746:38;15816:3;15801:19;;15422:404::o;17052:400::-;17254:2;17236:21;;;17293:2;17273:18;;;17266:30;17332:34;17327:2;17312:18;;17305:62;-1:-1:-1;;;17398:2:1;17383:18;;17376:34;17442:3;17427:19;;17052:400::o;17859:405::-;18061:2;18043:21;;;18100:2;18080:18;;;18073:30;18139:34;18134:2;18119:18;;18112:62;-1:-1:-1;;;18205:2:1;18190:18;;18183:39;18254:3;18239:19;;17859:405::o;19436:401::-;19638:2;19620:21;;;19677:2;19657:18;;;19650:30;19716:34;19711:2;19696:18;;19689:62;-1:-1:-1;;;19782:2:1;19767:18;;19760:35;19827:3;19812:19;;19436:401::o;20261:399::-;20463:2;20445:21;;;20502:2;20482:18;;;20475:30;20541:34;20536:2;20521:18;;20514:62;-1:-1:-1;;;20607:2:1;20592:18;;20585:33;20650:3;20635:19;;20261:399::o;20665:406::-;20867:2;20849:21;;;20906:2;20886:18;;;20879:30;20945:34;20940:2;20925:18;;20918:62;-1:-1:-1;;;21011:2:1;20996:18;;20989:40;21061:3;21046:19;;20665:406::o;21076:356::-;21278:2;21260:21;;;21297:18;;;21290:30;21356:34;21351:2;21336:18;;21329:62;21423:2;21408:18;;21076:356::o;22659:404::-;22861:2;22843:21;;;22900:2;22880:18;;;22873:30;22939:34;22934:2;22919:18;;22912:62;-1:-1:-1;;;23005:2:1;22990:18;;22983:38;23053:3;23038:19;;22659:404::o;23905:183::-;23965:4;23998:18;23990:6;23987:30;23984:56;;;24020:18;;:::i;:::-;-1:-1:-1;24065:1:1;24061:14;24077:4;24057:25;;23905:183::o;24219:128::-;24259:3;24290:1;24286:6;24283:1;24280:13;24277:39;;;24296:18;;:::i;:::-;-1:-1:-1;24332:9:1;;24219:128::o;24352:120::-;24392:1;24418;24408:35;;24423:18;;:::i;:::-;-1:-1:-1;24457:9:1;;24352:120::o;24477:168::-;24517:7;24583:1;24579;24575:6;24571:14;24568:1;24565:21;24560:1;24553:9;24546:17;24542:45;24539:71;;;24590:18;;:::i;:::-;-1:-1:-1;24630:9:1;;24477:168::o;24650:125::-;24690:4;24718:1;24715;24712:8;24709:34;;;24723:18;;:::i;:::-;-1:-1:-1;24760:9:1;;24650:125::o;24780:258::-;24852:1;24862:113;24876:6;24873:1;24870:13;24862:113;;;24952:11;;;24946:18;24933:11;;;24926:39;24898:2;24891:10;24862:113;;;24993:6;24990:1;24987:13;24984:48;;;25028:1;25019:6;25014:3;25010:16;25003:27;24984:48;;24780:258;;;:::o;25043:380::-;25122:1;25118:12;;;;25165;;;25186:61;;25240:4;25232:6;25228:17;25218:27;;25186:61;25293:2;25285:6;25282:14;25262:18;25259:38;25256:161;;;25339:10;25334:3;25330:20;25327:1;25320:31;25374:4;25371:1;25364:15;25402:4;25399:1;25392:15;25256:161;;25043:380;;;:::o;25428:249::-;25538:2;25519:13;;-1:-1:-1;;25515:27:1;25503:40;;25573:18;25558:34;;25594:22;;;25555:62;25552:88;;;25620:18;;:::i;:::-;25656:2;25649:22;-1:-1:-1;;25428:249:1:o;25682:135::-;25721:3;-1:-1:-1;;25742:17:1;;25739:43;;;25762:18;;:::i;:::-;-1:-1:-1;25809:1:1;25798:13;;25682:135::o;25822:112::-;25854:1;25880;25870:35;;25885:18;;:::i;:::-;-1:-1:-1;25919:9:1;;25822:112::o;25939:127::-;26000:10;25995:3;25991:20;25988:1;25981:31;26031:4;26028:1;26021:15;26055:4;26052:1;26045:15;26071:127;26132:10;26127:3;26123:20;26120:1;26113:31;26163:4;26160:1;26153:15;26187:4;26184:1;26177:15;26203:127;26264:10;26259:3;26255:20;26252:1;26245:31;26295:4;26292:1;26285:15;26319:4;26316:1;26309:15;26335:127;26396:10;26391:3;26387:20;26384:1;26377:31;26427:4;26424:1;26417:15;26451:4;26448:1;26441:15;26467:179;26502:3;26544:1;26526:16;26523:23;26520:120;;;26590:1;26587;26584;26569:23;-1:-1:-1;26627:1:1;26621:8;26616:3;26612:18;26520:120;26467:179;:::o;26651:671::-;26690:3;26732:4;26714:16;26711:26;26708:39;;;26651:671;:::o;26708:39::-;26774:2;26768:9;-1:-1:-1;;26839:16:1;26835:25;;26832:1;26768:9;26811:50;26890:4;26884:11;26914:16;26949:18;27020:2;27013:4;27005:6;27001:17;26998:25;26993:2;26985:6;26982:14;26979:45;26976:58;;;27027:5;;;;;26651:671;:::o;26976:58::-;27064:6;27058:4;27054:17;27043:28;;27100:3;27094:10;27127:2;27119:6;27116:14;27113:27;;;27133:5;;;;;;26651:671;:::o;27113:27::-;27217:2;27198:16;27192:4;27188:27;27184:36;27177:4;27168:6;27163:3;27159:16;27155:27;27152:69;27149:82;;;27224:5;;;;;;26651:671;:::o;27149:82::-;27240:57;27291:4;27282:6;27274;27270:19;27266:30;27260:4;27240:57;:::i;:::-;-1:-1:-1;27313:3:1;;26651:671;-1:-1:-1;;;;;26651:671:1:o;27327:131::-;-1:-1:-1;;;;;27402:31:1;;27392:42;;27382:70;;27448:1;27445;27438:12;27463:118;27549:5;27542:13;27535:21;27528:5;27525:32;27515:60;;27571:1;27568;27561:12;27586:131;-1:-1:-1;;;;;;27660:32:1;;27650:43;;27640:71;;27707:1;27704;27697:12

Swarm Source

ipfs://be42748038bf4eaf13e454a92cdbb8615d74aeb703e08c1552ed92137bd94ec2
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.