ETH Price: $2,428.22 (+1.31%)
 

Overview

Max Total Supply

7,888.553994295602407129 Rainbows

Holders

1,040

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
genericsafe.eth
Balance
13.31790074146978565 Rainbows

Value
$0.00
0xEc9e261c41e0d35EFcb6C8f940Fbb8a9c3642977
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:
Rainbows

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/security/Pausable.sol


// OpenZeppelin Contracts v4.4.0 (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.0 (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: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.0 (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: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.0 (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: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts v4.4.0 (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: contracts/Rainbows.sol


pragma solidity ^0.8.0;




interface InterfaceNoundles {
    function noundleBalance(address owner) external view returns(uint256);
}

interface InterfaceEvilNoundles {
    function companionBalance(address owner) external view returns(uint256);
    function getEvilNoundleOwners() external view returns (address[] memory);

    function lowLandBalance(address owner) external view returns(uint256);
    function midLandBalance(address owner) external view returns(uint256);
    function highLandBalance(address owner) external view returns(uint256);
}

contract Rainbows is ERC20, Ownable, Pausable {

    InterfaceNoundles public Noundles;
    InterfaceEvilNoundles public EvilNoundles;

    // The starting block.
    uint256 public startBlock;
    uint256 public startBlockCompanion;

    // The maximum that can ever be minted.
    uint256 public maximumSupply     = 33333333 ether;

    // Noundle holders: The interval that the user is paid out.
    uint256 public interval          = 86400;
    uint256 public rate              = 4 ether;
    uint256 public companionInterval = 86400;
    uint256 public companionRate     = 2 ether;

    // Land protection
    uint256 public landPertectionRateLow  = 2;
    uint256 public landPertectionRateMid  = 5;
    uint256 public landPertectionRateHigh = 10;

    // Steal Amount.
    bool public stealingEnabled      = false;
    uint256 public stealPercentage   = 20;

    // Loss on a trade.
    uint256 public tradeLoss         = 35;

    // The rewards for the user (OG).
    mapping(address => uint256) public rewards;
    mapping(address => uint256) public companionRewards;
    mapping(address => uint256) public evilRewards;

    // The last time they were paid out.
    mapping(address => uint256) public lastUpdate;
    mapping(address => uint256) public lastUpdateCompanion;

    // Extended access
    mapping(address => bool) public extendedAccess;

    // Only allow the contract to interact with it.
    modifier onlyFromNoundles() {
        require((msg.sender == address(Noundles)), "Your address doesn't have permissing");
        _;
    }
    modifier onlyFromEvilNoundles() {
        require(msg.sender == address(EvilNoundles));
        _;
    }
    modifier onlyFromRestricted() {
        require(extendedAccess[msg.sender], "Your address does not have permission to use.");
        _;
    }

    constructor(address noundlesAddress, address evilNoundlesAddress) ERC20("NoundlesRainbows", "Rainbows") {

        // Set the address to interfaces.
        Noundles     = InterfaceNoundles(noundlesAddress);
        EvilNoundles = InterfaceEvilNoundles(evilNoundlesAddress);

        // Set the starting block.
        startBlock = block.timestamp;
        startBlockCompanion = block.timestamp;

        // Pause the system so no one can interact with it.
        _pause();
    }

    /*
        Admin Utility.
    */

    // Pause it.
    function pause() public onlyOwner { _pause(); }

    // Unpause it.
    function unpause() public onlyOwner { _unpause(); }

    // Set the start block.
    function setStartBlock(uint256 arg) public onlyOwner {
        if(arg == 0){
            startBlock = block.timestamp;
        }else{
            startBlock = arg;
        }
    }
    // Set the start block for companions.
    function setStartBlockCompanion(uint256 arg) public onlyOwner {
        if(arg == 0){
            startBlockCompanion = block.timestamp;
        }else{
            startBlockCompanion = arg;
        }
    }
    // Set the status of stealing.
    function setStealingStatus(bool arg) public onlyOwner {
        stealingEnabled = arg;
    }

    // Set the start block.
    function setIntervalAndRate(uint256 _interval, uint256 _rate) public onlyOwner {
        interval = _interval;
        rate = _rate;
    }

    // Set the steal rate.
    function setStealPercentage(uint256 _arg) public onlyOwner { stealPercentage = _arg; }

    // Set the trade loss.
    function setLossPercentage(uint256 _arg) public onlyOwner { tradeLoss = _arg; }

    // Set the land protection rate.
    function setLandProtectionRates(uint256 _low, uint256 _mid, uint256 _high) public onlyOwner {
        landPertectionRateLow  = _low;
        landPertectionRateMid  = _mid;
        landPertectionRateHigh = _high;
    }

    // Set the start block.
    function setCompanionIntervalAndRate(uint256 _interval, uint256 _rate) public onlyOwner {
        companionInterval = _interval;
        companionRate = _rate;
    }

    // Set the address for the contract.
    function setNoundlesContractAddress(address _noundles) public onlyOwner {
        Noundles = InterfaceNoundles(_noundles);
    }

    // Set the address for the evil noundles contract.
    function setEvilNoundlesContractAddress(address _noundles) public onlyOwner {
        EvilNoundles = InterfaceEvilNoundles(_noundles);
    }

    // Set the address for the contract.
    function setAddressAccess(address _noundles, bool _value) public onlyOwner {
        extendedAccess[_noundles] = _value;
    }

    // Get the access status for a address.
    function getAddressAccess(address user) external view returns(bool) {
        return extendedAccess[user];
    }

    // Burn the tokens required to evolve.
    function burnMultiple(address [] memory users, uint256 [] memory amount) external onlyFromRestricted {
        for(uint256 i = 0; i < users.length; i += 1){
            _burn(users[i], amount[i]);
        }
    }

    // Burn the tokens required to evolve.
    function burn(address user, uint256 amount) external onlyFromRestricted {
        _burn(user, amount);
    }

    // Mint some tokens for uniswap.
    function adminCreate(address [] memory users, uint256 [] memory amount) public onlyOwner {
        for(uint256 i = 0; i < users.length; i += 1){
            _mint(users[i], amount[i]);
        }
    }

    /*
        Helpers.
    */

    // The rewards to the user.
    function getTotalClaimable(address user) external view returns(uint256) {
        return rewards[user] + getPendingOGReward(user);
    }

    // The rewards to the user.
    function getTotalCompanionClaimable(address user) external view returns(uint256) {
        return companionRewards[user] + getPendingCompanionReward(user);
    }

    function getTotalStolenClaimable(address user) external view returns(uint256) {
        return evilRewards[user];
    }

    // The rewards to the user.
    function getLastUpdate(address user) external view returns(uint256) {
        return lastUpdate[user];
    }

    // The rewards to the user.
    function getLastUpdateCompanion(address user) external view returns(uint256) {
        return lastUpdateCompanion[user];
    }


    // Set the address for the contract.
    function setLastUpdate(address[] memory _noundles, uint256 [] memory values) public onlyOwner {
        for(uint256 i = 0; i < _noundles.length; i += 1){
            lastUpdate[_noundles[i]] = values[i];
        }
    }

     // Set the address for the contract.
    function setLastUpdateCompanion(address[] memory _noundles, uint256 [] memory values) public onlyOwner {
        for(uint256 i = 0; i < _noundles.length; i += 1){
            lastUpdateCompanion[_noundles[i]] = values[i];
        }
    }

    // Update the supply.
    function setMaximumSupply(uint256 _arg) public onlyOwner {
        maximumSupply = _arg;
    }

    /*
        User Utilities.
    */

    // Transfer the tokens (only accessable from the contract).
    function transferTokens(address _from, address _to) onlyFromRestricted whenNotPaused external {

        // Refactor this.
        if(_from != address(0)){
            rewards[_from]            += (getPendingOGReward(_from) * (100 - tradeLoss)) / 100;
            companionRewards[_from]   += (getPendingCompanionReward(_from) * (100 - tradeLoss)) / 100;
            lastUpdate[_from]          = block.timestamp;
            lastUpdateCompanion[_from] = block.timestamp;
        }

        if(_to != address(0)){
            rewards[_to]            += getPendingOGReward(_to);
            companionRewards[_to]   += getPendingCompanionReward(_to);
            lastUpdate[_to]          = block.timestamp;
            lastUpdateCompanion[_to] = block.timestamp;
        }
    }

    // Pay out the holder.
    function claimReward() external whenNotPaused {

        // Make a local copy of the rewards.
        uint256 _ogRewards   = rewards[msg.sender];
        uint256 _compRewards = companionRewards[msg.sender];
        uint256 _evilRewards = evilRewards[msg.sender];

        // Get the rewards.
        uint256 pendingOGRewards        = getPendingOGReward(msg.sender);
        uint256 pendingCompanionRewards = getPendingCompanionReward(msg.sender);

        // Reset the rewards.
        rewards[msg.sender]          = 0;
        companionRewards[msg.sender] = 0;
        evilRewards[msg.sender]      = 0;

        // Reset the block.
        lastUpdate[msg.sender]          = block.timestamp;
        lastUpdateCompanion[msg.sender] = block.timestamp;

        // Add up the totals.
        uint256 totalRewardsWithoutEvil = _ogRewards + _compRewards + pendingOGRewards + pendingCompanionRewards;

        // Block if we hit our limit.
        require(totalSupply() + totalRewardsWithoutEvil < maximumSupply, "No longer able to mint tokens.");

        // How much is one percent worth.
        uint256 percent = totalRewardsWithoutEvil / 100;

        // The calculated steal percentage.
        uint256 calculatedStealPercentage = stealPercentage;

        // If stealing is enabled.
        if(stealingEnabled){

            uint256 landProtection = 0;

            // Calculate how much the land protected.
            if(EvilNoundles.highLandBalance(msg.sender) > 0){
                landProtection = landPertectionRateHigh;
            }else if(EvilNoundles.midLandBalance(msg.sender) > 0){
                landProtection = landPertectionRateMid;
            }else if(EvilNoundles.lowLandBalance(msg.sender) > 0){
                landProtection = landPertectionRateLow;
            }

            if(landProtection < calculatedStealPercentage){
                calculatedStealPercentage -= landProtection;
            }else{
                calculatedStealPercentage = 0;
            }

            // Handle stealing.
            address[] memory evilNoundleLists = EvilNoundles.getEvilNoundleOwners();

            // Cut the total amount stolen into shares for each noundle.
            uint256 rewardPerEvilNoundle = (percent * calculatedStealPercentage) / evilNoundleLists.length;

            // Give each evil noundle holder a cut into their stolen.
            for(uint256 _index; _index < evilNoundleLists.length; _index += 1){
                evilRewards[evilNoundleLists[_index]] += rewardPerEvilNoundle;
            }
        }else{
            // If stealing isn't enabled, set it to 0.
            calculatedStealPercentage = 0;
        }

        // The final result after it was stolen from by those evil noundles :(
        uint256 totalRewards = (percent * (100 - calculatedStealPercentage)) + _evilRewards;

        // Mint the user their tokens.
        _mint(msg.sender, totalRewards);
    }

    // Get the total rewards.
    function getPendingOGReward(address user) internal view returns(uint256) {
        return Noundles.noundleBalance(user) *
               rate *
               (block.timestamp - (lastUpdate[user] >= startBlock ? lastUpdate[user] : startBlock)) /
               interval;
    }

    // Get the total rewards.
    function getPendingCompanionReward(address user) internal view returns(uint256) {
        return EvilNoundles.companionBalance(user) *
               companionRate *
               (block.timestamp - (lastUpdateCompanion[user] >= startBlockCompanion ? lastUpdateCompanion[user] : startBlockCompanion)) /
               companionInterval;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"noundlesAddress","type":"address"},{"internalType":"address","name":"evilNoundlesAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"EvilNoundles","outputs":[{"internalType":"contract InterfaceEvilNoundles","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Noundles","outputs":[{"internalType":"contract InterfaceNoundles","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"adminCreate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"burnMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"companionInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"companionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"companionRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"evilRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"extendedAccess","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getAddressAccess","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getLastUpdate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getLastUpdateCompanion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getTotalClaimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getTotalCompanionClaimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getTotalStolenClaimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"interval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"landPertectionRateHigh","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"landPertectionRateLow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"landPertectionRateMid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastUpdate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastUpdateCompanion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_noundles","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setAddressAccess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_interval","type":"uint256"},{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"setCompanionIntervalAndRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_noundles","type":"address"}],"name":"setEvilNoundlesContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_interval","type":"uint256"},{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"setIntervalAndRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_low","type":"uint256"},{"internalType":"uint256","name":"_mid","type":"uint256"},{"internalType":"uint256","name":"_high","type":"uint256"}],"name":"setLandProtectionRates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_noundles","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"setLastUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_noundles","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"setLastUpdateCompanion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_arg","type":"uint256"}],"name":"setLossPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_arg","type":"uint256"}],"name":"setMaximumSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_noundles","type":"address"}],"name":"setNoundlesContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"arg","type":"uint256"}],"name":"setStartBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"arg","type":"uint256"}],"name":"setStartBlockCompanion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_arg","type":"uint256"}],"name":"setStealPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"arg","type":"bool"}],"name":"setStealingStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlockCompanion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stealPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stealingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradeLoss","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526a1b929b9a4d1cb514340000600a90815562015180600b819055673782dace9d900000600c55600d55671bc16d674ec80000600e556002600f5560056010556011556012805460ff1916905560146013819055602390553480156200006857600080fd5b5060405162002a2938038062002a298339810160408190526200008b9162000339565b604080518082018252601081526f4e6f756e646c65735261696e626f777360801b6020808301918252835180850190945260088452675261696e626f777360c01b908401528151919291620000e39160039162000276565b508051620000f990600490602084019062000276565b50505062000116620001106200016e60201b60201c565b62000172565b6005805460ff60a01b19169055600680546001600160a01b038085166001600160a01b031992831617909255600780549284169290911691909117905542600881905560095562000166620001c4565b5050620003ae565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620001d8600554600160a01b900460ff1690565b156200021d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640160405180910390fd5b6005805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620002593390565b6040516001600160a01b03909116815260200160405180910390a1565b828054620002849062000371565b90600052602060002090601f016020900481019282620002a85760008555620002f3565b82601f10620002c357805160ff1916838001178555620002f3565b82800160010185558215620002f3579182015b82811115620002f3578251825591602001919060010190620002d6565b506200030192915062000305565b5090565b5b8082111562000301576000815560010162000306565b80516001600160a01b03811681146200033457600080fd5b919050565b600080604083850312156200034d57600080fd5b62000358836200031c565b915062000368602084016200031c565b90509250929050565b600181811c908216806200038657607f821691505b60208210811415620003a857634e487b7160e01b600052602260045260246000fd5b50919050565b61266b80620003be6000396000f3fe608060405234801561001057600080fd5b50600436106103c55760003560e01c806370a08231116101ff578063aa1a29721161011a578063dd51d433116100ad578063f2fde38b1161007c578063f2fde38b1461087c578063f35e4a6e1461088f578063fd8558db146108a2578063fec8af24146108ab57600080fd5b8063dd51d433146107ed578063dd62ed3e14610800578063eae9526114610839578063ebabdd021461085957600080fd5b8063d216294f116100e9578063d216294f146107ab578063d3888857146107be578063da229c02146107c7578063dc988394146107da57600080fd5b8063aa1a297214610767578063b88a802f14610770578063bd13c11214610778578063cb03fb1e1461078b57600080fd5b8063947a36fb116101925780639fc02c98116101615780639fc02c9814610714578063a457c2d714610721578063a67876e814610734578063a9059cbb1461075457600080fd5b8063947a36fb146106e757806395d89b41146106f05780639dc29fac146106f85780639de491271461070b57600080fd5b806384584d70116101ce57806384584d701461069d5780638cb2c5d1146106b05780638da5cb5b146106c35780638e6eafef146106d457600080fd5b806370a0823114610651578063715018a61461067a5780637b678c2c146106825780638456cb591461069557600080fd5b806336cc8c0b116102ef5780635a5a72ac116102825780635feae415116102515780635feae4151461060557806366429dc11461061857806366a95e6b1461062b5780636a092e791461063e57600080fd5b80635a5a72ac146105a45780635a7e1989146105b75780635b2a6a72146105e05780635c975abb146105f357600080fd5b80634762e121116102be5780634762e1211461056c57806348cd4cb11461057f5780635035248314610588578063503db6981461059157600080fd5b806336cc8c0b1461051f57806339509351146105285780633dc8ea6b1461053b5780633f4ba83a1461056457600080fd5b80631aa16e70116103675780632c4e722e116103365780632c4e722e146104bc5780632ec61c81146104c5578063313ce567146104e55780633526bacb146104f457600080fd5b80631aa16e70146104585780631cae87e71461048157806323b872dd14610496578063267e8ab6146104a957600080fd5b8063095ea7b3116103a3578063095ea7b31461041b578063154c4bc91461043e57806318160ddd14610447578063190c26ef1461044f57600080fd5b80630480e58b146103ca57806306fdde03146103e65780630700037d146103fb575b600080fd5b6103d3600a5481565b6040519081526020015b60405180910390f35b6103ee6108d7565b6040516103dd91906123dd565b6103d36104093660046120d9565b60156020526000908152604090205481565b61042e6104293660046121ac565b610969565b60405190151581526020016103dd565b6103d3600f5481565b6002546103d3565b6103d360095481565b6103d36104663660046120d9565b6001600160a01b031660009081526019602052604090205490565b61049461048f3660046123b1565b61097f565b005b61042e6104a4366004612136565b6109c0565b6103d36104b73660046120d9565b610a6a565b6103d3600c5481565b6103d36104d33660046120d9565b60176020526000908152604090205481565b604051601281526020016103dd565b600754610507906001600160a01b031681565b6040516001600160a01b0390911681526020016103dd565b6103d3600e5481565b61042e6105363660046121ac565b610a9e565b6103d36105493660046120d9565b6001600160a01b031660009081526017602052604090205490565b610494610ada565b600654610507906001600160a01b031681565b6103d360085481565b6103d360135481565b6103d361059f3660046120d9565b610b0e565b6104946105b2366004612279565b610b3c565b6103d36105c53660046120d9565b6001600160a01b031660009081526018602052604090205490565b6104946105ee36600461238f565b610bc5565b600554600160a01b900460ff1661042e565b61049461061336600461238f565b610bfa565b610494610626366004612279565b610c2f565b610494610639366004612177565b610ccb565b61049461064c3660046120fd565b610d20565b6103d361065f3660046120d9565b6001600160a01b031660009081526020819052604090205490565b610494610f11565b6104946106903660046120d9565b610f45565b610494610f91565b6104946106ab36600461235d565b610fc3565b6104946106be36600461235d565b610ff2565b6005546001600160a01b0316610507565b6104946106e2366004612342565b611021565b6103d3600b5481565b6103ee61105e565b6104946107063660046121ac565b61106d565b6103d360115481565b60125461042e9060ff1681565b61042e61072f3660046121ac565b6110a6565b6103d36107423660046120d9565b60166020526000908152604090205481565b61042e6107623660046121ac565b61113f565b6103d360145481565b61049461114c565b61049461078636600461235d565b6115b0565b6103d36107993660046120d9565b60186020526000908152604090205481565b6104946107b9366004612279565b6115df565b6103d360105481565b6104946107d536600461235d565b611668565b6104946107e83660046120d9565b6116a7565b6104946107fb366004612279565b6116f3565b6103d361080e3660046120fd565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6103d36108473660046120d9565b60196020526000908152604090205481565b61042e6108673660046120d9565b601a6020526000908152604090205460ff1681565b61049461088a3660046120d9565b61178f565b61049461089d36600461235d565b611827565b6103d3600d5481565b61042e6108b93660046120d9565b6001600160a01b03166000908152601a602052604090205460ff1690565b6060600380546108e6906125a3565b80601f0160208091040260200160405190810160405280929190818152602001828054610912906125a3565b801561095f5780601f106109345761010080835404028352916020019161095f565b820191906000526020600020905b81548152906001019060200180831161094257829003601f168201915b5050505050905090565b6000610976338484611862565b50600192915050565b6005546001600160a01b031633146109b25760405162461bcd60e51b81526004016109a99061245c565b60405180910390fd5b600f92909255601055601155565b60006109cd848484611986565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610a525760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016109a9565b610a5f8533858403611862565b506001949350505050565b6000610a7582611b55565b6001600160a01b038316600090815260156020526040902054610a989190612533565b92915050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610976918590610ad5908690612533565b611862565b6005546001600160a01b03163314610b045760405162461bcd60e51b81526004016109a99061245c565b610b0c611c48565b565b6000610b1982611ce5565b6001600160a01b038316600090815260166020526040902054610a989190612533565b6005546001600160a01b03163314610b665760405162461bcd60e51b81526004016109a99061245c565b60005b8251811015610bc057610bae838281518110610b8757610b876125f4565b6020026020010151838381518110610ba157610ba16125f4565b6020026020010151611d6e565b610bb9600182612533565b9050610b69565b505050565b6005546001600160a01b03163314610bef5760405162461bcd60e51b81526004016109a99061245c565b600d91909155600e55565b6005546001600160a01b03163314610c245760405162461bcd60e51b81526004016109a99061245c565b600b91909155600c55565b6005546001600160a01b03163314610c595760405162461bcd60e51b81526004016109a99061245c565b60005b8251811015610bc057818181518110610c7757610c776125f4565b602002602001015160196000858481518110610c9557610c956125f4565b6020908102919091018101516001600160a01b0316825281019190915260400160002055610cc4600182612533565b9050610c5c565b6005546001600160a01b03163314610cf55760405162461bcd60e51b81526004016109a99061245c565b6001600160a01b03919091166000908152601a60205260409020805460ff1916911515919091179055565b336000908152601a602052604090205460ff16610d4f5760405162461bcd60e51b81526004016109a990612491565b600554600160a01b900460ff1615610d795760405162461bcd60e51b81526004016109a990612432565b6001600160a01b03821615610e675760646014546064610d99919061258c565b610da284611b55565b610dac919061256d565b610db6919061254b565b6001600160a01b03831660009081526015602052604081208054909190610dde908490612533565b9091555050601454606490610df3908261258c565b610dfc84611ce5565b610e06919061256d565b610e10919061254b565b6001600160a01b03831660009081526016602052604081208054909190610e38908490612533565b90915550506001600160a01b038216600090815260186020908152604080832042908190556019909252909120555b6001600160a01b03811615610f0d57610e7f81611b55565b6001600160a01b03821660009081526015602052604081208054909190610ea7908490612533565b90915550610eb6905081611ce5565b6001600160a01b03821660009081526016602052604081208054909190610ede908490612533565b90915550506001600160a01b038116600090815260186020908152604080832042908190556019909252909120555b5050565b6005546001600160a01b03163314610f3b5760405162461bcd60e51b81526004016109a99061245c565b610b0c6000611e4d565b6005546001600160a01b03163314610f6f5760405162461bcd60e51b81526004016109a99061245c565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610fbb5760405162461bcd60e51b81526004016109a99061245c565b610b0c611e9f565b6005546001600160a01b03163314610fed5760405162461bcd60e51b81526004016109a99061245c565b601455565b6005546001600160a01b0316331461101c5760405162461bcd60e51b81526004016109a99061245c565b600a55565b6005546001600160a01b0316331461104b5760405162461bcd60e51b81526004016109a99061245c565b6012805460ff1916911515919091179055565b6060600480546108e6906125a3565b336000908152601a602052604090205460ff1661109c5760405162461bcd60e51b81526004016109a990612491565b610f0d8282611f04565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156111285760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016109a9565b6111353385858403611862565b5060019392505050565b6000610976338484611986565b600554600160a01b900460ff16156111765760405162461bcd60e51b81526004016109a990612432565b3360008181526015602090815260408083205460168352818420546017909352908320549093919290916111a990611b55565b905060006111b633611ce5565b3360009081526015602090815260408083208390556016825280832083905560178252808320839055601882528083204290819055601990925282205590915081836112028789612533565b61120c9190612533565b6112169190612533565b9050600a548161122560025490565b61122f9190612533565b1061127c5760405162461bcd60e51b815260206004820152601e60248201527f4e6f206c6f6e6765722061626c6520746f206d696e7420746f6b656e732e000060448201526064016109a9565b600061128960648361254b565b6013546012549192509060ff16156115735760075460405163f6697c8b60e01b815233600482015260009182916001600160a01b039091169063f6697c8b9060240160206040518083038186803b1580156112e357600080fd5b505afa1580156112f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131b9190612376565b111561132a575060115461143c565b600754604051630c8f4b0d60e41b81523360048201526000916001600160a01b03169063c8f4b0d09060240160206040518083038186803b15801561136e57600080fd5b505afa158015611382573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a69190612376565b11156113b5575060105461143c565b600754604051631c53a27b60e21b81523360048201526000916001600160a01b03169063714e89ec9060240160206040518083038186803b1580156113f957600080fd5b505afa15801561140d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114319190612376565b111561143c5750600f545b818110156114555761144e818361258c565b915061145a565b600091505b6007546040805163cac05ca960e01b815290516000926001600160a01b03169163cac05ca99160048083019286929190829003018186803b15801561149e57600080fd5b505afa1580156114b2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114da91908101906121d8565b90506000815184866114ec919061256d565b6114f6919061254b565b905060005b825181101561156a57816017600085848151811061151b5761151b6125f4565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546115529190612533565b909155506115639050600182612533565b90506114fb565b50505050611577565b5060005b60008661158583606461258c565b61158f908561256d565b6115999190612533565b90506115a53382611d6e565b505050505050505050565b6005546001600160a01b031633146115da5760405162461bcd60e51b81526004016109a99061245c565b601355565b336000908152601a602052604090205460ff1661160e5760405162461bcd60e51b81526004016109a990612491565b60005b8251811015610bc05761165683828151811061162f5761162f6125f4565b6020026020010151838381518110611649576116496125f4565b6020026020010151611f04565b611661600182612533565b9050611611565b6005546001600160a01b031633146116925760405162461bcd60e51b81526004016109a99061245c565b8061169e574260095550565b60098190555b50565b6005546001600160a01b031633146116d15760405162461bcd60e51b81526004016109a99061245c565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461171d5760405162461bcd60e51b81526004016109a99061245c565b60005b8251811015610bc05781818151811061173b5761173b6125f4565b602002602001015160186000858481518110611759576117596125f4565b6020908102919091018101516001600160a01b0316825281019190915260400160002055611788600182612533565b9050611720565b6005546001600160a01b031633146117b95760405162461bcd60e51b81526004016109a99061245c565b6001600160a01b03811661181e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109a9565b6116a481611e4d565b6005546001600160a01b031633146118515760405162461bcd60e51b81526004016109a99061245c565b8061185d574260085550565b600855565b6001600160a01b0383166118c45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109a9565b6001600160a01b0382166119255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109a9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166119ea5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109a9565b6001600160a01b038216611a4c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109a9565b6001600160a01b03831660009081526020819052604090205481811015611ac45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016109a9565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611afb908490612533565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b4791815260200190565b60405180910390a350505050565b600b546008546001600160a01b0383166000908152601860205260408120549092911115611b8557600854611b9f565b6001600160a01b0383166000908152601860205260409020545b611ba9904261258c565b600c5460065460405163ea2c736b60e01b81526001600160a01b0387811660048301529091169063ea2c736b906024015b60206040518083038186803b158015611bf257600080fd5b505afa158015611c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2a9190612376565b611c34919061256d565b611c3e919061256d565b610a98919061254b565b600554600160a01b900460ff16611c985760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016109a9565b6005805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600d546009546001600160a01b0383166000908152601960205260408120549092911115611d1557600954611d2f565b6001600160a01b0383166000908152601960205260409020545b611d39904261258c565b600e5460075460405163f1d770c560e01b81526001600160a01b0387811660048301529091169063f1d770c590602401611bda565b6001600160a01b038216611dc45760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016109a9565b8060026000828254611dd69190612533565b90915550506001600160a01b03821660009081526020819052604081208054839290611e03908490612533565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600554600160a01b900460ff1615611ec95760405162461bcd60e51b81526004016109a990612432565b6005805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611cc83390565b6001600160a01b038216611f645760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016109a9565b6001600160a01b03821660009081526020819052604090205481811015611fd85760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016109a9565b6001600160a01b038316600090815260208190526040812083830390556002805484929061200790849061258c565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600082601f83011261206357600080fd5b813560206120786120738361250f565b6124de565b80838252828201915082860187848660051b890101111561209857600080fd5b60005b858110156120b75781358452928401929084019060010161209b565b5090979650505050505050565b803580151581146120d457600080fd5b919050565b6000602082840312156120eb57600080fd5b81356120f681612620565b9392505050565b6000806040838503121561211057600080fd5b823561211b81612620565b9150602083013561212b81612620565b809150509250929050565b60008060006060848603121561214b57600080fd5b833561215681612620565b9250602084013561216681612620565b929592945050506040919091013590565b6000806040838503121561218a57600080fd5b823561219581612620565b91506121a3602084016120c4565b90509250929050565b600080604083850312156121bf57600080fd5b82356121ca81612620565b946020939093013593505050565b600060208083850312156121eb57600080fd5b825167ffffffffffffffff81111561220257600080fd5b8301601f8101851361221357600080fd5b80516122216120738261250f565b80828252848201915084840188868560051b870101111561224157600080fd5b600094505b8385101561226d57805161225981612620565b835260019490940193918501918501612246565b50979650505050505050565b6000806040838503121561228c57600080fd5b823567ffffffffffffffff808211156122a457600080fd5b818501915085601f8301126122b857600080fd5b813560206122c86120738361250f565b8083825282820191508286018a848660051b89010111156122e857600080fd5b600096505b8487101561231457803561230081612620565b8352600196909601959183019183016122ed565b509650508601359250508082111561232b57600080fd5b5061233885828601612052565b9150509250929050565b60006020828403121561235457600080fd5b6120f6826120c4565b60006020828403121561236f57600080fd5b5035919050565b60006020828403121561238857600080fd5b5051919050565b600080604083850312156123a257600080fd5b50508035926020909101359150565b6000806000606084860312156123c657600080fd5b505081359360208301359350604090920135919050565b600060208083528351808285015260005b8181101561240a578581018301518582016040015282016123ee565b8181111561241c576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602d908201527f596f7572206164647265737320646f6573206e6f742068617665207065726d6960408201526c39b9b4b7b7103a37903ab9b29760991b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156125075761250761260a565b604052919050565b600067ffffffffffffffff8211156125295761252961260a565b5060051b60200190565b60008219821115612546576125466125de565b500190565b60008261256857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612587576125876125de565b500290565b60008282101561259e5761259e6125de565b500390565b600181811c908216806125b757607f821691505b602082108114156125d857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146116a457600080fdfea264697066735822122018d571ab41370df9f6ae5ab8a0e88e53b193c6695e10a1454d724b840ec22a4864736f6c634300080700330000000000000000000000004cff01dbed00a5e95d705f96acf369f210c203c80000000000000000000000003d80dc30e716cf76c68c31c4c2ffd41da679459e

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103c55760003560e01c806370a08231116101ff578063aa1a29721161011a578063dd51d433116100ad578063f2fde38b1161007c578063f2fde38b1461087c578063f35e4a6e1461088f578063fd8558db146108a2578063fec8af24146108ab57600080fd5b8063dd51d433146107ed578063dd62ed3e14610800578063eae9526114610839578063ebabdd021461085957600080fd5b8063d216294f116100e9578063d216294f146107ab578063d3888857146107be578063da229c02146107c7578063dc988394146107da57600080fd5b8063aa1a297214610767578063b88a802f14610770578063bd13c11214610778578063cb03fb1e1461078b57600080fd5b8063947a36fb116101925780639fc02c98116101615780639fc02c9814610714578063a457c2d714610721578063a67876e814610734578063a9059cbb1461075457600080fd5b8063947a36fb146106e757806395d89b41146106f05780639dc29fac146106f85780639de491271461070b57600080fd5b806384584d70116101ce57806384584d701461069d5780638cb2c5d1146106b05780638da5cb5b146106c35780638e6eafef146106d457600080fd5b806370a0823114610651578063715018a61461067a5780637b678c2c146106825780638456cb591461069557600080fd5b806336cc8c0b116102ef5780635a5a72ac116102825780635feae415116102515780635feae4151461060557806366429dc11461061857806366a95e6b1461062b5780636a092e791461063e57600080fd5b80635a5a72ac146105a45780635a7e1989146105b75780635b2a6a72146105e05780635c975abb146105f357600080fd5b80634762e121116102be5780634762e1211461056c57806348cd4cb11461057f5780635035248314610588578063503db6981461059157600080fd5b806336cc8c0b1461051f57806339509351146105285780633dc8ea6b1461053b5780633f4ba83a1461056457600080fd5b80631aa16e70116103675780632c4e722e116103365780632c4e722e146104bc5780632ec61c81146104c5578063313ce567146104e55780633526bacb146104f457600080fd5b80631aa16e70146104585780631cae87e71461048157806323b872dd14610496578063267e8ab6146104a957600080fd5b8063095ea7b3116103a3578063095ea7b31461041b578063154c4bc91461043e57806318160ddd14610447578063190c26ef1461044f57600080fd5b80630480e58b146103ca57806306fdde03146103e65780630700037d146103fb575b600080fd5b6103d3600a5481565b6040519081526020015b60405180910390f35b6103ee6108d7565b6040516103dd91906123dd565b6103d36104093660046120d9565b60156020526000908152604090205481565b61042e6104293660046121ac565b610969565b60405190151581526020016103dd565b6103d3600f5481565b6002546103d3565b6103d360095481565b6103d36104663660046120d9565b6001600160a01b031660009081526019602052604090205490565b61049461048f3660046123b1565b61097f565b005b61042e6104a4366004612136565b6109c0565b6103d36104b73660046120d9565b610a6a565b6103d3600c5481565b6103d36104d33660046120d9565b60176020526000908152604090205481565b604051601281526020016103dd565b600754610507906001600160a01b031681565b6040516001600160a01b0390911681526020016103dd565b6103d3600e5481565b61042e6105363660046121ac565b610a9e565b6103d36105493660046120d9565b6001600160a01b031660009081526017602052604090205490565b610494610ada565b600654610507906001600160a01b031681565b6103d360085481565b6103d360135481565b6103d361059f3660046120d9565b610b0e565b6104946105b2366004612279565b610b3c565b6103d36105c53660046120d9565b6001600160a01b031660009081526018602052604090205490565b6104946105ee36600461238f565b610bc5565b600554600160a01b900460ff1661042e565b61049461061336600461238f565b610bfa565b610494610626366004612279565b610c2f565b610494610639366004612177565b610ccb565b61049461064c3660046120fd565b610d20565b6103d361065f3660046120d9565b6001600160a01b031660009081526020819052604090205490565b610494610f11565b6104946106903660046120d9565b610f45565b610494610f91565b6104946106ab36600461235d565b610fc3565b6104946106be36600461235d565b610ff2565b6005546001600160a01b0316610507565b6104946106e2366004612342565b611021565b6103d3600b5481565b6103ee61105e565b6104946107063660046121ac565b61106d565b6103d360115481565b60125461042e9060ff1681565b61042e61072f3660046121ac565b6110a6565b6103d36107423660046120d9565b60166020526000908152604090205481565b61042e6107623660046121ac565b61113f565b6103d360145481565b61049461114c565b61049461078636600461235d565b6115b0565b6103d36107993660046120d9565b60186020526000908152604090205481565b6104946107b9366004612279565b6115df565b6103d360105481565b6104946107d536600461235d565b611668565b6104946107e83660046120d9565b6116a7565b6104946107fb366004612279565b6116f3565b6103d361080e3660046120fd565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6103d36108473660046120d9565b60196020526000908152604090205481565b61042e6108673660046120d9565b601a6020526000908152604090205460ff1681565b61049461088a3660046120d9565b61178f565b61049461089d36600461235d565b611827565b6103d3600d5481565b61042e6108b93660046120d9565b6001600160a01b03166000908152601a602052604090205460ff1690565b6060600380546108e6906125a3565b80601f0160208091040260200160405190810160405280929190818152602001828054610912906125a3565b801561095f5780601f106109345761010080835404028352916020019161095f565b820191906000526020600020905b81548152906001019060200180831161094257829003601f168201915b5050505050905090565b6000610976338484611862565b50600192915050565b6005546001600160a01b031633146109b25760405162461bcd60e51b81526004016109a99061245c565b60405180910390fd5b600f92909255601055601155565b60006109cd848484611986565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610a525760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016109a9565b610a5f8533858403611862565b506001949350505050565b6000610a7582611b55565b6001600160a01b038316600090815260156020526040902054610a989190612533565b92915050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610976918590610ad5908690612533565b611862565b6005546001600160a01b03163314610b045760405162461bcd60e51b81526004016109a99061245c565b610b0c611c48565b565b6000610b1982611ce5565b6001600160a01b038316600090815260166020526040902054610a989190612533565b6005546001600160a01b03163314610b665760405162461bcd60e51b81526004016109a99061245c565b60005b8251811015610bc057610bae838281518110610b8757610b876125f4565b6020026020010151838381518110610ba157610ba16125f4565b6020026020010151611d6e565b610bb9600182612533565b9050610b69565b505050565b6005546001600160a01b03163314610bef5760405162461bcd60e51b81526004016109a99061245c565b600d91909155600e55565b6005546001600160a01b03163314610c245760405162461bcd60e51b81526004016109a99061245c565b600b91909155600c55565b6005546001600160a01b03163314610c595760405162461bcd60e51b81526004016109a99061245c565b60005b8251811015610bc057818181518110610c7757610c776125f4565b602002602001015160196000858481518110610c9557610c956125f4565b6020908102919091018101516001600160a01b0316825281019190915260400160002055610cc4600182612533565b9050610c5c565b6005546001600160a01b03163314610cf55760405162461bcd60e51b81526004016109a99061245c565b6001600160a01b03919091166000908152601a60205260409020805460ff1916911515919091179055565b336000908152601a602052604090205460ff16610d4f5760405162461bcd60e51b81526004016109a990612491565b600554600160a01b900460ff1615610d795760405162461bcd60e51b81526004016109a990612432565b6001600160a01b03821615610e675760646014546064610d99919061258c565b610da284611b55565b610dac919061256d565b610db6919061254b565b6001600160a01b03831660009081526015602052604081208054909190610dde908490612533565b9091555050601454606490610df3908261258c565b610dfc84611ce5565b610e06919061256d565b610e10919061254b565b6001600160a01b03831660009081526016602052604081208054909190610e38908490612533565b90915550506001600160a01b038216600090815260186020908152604080832042908190556019909252909120555b6001600160a01b03811615610f0d57610e7f81611b55565b6001600160a01b03821660009081526015602052604081208054909190610ea7908490612533565b90915550610eb6905081611ce5565b6001600160a01b03821660009081526016602052604081208054909190610ede908490612533565b90915550506001600160a01b038116600090815260186020908152604080832042908190556019909252909120555b5050565b6005546001600160a01b03163314610f3b5760405162461bcd60e51b81526004016109a99061245c565b610b0c6000611e4d565b6005546001600160a01b03163314610f6f5760405162461bcd60e51b81526004016109a99061245c565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610fbb5760405162461bcd60e51b81526004016109a99061245c565b610b0c611e9f565b6005546001600160a01b03163314610fed5760405162461bcd60e51b81526004016109a99061245c565b601455565b6005546001600160a01b0316331461101c5760405162461bcd60e51b81526004016109a99061245c565b600a55565b6005546001600160a01b0316331461104b5760405162461bcd60e51b81526004016109a99061245c565b6012805460ff1916911515919091179055565b6060600480546108e6906125a3565b336000908152601a602052604090205460ff1661109c5760405162461bcd60e51b81526004016109a990612491565b610f0d8282611f04565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156111285760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016109a9565b6111353385858403611862565b5060019392505050565b6000610976338484611986565b600554600160a01b900460ff16156111765760405162461bcd60e51b81526004016109a990612432565b3360008181526015602090815260408083205460168352818420546017909352908320549093919290916111a990611b55565b905060006111b633611ce5565b3360009081526015602090815260408083208390556016825280832083905560178252808320839055601882528083204290819055601990925282205590915081836112028789612533565b61120c9190612533565b6112169190612533565b9050600a548161122560025490565b61122f9190612533565b1061127c5760405162461bcd60e51b815260206004820152601e60248201527f4e6f206c6f6e6765722061626c6520746f206d696e7420746f6b656e732e000060448201526064016109a9565b600061128960648361254b565b6013546012549192509060ff16156115735760075460405163f6697c8b60e01b815233600482015260009182916001600160a01b039091169063f6697c8b9060240160206040518083038186803b1580156112e357600080fd5b505afa1580156112f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131b9190612376565b111561132a575060115461143c565b600754604051630c8f4b0d60e41b81523360048201526000916001600160a01b03169063c8f4b0d09060240160206040518083038186803b15801561136e57600080fd5b505afa158015611382573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a69190612376565b11156113b5575060105461143c565b600754604051631c53a27b60e21b81523360048201526000916001600160a01b03169063714e89ec9060240160206040518083038186803b1580156113f957600080fd5b505afa15801561140d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114319190612376565b111561143c5750600f545b818110156114555761144e818361258c565b915061145a565b600091505b6007546040805163cac05ca960e01b815290516000926001600160a01b03169163cac05ca99160048083019286929190829003018186803b15801561149e57600080fd5b505afa1580156114b2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114da91908101906121d8565b90506000815184866114ec919061256d565b6114f6919061254b565b905060005b825181101561156a57816017600085848151811061151b5761151b6125f4565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008282546115529190612533565b909155506115639050600182612533565b90506114fb565b50505050611577565b5060005b60008661158583606461258c565b61158f908561256d565b6115999190612533565b90506115a53382611d6e565b505050505050505050565b6005546001600160a01b031633146115da5760405162461bcd60e51b81526004016109a99061245c565b601355565b336000908152601a602052604090205460ff1661160e5760405162461bcd60e51b81526004016109a990612491565b60005b8251811015610bc05761165683828151811061162f5761162f6125f4565b6020026020010151838381518110611649576116496125f4565b6020026020010151611f04565b611661600182612533565b9050611611565b6005546001600160a01b031633146116925760405162461bcd60e51b81526004016109a99061245c565b8061169e574260095550565b60098190555b50565b6005546001600160a01b031633146116d15760405162461bcd60e51b81526004016109a99061245c565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461171d5760405162461bcd60e51b81526004016109a99061245c565b60005b8251811015610bc05781818151811061173b5761173b6125f4565b602002602001015160186000858481518110611759576117596125f4565b6020908102919091018101516001600160a01b0316825281019190915260400160002055611788600182612533565b9050611720565b6005546001600160a01b031633146117b95760405162461bcd60e51b81526004016109a99061245c565b6001600160a01b03811661181e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109a9565b6116a481611e4d565b6005546001600160a01b031633146118515760405162461bcd60e51b81526004016109a99061245c565b8061185d574260085550565b600855565b6001600160a01b0383166118c45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109a9565b6001600160a01b0382166119255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109a9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166119ea5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109a9565b6001600160a01b038216611a4c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109a9565b6001600160a01b03831660009081526020819052604090205481811015611ac45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016109a9565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611afb908490612533565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b4791815260200190565b60405180910390a350505050565b600b546008546001600160a01b0383166000908152601860205260408120549092911115611b8557600854611b9f565b6001600160a01b0383166000908152601860205260409020545b611ba9904261258c565b600c5460065460405163ea2c736b60e01b81526001600160a01b0387811660048301529091169063ea2c736b906024015b60206040518083038186803b158015611bf257600080fd5b505afa158015611c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2a9190612376565b611c34919061256d565b611c3e919061256d565b610a98919061254b565b600554600160a01b900460ff16611c985760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016109a9565b6005805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600d546009546001600160a01b0383166000908152601960205260408120549092911115611d1557600954611d2f565b6001600160a01b0383166000908152601960205260409020545b611d39904261258c565b600e5460075460405163f1d770c560e01b81526001600160a01b0387811660048301529091169063f1d770c590602401611bda565b6001600160a01b038216611dc45760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016109a9565b8060026000828254611dd69190612533565b90915550506001600160a01b03821660009081526020819052604081208054839290611e03908490612533565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600554600160a01b900460ff1615611ec95760405162461bcd60e51b81526004016109a990612432565b6005805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611cc83390565b6001600160a01b038216611f645760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016109a9565b6001600160a01b03821660009081526020819052604090205481811015611fd85760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016109a9565b6001600160a01b038316600090815260208190526040812083830390556002805484929061200790849061258c565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600082601f83011261206357600080fd5b813560206120786120738361250f565b6124de565b80838252828201915082860187848660051b890101111561209857600080fd5b60005b858110156120b75781358452928401929084019060010161209b565b5090979650505050505050565b803580151581146120d457600080fd5b919050565b6000602082840312156120eb57600080fd5b81356120f681612620565b9392505050565b6000806040838503121561211057600080fd5b823561211b81612620565b9150602083013561212b81612620565b809150509250929050565b60008060006060848603121561214b57600080fd5b833561215681612620565b9250602084013561216681612620565b929592945050506040919091013590565b6000806040838503121561218a57600080fd5b823561219581612620565b91506121a3602084016120c4565b90509250929050565b600080604083850312156121bf57600080fd5b82356121ca81612620565b946020939093013593505050565b600060208083850312156121eb57600080fd5b825167ffffffffffffffff81111561220257600080fd5b8301601f8101851361221357600080fd5b80516122216120738261250f565b80828252848201915084840188868560051b870101111561224157600080fd5b600094505b8385101561226d57805161225981612620565b835260019490940193918501918501612246565b50979650505050505050565b6000806040838503121561228c57600080fd5b823567ffffffffffffffff808211156122a457600080fd5b818501915085601f8301126122b857600080fd5b813560206122c86120738361250f565b8083825282820191508286018a848660051b89010111156122e857600080fd5b600096505b8487101561231457803561230081612620565b8352600196909601959183019183016122ed565b509650508601359250508082111561232b57600080fd5b5061233885828601612052565b9150509250929050565b60006020828403121561235457600080fd5b6120f6826120c4565b60006020828403121561236f57600080fd5b5035919050565b60006020828403121561238857600080fd5b5051919050565b600080604083850312156123a257600080fd5b50508035926020909101359150565b6000806000606084860312156123c657600080fd5b505081359360208301359350604090920135919050565b600060208083528351808285015260005b8181101561240a578581018301518582016040015282016123ee565b8181111561241c576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602d908201527f596f7572206164647265737320646f6573206e6f742068617665207065726d6960408201526c39b9b4b7b7103a37903ab9b29760991b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156125075761250761260a565b604052919050565b600067ffffffffffffffff8211156125295761252961260a565b5060051b60200190565b60008219821115612546576125466125de565b500190565b60008261256857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612587576125876125de565b500290565b60008282101561259e5761259e6125de565b500390565b600181811c908216806125b757607f821691505b602082108114156125d857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146116a457600080fdfea264697066735822122018d571ab41370df9f6ae5ab8a0e88e53b193c6695e10a1454d724b840ec22a4864736f6c63430008070033

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

0000000000000000000000004cff01dbed00a5e95d705f96acf369f210c203c80000000000000000000000003d80dc30e716cf76c68c31c4c2ffd41da679459e

-----Decoded View---------------
Arg [0] : noundlesAddress (address): 0x4cFF01DBed00A5E95D705F96ACF369F210C203c8
Arg [1] : evilNoundlesAddress (address): 0x3D80dC30e716cf76C68c31c4c2fFd41dA679459E

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000004cff01dbed00a5e95d705f96acf369f210c203c8
Arg [1] : 0000000000000000000000003d80dc30e716cf76c68c31c4c2ffd41da679459e


Deployed Bytecode Sourcemap

22074:11682:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22367:49;;;;;;;;;13797:25:1;;;13785:2;13770:18;22367:49:0;;;;;;;;11503:100;;;:::i;:::-;;;;;;;:::i;23080:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;13670:169;;;;;;:::i;:::-;;:::i;:::-;;;6312:14:1;;6305:22;6287:41;;6275:2;6260:18;13670:169:0;6147:187:1;22708:41:0;;;;;;12623:108;12711:12;;12623:108;;22279:34;;;;;;28288:128;;;;;;:::i;:::-;-1:-1:-1;;;;;28383:25:0;28356:7;28383:25;;;:19;:25;;;;;;;28288:128;25711:221;;;;;;:::i;:::-;;:::i;:::-;;14321:492;;;;;;:::i;:::-;;:::i;27625:138::-;;;;;;:::i;:::-;;:::i;22537:42::-;;;;;;23187:46;;;;;;:::i;:::-;;;;;;;;;;;;;;12465:93;;;12548:2;13975:36:1;;13963:2;13948:18;12465:93:0;13833:184:1;22169:41:0;;;;;-1:-1:-1;;;;;22169:41:0;;;;;;-1:-1:-1;;;;;6103:32:1;;;6085:51;;6073:2;6058:18;22169:41:0;5939:203:1;22633:42:0;;;;;;15222:215;;;;;;:::i;:::-;;:::i;27975:121::-;;;;;;:::i;:::-;-1:-1:-1;;;;;28071:17:0;28044:7;28071:17;;;:11;:17;;;;;;;27975:121;24579:51;;;:::i;22129:33::-;;;;;-1:-1:-1;;;;;22129:33:0;;;22247:25;;;;;;22924:37;;;;;;27804:163;;;;;;:::i;:::-;;:::i;27344:204::-;;;;;;:::i;:::-;;:::i;28137:110::-;;;;;;:::i;:::-;-1:-1:-1;;;;;28223:16:0;28196:7;28223:16;;;:10;:16;;;;;;;28137:110;25969:168;;;;;;:::i;:::-;;:::i;2025:86::-;2096:7;;-1:-1:-1;;;2096:7:0;;;;2025:86;;25287:141;;;;;;:::i;:::-;;:::i;28742:241::-;;;;;;:::i;:::-;;:::i;26573:128::-;;;;;;:::i;:::-;;:::i;29230:791::-;;;;;;:::i;:::-;;:::i;12794:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;12895:18:0;12868:7;12895:18;;;;;;;;;;;;12794:127;4924:103;;;:::i;26381:142::-;;;;;;:::i;:::-;;:::i;24504:47::-;;;:::i;25586:79::-;;;;;;:::i;:::-;;:::i;29018:96::-;;;;;;:::i;:::-;;:::i;4273:87::-;4346:6;;-1:-1:-1;;;;;4346:6:0;4273:87;;25156:94;;;;;;:::i;:::-;;:::i;22490:40::-;;;;;;11722:104;;;:::i;27188:110::-;;;;;;:::i;:::-;;:::i;22804:42::-;;;;;;22877:40;;;;;;;;;15940:413;;;;;;:::i;:::-;;:::i;23129:51::-;;;;;;:::i;:::-;;;;;;;;;;;;;;13134:175;;;;;;:::i;:::-;;:::i;22995:37::-;;;;;;30057:2989;;;:::i;25464:86::-;;;;;;:::i;:::-;;:::i;23284:45::-;;;;;;:::i;:::-;;;;;;;;;;;;;;26920:216;;;;;;:::i;:::-;;:::i;22756:41::-;;;;;;24902:212;;;;;;:::i;:::-;;:::i;26187:130::-;;;;;;:::i;:::-;;:::i;28468:223::-;;;;;;:::i;:::-;;:::i;13372:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;13488:18:0;;;13461:7;13488:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;13372:151;23336:54;;;;;;:::i;:::-;;;;;;;;;;;;;;23423:46;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5182:201;;;;;;:::i;:::-;;:::i;24667:185::-;;;;;;:::i;:::-;;:::i;22586:40::-;;;;;;26754:114;;;;;;:::i;:::-;-1:-1:-1;;;;;26840:20:0;26816:4;26840:20;;;:14;:20;;;;;;;;;26754:114;11503:100;11557:13;11590:5;11583:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11503:100;:::o;13670:169::-;13753:4;13770:39;759:10;13793:7;13802:6;13770:8;:39::i;:::-;-1:-1:-1;13827:4:0;13670:169;;;;:::o;25711:221::-;4346:6;;-1:-1:-1;;;;;4346:6:0;759:10;4493:23;4485:68;;;;-1:-1:-1;;;4485:68:0;;;;;;;:::i;:::-;;;;;;;;;25814:21:::1;:29:::0;;;;25854:21:::1;:29:::0;25894:22:::1;:30:::0;25711:221::o;14321:492::-;14461:4;14478:36;14488:6;14496:9;14507:6;14478:9;:36::i;:::-;-1:-1:-1;;;;;14554:19:0;;14527:24;14554:19;;;:11;:19;;;;;;;;759:10;14554:33;;;;;;;;14606:26;;;;14598:79;;;;-1:-1:-1;;;14598:79:0;;10331:2:1;14598:79:0;;;10313:21:1;10370:2;10350:18;;;10343:30;10409:34;10389:18;;;10382:62;-1:-1:-1;;;10460:18:1;;;10453:38;10508:19;;14598:79:0;10129:404:1;14598:79:0;14713:57;14722:6;759:10;14763:6;14744:16;:25;14713:8;:57::i;:::-;-1:-1:-1;14801:4:0;;14321:492;-1:-1:-1;;;;14321:492:0:o;27625:138::-;27688:7;27731:24;27750:4;27731:18;:24::i;:::-;-1:-1:-1;;;;;27715:13:0;;;;;;:7;:13;;;;;;:40;;;;:::i;:::-;27708:47;27625:138;-1:-1:-1;;27625:138:0:o;15222:215::-;759:10;15310:4;15359:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;15359:34:0;;;;;;;;;;15310:4;;15327:80;;15350:7;;15359:47;;15396:10;;15359:47;:::i;:::-;15327:8;:80::i;24579:51::-;4346:6;;-1:-1:-1;;;;;4346:6:0;759:10;4493:23;4485:68;;;;-1:-1:-1;;;4485:68:0;;;;;;;:::i;:::-;24617:10:::1;:8;:10::i;:::-;24579:51::o:0;27804:163::-;27876:7;27928:31;27954:4;27928:25;:31::i;:::-;-1:-1:-1;;;;;27903:22:0;;;;;;:16;:22;;;;;;:56;;;;:::i;27344:204::-;4346:6;;-1:-1:-1;;;;;4346:6:0;759:10;4493:23;4485:68;;;;-1:-1:-1;;;4485:68:0;;;;;;;:::i;:::-;27448:9:::1;27444:97;27467:5;:12;27463:1;:16;27444:97;;;27503:26;27509:5;27515:1;27509:8;;;;;;;;:::i;:::-;;;;;;;27519:6;27526:1;27519:9;;;;;;;;:::i;:::-;;;;;;;27503:5;:26::i;:::-;27481:6;27486:1;27481:6:::0;::::1;:::i;:::-;;;27444:97;;;;27344:204:::0;;:::o;25969:168::-;4346:6;;-1:-1:-1;;;;;4346:6:0;759:10;4493:23;4485:68;;;;-1:-1:-1;;;4485:68:0;;;;;;;:::i;:::-;26068:17:::1;:29:::0;;;;26108:13:::1;:21:::0;25969:168::o;25287:141::-;4346:6;;-1:-1:-1;;;;;4346:6:0;759:10;4493:23;4485:68;;;;-1:-1:-1;;;4485:68:0;;;;;;;:::i;:::-;25377:8:::1;:20:::0;;;;25408:4:::1;:12:::0;25287:141::o;28742:241::-;4346:6;;-1:-1:-1;;;;;4346:6:0;759:10;4493:23;4485:68;;;;-1:-1:-1;;;4485:68:0;;;;;;;:::i;:::-;28860:9:::1;28856:120;28879:9;:16;28875:1;:20;28856:120;;;28955:6;28962:1;28955:9;;;;;;;;:::i;:::-;;;;;;;28919:19;:33;28939:9;28949:1;28939:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;28919:33:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;28919:33:0;:45;28897:6:::1;28902:1;28897:6:::0;::::1;:::i;:::-;;;28856:120;;26573:128:::0;4346:6;;-1:-1:-1;;;;;4346:6:0;759:10;4493:23;4485:68;;;;-1:-1:-1;;;4485:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26659:25:0;;;::::1;;::::0;;;:14:::1;:25;::::0;;;;:34;;-1:-1:-1;;26659:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;26573:128::o;29230:791::-;23855:10;23840:26;;;;:14;:26;;;;;;;;23832:84;;;;-1:-1:-1;;;23832:84:0;;;;;;;:::i;:::-;2096:7;;-1:-1:-1;;;2096:7:0;;;;2350:9:::1;2342:38;;;;-1:-1:-1::0;;;2342:38:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29367:19:0;::::2;::::0;29364:354:::2;;29481:3;29467:9;;29461:3;:15;;;;:::i;:::-;29432:25;29451:5;29432:18;:25::i;:::-;:45;;;;:::i;:::-;29431:53;;;;:::i;:::-;-1:-1:-1::0;;;;;29402:14:0;::::2;;::::0;;;:7:::2;:14;::::0;;;;:82;;:14;;;:82:::2;::::0;;;::::2;:::i;:::-;::::0;;;-1:-1:-1;;29571:9:0::2;::::0;29585:3:::2;::::0;29565:15:::2;::::0;29585:3;29565:15:::2;:::i;:::-;29529:32;29555:5;29529:25;:32::i;:::-;:52;;;;:::i;:::-;29528:60;;;;:::i;:::-;-1:-1:-1::0;;;;;29499:23:0;::::2;;::::0;;;:16:::2;:23;::::0;;;;:89;;:23;;;:89:::2;::::0;;;::::2;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;29603:17:0;::::2;;::::0;;;:10:::2;:17;::::0;;;;;;;29632:15:::2;29603:44:::0;;;;29662:19:::2;:26:::0;;;;;;:44;29364:354:::2;-1:-1:-1::0;;;;;29733:17:0;::::2;::::0;29730:284:::2;;29793:23;29812:3;29793:18;:23::i;:::-;-1:-1:-1::0;;;;;29766:12:0;::::2;;::::0;;;:7:::2;:12;::::0;;;;:50;;:12;;;:50:::2;::::0;;;::::2;:::i;:::-;::::0;;;-1:-1:-1;29858:30:0::2;::::0;-1:-1:-1;29884:3:0;29858:25:::2;:30::i;:::-;-1:-1:-1::0;;;;;29831:21:0;::::2;;::::0;;;:16:::2;:21;::::0;;;;:57;;:21;;;:57:::2;::::0;;;::::2;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;29903:15:0;::::2;;::::0;;;:10:::2;:15;::::0;;;;;;;29930::::2;29903:42:::0;;;;29960:19:::2;:24:::0;;;;;;:42;29730:284:::2;29230:791:::0;;:::o;4924:103::-;4346:6;;-1:-1:-1;;;;;4346:6:0;759:10;4493:23;4485:68;;;;-1:-1:-1;;;4485:68:0;;;;;;;:::i;:::-;4989:30:::1;5016:1;4989:18;:30::i;26381:142::-:0;4346:6;;-1:-1:-1;;;;;4346:6:0;759:10;4493:23;4485:68;;;;-1:-1:-1;;;4485:68:0;;;;;;;:::i;:::-;26468:12:::1;:47:::0;;-1:-1:-1;;;;;;26468:47:0::1;-1:-1:-1::0;;;;;26468:47:0;;;::::1;::::0;;;::::1;::::0;;26381:142::o;24504:47::-;4346:6;;-1:-1:-1;;;;;4346:6:0;759:10;4493:23;4485:68;;;;-1:-1:-1;;;4485:68:0;;;;;;;:::i;:::-;24540:8:::1;:6;:8::i;25586:79::-:0;4346:6;;-1:-1:-1;;;;;4346:6:0;759:10;4493:23;4485:68;;;;-1:-1:-1;;;4485:68:0;;;;;;;:::i;:::-;25646:9:::1;:16:::0;25586:79::o;29018:96::-;4346:6;;-1:-1:-1;;;;;4346:6:0;759:10;4493:23;4485:68;;;;-1:-1:-1;;;4485:68:0;;;;;;;:::i;:::-;29086:13:::1;:20:::0;29018:96::o;25156:94::-;4346:6;;-1:-1:-1;;;;;4346:6:0;759:10;4493:23;4485:68;;;;-1:-1:-1;;;4485:68:0;;;;;;;:::i;:::-;25221:15:::1;:21:::0;;-1:-1:-1;;25221:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;25156:94::o;11722:104::-;11778:13;11811:7;11804:14;;;;;:::i;27188:110::-;23855:10;23840:26;;;;:14;:26;;;;;;;;23832:84;;;;-1:-1:-1;;;23832:84:0;;;;;;;:::i;:::-;27271:19:::1;27277:4;27283:6;27271:5;:19::i;15940:413::-:0;759:10;16033:4;16077:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;16077:34:0;;;;;;;;;;16130:35;;;;16122:85;;;;-1:-1:-1;;;16122:85:0;;13087:2:1;16122:85:0;;;13069:21:1;13126:2;13106:18;;;13099:30;13165:34;13145:18;;;13138:62;-1:-1:-1;;;13216:18:1;;;13209:35;13261:19;;16122:85:0;12885:401:1;16122:85:0;16243:67;759:10;16266:7;16294:15;16275:16;:34;16243:8;:67::i;:::-;-1:-1:-1;16341:4:0;;15940:413;-1:-1:-1;;;15940:413:0:o;13134:175::-;13220:4;13237:42;759:10;13261:9;13272:6;13237:9;:42::i;30057:2989::-;2096:7;;-1:-1:-1;;;2096:7:0;;;;2350:9;2342:38;;;;-1:-1:-1;;;2342:38:0;;;;;;;:::i;:::-;30193:10:::1;30162:18;30185:19:::0;;;:7:::1;:19;::::0;;;;;;;;30238:16:::1;:28:::0;;;;;;30300:11:::1;:23:::0;;;;;;;30185:19;;30238:28;;30300:23;;30399:30:::1;::::0;:18:::1;:30::i;:::-;30365:64;;30440:31;30474:37;30500:10;30474:25;:37::i;:::-;30563:10;30586:1;30555:19:::0;;;:7:::1;:19;::::0;;;;;;;:32;;;30598:16:::1;:28:::0;;;;;:32;;;30641:11:::1;:23:::0;;;;;:32;;;30715:10:::1;:22:::0;;;;;30749:15:::1;30715:49:::0;;;;30775:19:::1;:31:::0;;;;;:49;30440:71;;-1:-1:-1;30440:71:0;30930:16;30902:25:::1;30915:12:::0;30902:10;:25:::1;:::i;:::-;:44;;;;:::i;:::-;:70;;;;:::i;:::-;30868:104;;31074:13;;31048:23;31032:13;12711:12:::0;;;12623:108;31032:13:::1;:39;;;;:::i;:::-;:55;31024:98;;;::::0;-1:-1:-1;;;31024:98:0;;11101:2:1;31024:98:0::1;::::0;::::1;11083:21:1::0;11140:2;11120:18;;;11113:30;11179:32;11159:18;;;11152:60;11229:18;;31024:98:0::1;10899:354:1::0;31024:98:0::1;31178:15;31196:29;31222:3;31196:23:::0;:29:::1;:::i;:::-;31319:15;::::0;31386::::1;::::0;31178:47;;-1:-1:-1;31319:15:0;31386::::1;;31383:1396;;;31520:12;::::0;:40:::1;::::0;-1:-1:-1;;;31520:40:0;;31549:10:::1;31520:40;::::0;::::1;6085:51:1::0;31419:22:0::1;::::0;;;-1:-1:-1;;;;;31520:12:0;;::::1;::::0;:28:::1;::::0;6058:18:1;;31520:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;31517:372;;;-1:-1:-1::0;31601:22:0::1;::::0;31517:372:::1;;;31647:12;::::0;:39:::1;::::0;-1:-1:-1;;;31647:39:0;;31675:10:::1;31647:39;::::0;::::1;6085:51:1::0;31689:1:0::1;::::0;-1:-1:-1;;;;;31647:12:0::1;::::0;:27:::1;::::0;6058:18:1;;31647:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;31644:245;;;-1:-1:-1::0;31727:21:0::1;::::0;31644:245:::1;;;31772:12;::::0;:39:::1;::::0;-1:-1:-1;;;31772:39:0;;31800:10:::1;31772:39;::::0;::::1;6085:51:1::0;31814:1:0::1;::::0;-1:-1:-1;;;;;31772:12:0::1;::::0;:27:::1;::::0;6058:18:1;;31772:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;31769:120;;;-1:-1:-1::0;31852:21:0::1;::::0;31769:120:::1;31925:25;31908:14;:42;31905:192;;;31970:43;31999:14:::0;31970:43;::::1;:::i;:::-;;;31905:192;;;32080:1;32052:29;;31905:192;32182:12;::::0;:35:::1;::::0;;-1:-1:-1;;;32182:35:0;;;;32146:33:::1;::::0;-1:-1:-1;;;;;32182:12:0::1;::::0;:33:::1;::::0;:35:::1;::::0;;::::1;::::0;32146:33;;32182:35;;;;;;;:12;:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;32182:35:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;32146:71;;32308:28;32379:16;:23;32350:25;32340:7;:35;;;;:::i;:::-;32339:63;;;;:::i;:::-;32308:94;;32494:14;32490:162;32519:16;:23;32510:6;:32;32490:162;;;32616:20;32575:11;:37;32587:16;32604:6;32587:24;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;32575:37:0::1;-1:-1:-1::0;;;;;32575:37:0::1;;;;;;;;;;;;;:61;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;32544:11:0::1;::::0;-1:-1:-1;32554:1:0::1;32544:11:::0;::::1;:::i;:::-;;;32490:162;;;;31402:1261;;;31383:1396;;;-1:-1:-1::0;32766:1:0::1;31383:1396;32871:20;32942:12:::0;32906:31:::1;32912:25:::0;32906:3:::1;:31;:::i;:::-;32895:43;::::0;:7;:43:::1;:::i;:::-;32894:60;;;;:::i;:::-;32871:83;;33007:31;33013:10;33025:12;33007:5;:31::i;:::-;30103:2943;;;;;;;;;30057:2989::o:0;25464:86::-;4346:6;;-1:-1:-1;;;;;4346:6:0;759:10;4493:23;4485:68;;;;-1:-1:-1;;;4485:68:0;;;;;;;:::i;:::-;25525:15:::1;:22:::0;25464:86::o;26920:216::-;23855:10;23840:26;;;;:14;:26;;;;;;;;23832:84;;;;-1:-1:-1;;;23832:84:0;;;;;;;:::i;:::-;27036:9:::1;27032:97;27055:5;:12;27051:1;:16;27032:97;;;27091:26;27097:5;27103:1;27097:8;;;;;;;;:::i;:::-;;;;;;;27107:6;27114:1;27107:9;;;;;;;;:::i;:::-;;;;;;;27091:5;:26::i;:::-;27069:6;27074:1;27069:6:::0;::::1;:::i;:::-;;;27032:97;;24902:212:::0;4346:6;;-1:-1:-1;;;;;4346:6:0;759:10;4493:23;4485:68;;;;-1:-1:-1;;;4485:68:0;;;;;;;:::i;:::-;24978:8;24975:132:::1;;25024:15;25002:19;:37:::0;24902:212;:::o;24975:132::-:1;25070:19;:25:::0;;;24975:132:::1;24902:212:::0;:::o;26187:130::-;4346:6;;-1:-1:-1;;;;;4346:6:0;759:10;4493:23;4485:68;;;;-1:-1:-1;;;4485:68:0;;;;;;;:::i;:::-;26270:8:::1;:39:::0;;-1:-1:-1;;;;;;26270:39:0::1;-1:-1:-1::0;;;;;26270:39:0;;;::::1;::::0;;;::::1;::::0;;26187:130::o;28468:223::-;4346:6;;-1:-1:-1;;;;;4346:6:0;759:10;4493:23;4485:68;;;;-1:-1:-1;;;4485:68:0;;;;;;;:::i;:::-;28577:9:::1;28573:111;28596:9;:16;28592:1;:20;28573:111;;;28663:6;28670:1;28663:9;;;;;;;;:::i;:::-;;;;;;;28636:10;:24;28647:9;28657:1;28647:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;28636:24:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;28636:24:0;:36;28614:6:::1;28619:1;28614:6:::0;::::1;:::i;:::-;;;28573:111;;5182:201:::0;4346:6;;-1:-1:-1;;;;;4346:6:0;759:10;4493:23;4485:68;;;;-1:-1:-1;;;4485:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5271:22:0;::::1;5263:73;;;::::0;-1:-1:-1;;;5263:73:0;;8769:2:1;5263:73:0::1;::::0;::::1;8751:21:1::0;8808:2;8788:18;;;8781:30;8847:34;8827:18;;;8820:62;-1:-1:-1;;;8898:18:1;;;8891:36;8944:19;;5263:73:0::1;8567:402:1::0;5263:73:0::1;5347:28;5366:8;5347:18;:28::i;24667:185::-:0;4346:6;;-1:-1:-1;;;;;4346:6:0;759:10;4493:23;4485:68;;;;-1:-1:-1;;;4485:68:0;;;;;;;:::i;:::-;24734:8;24731:114:::1;;24771:15;24758:10;:28:::0;24902:212;:::o;24731:114::-:1;24817:10;:16:::0;24667:185::o;19624:380::-;-1:-1:-1;;;;;19760:19:0;;19752:68;;;;-1:-1:-1;;;19752:68:0;;12682:2:1;19752:68:0;;;12664:21:1;12721:2;12701:18;;;12694:30;12760:34;12740:18;;;12733:62;-1:-1:-1;;;12811:18:1;;;12804:34;12855:19;;19752:68:0;12480:400:1;19752:68:0;-1:-1:-1;;;;;19839:21:0;;19831:68;;;;-1:-1:-1;;;19831:68:0;;9176:2:1;19831:68:0;;;9158:21:1;9215:2;9195:18;;;9188:30;9254:34;9234:18;;;9227:62;-1:-1:-1;;;9305:18:1;;;9298:32;9347:19;;19831:68:0;8974:398:1;19831:68:0;-1:-1:-1;;;;;19912:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;19964:32;;13797:25:1;;;19964:32:0;;13770:18:1;19964:32:0;;;;;;;19624:380;;;:::o;16843:733::-;-1:-1:-1;;;;;16983:20:0;;16975:70;;;;-1:-1:-1;;;16975:70:0;;11862:2:1;16975:70:0;;;11844:21:1;11901:2;11881:18;;;11874:30;11940:34;11920:18;;;11913:62;-1:-1:-1;;;11991:18:1;;;11984:35;12036:19;;16975:70:0;11660:401:1;16975:70:0;-1:-1:-1;;;;;17064:23:0;;17056:71;;;;-1:-1:-1;;;17056:71:0;;7613:2:1;17056:71:0;;;7595:21:1;7652:2;7632:18;;;7625:30;7691:34;7671:18;;;7664:62;-1:-1:-1;;;7742:18:1;;;7735:33;7785:19;;17056:71:0;7411:399:1;17056:71:0;-1:-1:-1;;;;;17224:17:0;;17200:21;17224:17;;;;;;;;;;;17260:23;;;;17252:74;;;;-1:-1:-1;;;17252:74:0;;9579:2:1;17252:74:0;;;9561:21:1;9618:2;9598:18;;;9591:30;9657:34;9637:18;;;9630:62;-1:-1:-1;;;9708:18:1;;;9701:36;9754:19;;17252:74:0;9377:402:1;17252:74:0;-1:-1:-1;;;;;17362:17:0;;;:9;:17;;;;;;;;;;;17382:22;;;17362:42;;17426:20;;;;;;;;:30;;17398:6;;17362:9;17426:30;;17398:6;;17426:30;:::i;:::-;;;;;;;;17491:9;-1:-1:-1;;;;;17474:35:0;17483:6;-1:-1:-1;;;;;17474:35:0;;17502:6;17474:35;;;;13797:25:1;;13785:2;13770:18;;13651:177;17474:35:0;;;;;;;;16964:612;16843:733;;;:::o;33085:281::-;33350:8;;33287:10;;-1:-1:-1;;;;;33267:16:0;;33149:7;33267:16;;;:10;:16;;;;;;33149:7;;33350:8;-1:-1:-1;33267:30:0;:62;;33319:10;;33267:62;;;-1:-1:-1;;;;;33300:16:0;;;;;;:10;:16;;;;;;33267:62;33248:82;;:15;:82;:::i;:::-;33224:4;;33176:8;;:29;;-1:-1:-1;;;33176:29:0;;-1:-1:-1;;;;;6103:32:1;;;33176:29:0;;;6085:51:1;33176:8:0;;;;:23;;6058:18:1;;33176:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;;;:::i;:::-;:155;;;;:::i;:::-;:182;;;;:::i;3084:120::-;2096:7;;-1:-1:-1;;;2096:7:0;;;;2620:41;;;;-1:-1:-1;;;2620:41:0;;8017:2:1;2620:41:0;;;7999:21:1;8056:2;8036:18;;;8029:30;-1:-1:-1;;;8075:18:1;;;8068:50;8135:18;;2620:41:0;7815:344:1;2620:41:0;3143:7:::1;:15:::0;;-1:-1:-1;;;;3143:15:0::1;::::0;;3174:22:::1;759:10:::0;3183:12:::1;3174:22;::::0;-1:-1:-1;;;;;6103:32:1;;;6085:51;;6073:2;6058:18;3174:22:0::1;;;;;;;3084:120::o:0;33405:348::-;33728:17;;33638:19;;-1:-1:-1;;;;;33609:25:0;;33476:7;33609:25;;;:19;:25;;;;;;33476:7;;33728:17;-1:-1:-1;33609:48:0;:98;;33688:19;;33609:98;;;-1:-1:-1;;;;;33660:25:0;;;;;;:19;:25;;;;;;33609:98;33590:118;;:15;:118;:::i;:::-;33557:13;;33503:12;;:35;;-1:-1:-1;;;33503:35:0;;-1:-1:-1;;;;;6103:32:1;;;33503:35:0;;;6085:51:1;33503:12:0;;;;:29;;6058:18:1;;33503:35:0;5939:203:1;17863:399:0;-1:-1:-1;;;;;17947:21:0;;17939:65;;;;-1:-1:-1;;;17939:65:0;;13493:2:1;17939:65:0;;;13475:21:1;13532:2;13512:18;;;13505:30;13571:33;13551:18;;;13544:61;13622:18;;17939:65:0;13291:355:1;17939:65:0;18095:6;18079:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;18112:18:0;;:9;:18;;;;;;;;;;:28;;18134:6;;18112:9;:28;;18134:6;;18112:28;:::i;:::-;;;;-1:-1:-1;;18156:37:0;;13797:25:1;;;-1:-1:-1;;;;;18156:37:0;;;18173:1;;18156:37;;13785:2:1;13770:18;18156:37:0;;;;;;;29230:791;;:::o;5543:191::-;5636:6;;;-1:-1:-1;;;;;5653:17:0;;;-1:-1:-1;;;;;;5653:17:0;;;;;;;5686:40;;5636:6;;;5653:17;5636:6;;5686:40;;5617:16;;5686:40;5606:128;5543:191;:::o;2825:118::-;2096:7;;-1:-1:-1;;;2096:7:0;;;;2350:9;2342:38;;;;-1:-1:-1;;;2342:38:0;;;;;;;:::i;:::-;2885:7:::1;:14:::0;;-1:-1:-1;;;;2885:14:0::1;-1:-1:-1::0;;;2885:14:0::1;::::0;;2915:20:::1;2922:12;759:10:::0;;679:98;18595:591;-1:-1:-1;;;;;18679:21:0;;18671:67;;;;-1:-1:-1;;;18671:67:0;;11460:2:1;18671:67:0;;;11442:21:1;11499:2;11479:18;;;11472:30;11538:34;11518:18;;;11511:62;-1:-1:-1;;;11589:18:1;;;11582:31;11630:19;;18671:67:0;11258:397:1;18671:67:0;-1:-1:-1;;;;;18838:18:0;;18813:22;18838:18;;;;;;;;;;;18875:24;;;;18867:71;;;;-1:-1:-1;;;18867:71:0;;8366:2:1;18867:71:0;;;8348:21:1;8405:2;8385:18;;;8378:30;8444:34;8424:18;;;8417:62;-1:-1:-1;;;8495:18:1;;;8488:32;8537:19;;18867:71:0;8164:398:1;18867:71:0;-1:-1:-1;;;;;18974:18:0;;:9;:18;;;;;;;;;;18995:23;;;18974:44;;19040:12;:22;;19012:6;;18974:9;19040:22;;19012:6;;19040:22;:::i;:::-;;;;-1:-1:-1;;19080:37:0;;13797:25:1;;;19106:1:0;;-1:-1:-1;;;;;19080:37:0;;;;;13785:2:1;13770:18;19080:37:0;;;;;;;27444:97:::1;27344:204:::0;;:::o;14:673:1:-;68:5;121:3;114:4;106:6;102:17;98:27;88:55;;139:1;136;129:12;88:55;175:6;162:20;201:4;225:60;241:43;281:2;241:43;:::i;:::-;225:60;:::i;:::-;307:3;331:2;326:3;319:15;359:2;354:3;350:12;343:19;;394:2;386:6;382:15;446:3;441:2;435;432:1;428:10;420:6;416:23;412:32;409:41;406:61;;;463:1;460;453:12;406:61;485:1;495:163;509:2;506:1;503:9;495:163;;;566:17;;554:30;;604:12;;;;636;;;;527:1;520:9;495:163;;;-1:-1:-1;676:5:1;;14:673;-1:-1:-1;;;;;;;14:673:1:o;692:160::-;757:20;;813:13;;806:21;796:32;;786:60;;842:1;839;832:12;786:60;692:160;;;:::o;857:247::-;916:6;969:2;957:9;948:7;944:23;940:32;937:52;;;985:1;982;975:12;937:52;1024:9;1011:23;1043:31;1068:5;1043:31;:::i;:::-;1093:5;857:247;-1:-1:-1;;;857:247:1:o;1109:388::-;1177:6;1185;1238:2;1226:9;1217:7;1213:23;1209:32;1206:52;;;1254:1;1251;1244:12;1206:52;1293:9;1280:23;1312:31;1337:5;1312:31;:::i;:::-;1362:5;-1:-1:-1;1419:2:1;1404:18;;1391:32;1432:33;1391:32;1432:33;:::i;:::-;1484:7;1474:17;;;1109:388;;;;;:::o;1502:456::-;1579:6;1587;1595;1648:2;1636:9;1627:7;1623:23;1619:32;1616:52;;;1664:1;1661;1654:12;1616:52;1703:9;1690:23;1722:31;1747:5;1722:31;:::i;:::-;1772:5;-1:-1:-1;1829:2:1;1814:18;;1801:32;1842:33;1801:32;1842:33;:::i;:::-;1502:456;;1894:7;;-1:-1:-1;;;1948:2:1;1933:18;;;;1920:32;;1502:456::o;1963:315::-;2028:6;2036;2089:2;2077:9;2068:7;2064:23;2060:32;2057:52;;;2105:1;2102;2095:12;2057:52;2144:9;2131:23;2163:31;2188:5;2163:31;:::i;:::-;2213:5;-1:-1:-1;2237:35:1;2268:2;2253:18;;2237:35;:::i;:::-;2227:45;;1963:315;;;;;:::o;2283:::-;2351:6;2359;2412:2;2400:9;2391:7;2387:23;2383:32;2380:52;;;2428:1;2425;2418:12;2380:52;2467:9;2454:23;2486:31;2511:5;2486:31;:::i;:::-;2536:5;2588:2;2573:18;;;;2560:32;;-1:-1:-1;;;2283:315:1:o;2603:967::-;2698:6;2729:2;2772;2760:9;2751:7;2747:23;2743:32;2740:52;;;2788:1;2785;2778:12;2740:52;2821:9;2815:16;2854:18;2846:6;2843:30;2840:50;;;2886:1;2883;2876:12;2840:50;2909:22;;2962:4;2954:13;;2950:27;-1:-1:-1;2940:55:1;;2991:1;2988;2981:12;2940:55;3020:2;3014:9;3043:60;3059:43;3099:2;3059:43;:::i;3043:60::-;3125:3;3149:2;3144:3;3137:15;3177:2;3172:3;3168:12;3161:19;;3208:2;3204;3200:11;3256:7;3251:2;3245;3242:1;3238:10;3234:2;3230:19;3226:28;3223:41;3220:61;;;3277:1;3274;3267:12;3220:61;3299:1;3290:10;;3309:231;3323:2;3320:1;3317:9;3309:231;;;3387:3;3381:10;3404:31;3429:5;3404:31;:::i;:::-;3448:18;;3341:1;3334:9;;;;;3486:12;;;;3518;;3309:231;;;-1:-1:-1;3559:5:1;2603:967;-1:-1:-1;;;;;;;2603:967:1:o;3575:1226::-;3693:6;3701;3754:2;3742:9;3733:7;3729:23;3725:32;3722:52;;;3770:1;3767;3760:12;3722:52;3810:9;3797:23;3839:18;3880:2;3872:6;3869:14;3866:34;;;3896:1;3893;3886:12;3866:34;3934:6;3923:9;3919:22;3909:32;;3979:7;3972:4;3968:2;3964:13;3960:27;3950:55;;4001:1;3998;3991:12;3950:55;4037:2;4024:16;4059:4;4083:60;4099:43;4139:2;4099:43;:::i;4083:60::-;4165:3;4189:2;4184:3;4177:15;4217:2;4212:3;4208:12;4201:19;;4248:2;4244;4240:11;4296:7;4291:2;4285;4282:1;4278:10;4274:2;4270:19;4266:28;4263:41;4260:61;;;4317:1;4314;4307:12;4260:61;4339:1;4330:10;;4349:238;4363:2;4360:1;4357:9;4349:238;;;4434:3;4421:17;4451:31;4476:5;4451:31;:::i;:::-;4495:18;;4381:1;4374:9;;;;;4533:12;;;;4565;;4349:238;;;-1:-1:-1;4606:5:1;-1:-1:-1;;4649:18:1;;4636:32;;-1:-1:-1;;4680:16:1;;;4677:36;;;4709:1;4706;4699:12;4677:36;;4732:63;4787:7;4776:8;4765:9;4761:24;4732:63;:::i;:::-;4722:73;;;3575:1226;;;;;:::o;4806:180::-;4862:6;4915:2;4903:9;4894:7;4890:23;4886:32;4883:52;;;4931:1;4928;4921:12;4883:52;4954:26;4970:9;4954:26;:::i;4991:180::-;5050:6;5103:2;5091:9;5082:7;5078:23;5074:32;5071:52;;;5119:1;5116;5109:12;5071:52;-1:-1:-1;5142:23:1;;4991:180;-1:-1:-1;4991:180:1:o;5176:184::-;5246:6;5299:2;5287:9;5278:7;5274:23;5270:32;5267:52;;;5315:1;5312;5305:12;5267:52;-1:-1:-1;5338:16:1;;5176:184;-1:-1:-1;5176:184:1:o;5365:248::-;5433:6;5441;5494:2;5482:9;5473:7;5469:23;5465:32;5462:52;;;5510:1;5507;5500:12;5462:52;-1:-1:-1;;5533:23:1;;;5603:2;5588:18;;;5575:32;;-1:-1:-1;5365:248:1:o;5618:316::-;5695:6;5703;5711;5764:2;5752:9;5743:7;5739:23;5735:32;5732:52;;;5780:1;5777;5770:12;5732:52;-1:-1:-1;;5803:23:1;;;5873:2;5858:18;;5845:32;;-1:-1:-1;5924:2:1;5909:18;;;5896:32;;5618:316;-1:-1:-1;5618:316:1:o;6809:597::-;6921:4;6950:2;6979;6968:9;6961:21;7011:6;7005:13;7054:6;7049:2;7038:9;7034:18;7027:34;7079:1;7089:140;7103:6;7100:1;7097:13;7089:140;;;7198:14;;;7194:23;;7188:30;7164:17;;;7183:2;7160:26;7153:66;7118:10;;7089:140;;;7247:6;7244:1;7241:13;7238:91;;;7317:1;7312:2;7303:6;7292:9;7288:22;7284:31;7277:42;7238:91;-1:-1:-1;7390:2:1;7369:15;-1:-1:-1;;7365:29:1;7350:45;;;;7397:2;7346:54;;6809:597;-1:-1:-1;;;6809:597:1:o;9784:340::-;9986:2;9968:21;;;10025:2;10005:18;;;9998:30;-1:-1:-1;;;10059:2:1;10044:18;;10037:46;10115:2;10100:18;;9784:340::o;10538:356::-;10740:2;10722:21;;;10759:18;;;10752:30;10818:34;10813:2;10798:18;;10791:62;10885:2;10870:18;;10538:356::o;12066:409::-;12268:2;12250:21;;;12307:2;12287:18;;;12280:30;12346:34;12341:2;12326:18;;12319:62;-1:-1:-1;;;12412:2:1;12397:18;;12390:43;12465:3;12450:19;;12066:409::o;14022:275::-;14093:2;14087:9;14158:2;14139:13;;-1:-1:-1;;14135:27:1;14123:40;;14193:18;14178:34;;14214:22;;;14175:62;14172:88;;;14240:18;;:::i;:::-;14276:2;14269:22;14022:275;;-1:-1:-1;14022:275:1:o;14302:183::-;14362:4;14395:18;14387:6;14384:30;14381:56;;;14417:18;;:::i;:::-;-1:-1:-1;14462:1:1;14458:14;14474:4;14454:25;;14302:183::o;14490:128::-;14530:3;14561:1;14557:6;14554:1;14551:13;14548:39;;;14567:18;;:::i;:::-;-1:-1:-1;14603:9:1;;14490:128::o;14623:217::-;14663:1;14689;14679:132;;14733:10;14728:3;14724:20;14721:1;14714:31;14768:4;14765:1;14758:15;14796:4;14793:1;14786:15;14679:132;-1:-1:-1;14825:9:1;;14623:217::o;14845:168::-;14885:7;14951:1;14947;14943:6;14939:14;14936:1;14933:21;14928:1;14921:9;14914:17;14910:45;14907:71;;;14958:18;;:::i;:::-;-1:-1:-1;14998:9:1;;14845:168::o;15018:125::-;15058:4;15086:1;15083;15080:8;15077:34;;;15091:18;;:::i;:::-;-1:-1:-1;15128:9:1;;15018:125::o;15148:380::-;15227:1;15223:12;;;;15270;;;15291:61;;15345:4;15337:6;15333:17;15323:27;;15291:61;15398:2;15390:6;15387:14;15367:18;15364:38;15361:161;;;15444:10;15439:3;15435:20;15432:1;15425:31;15479:4;15476:1;15469:15;15507:4;15504:1;15497:15;15361:161;;15148:380;;;:::o;15533:127::-;15594:10;15589:3;15585:20;15582:1;15575:31;15625:4;15622:1;15615:15;15649:4;15646:1;15639:15;15665:127;15726:10;15721:3;15717:20;15714:1;15707:31;15757:4;15754:1;15747:15;15781:4;15778:1;15771:15;15797:127;15858:10;15853:3;15849:20;15846:1;15839:31;15889:4;15886:1;15879:15;15913:4;15910:1;15903:15;15929:131;-1:-1:-1;;;;;16004:31:1;;15994:42;;15984:70;;16050:1;16047;16040:12

Swarm Source

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