ETH Price: $3,401.34 (+2.57%)

Token

UREEQA Token (URQA)
 

Overview

Max Total Supply

100,000,000 URQA

Holders

3,411 ( -0.029%)

Total Transfers

-

Market

Price

$0.00 @ 0.000001 ETH (+2.36%)

Onchain Market Cap

$222,537.00

Circulating Supply Market Cap

$90,464.00

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

UREEQA is a platform for Protecting, Managing and Monetizing creative work.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
URQAToken

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-03-31
*/

// File: @openzeppelin/contracts/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/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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/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 guidelines: functions revert instead
 * of 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 {
    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 defaut value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All three 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 returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual 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
     * overloaded;
     *
     * 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 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");
        _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");
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);

        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is 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");
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;

        emit Transfer(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:
     *
     * - `to` 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);
    }

    /**
     * @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");
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;

        emit Transfer(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 to 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 { }
}

// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

// File: contracts/OwnershipAgreement.sol

pragma solidity >=0.7.0 <0.9.0;


/// @title Creates an Ownership Agreement, with an optional Operator role
/// @author Dr. Jonathan Shahen at UREEQA
/// @notice TODO
/// @dev Maximum number of Owners is set to 255 (unit8.MAX_VALUE)
contract OwnershipAgreement {
    /*
     * Storage
     */
    enum ResolutionType {
        None, // This indicates that the resolution hasn't been set (default value)
        AddOwner,
        RemoveOwner,
        ReplaceOwner,
        AddOperator,
        RemoveOperator,
        ReplaceOperator,
        UpdateThreshold,
        UpdateTransactionLimit,
        Pause,
        Unpause,
        Custom
    }
    struct Resolution {
        // Has the resolution already been passed
        bool passed;
        // The type of resolution
        ResolutionType resType;
        // The old address, can be address(0). oldAddress and newAddress cannot both equal address(0).
        address oldAddress;
        // The new address, can be address(0). oldAddress and newAddress cannot both equal address(0).
        address newAddress;
    }
    using EnumerableSet for EnumerableSet.AddressSet;
    // Set of owners
    // NOTE: we utilize a set, so we can enumerate the owners and so that the list only contains one instance of an account
    // NOTE: address(0) is not a valid owner
    EnumerableSet.AddressSet private _owners;
    // Value to indicate if the smart contract is paused
    bool private _paused;
    // An address, usually controlled by a computer, that performs regular/automated operations within the smart contract
    // NOTE: address(0) is not a valid operator
    EnumerableSet.AddressSet private _operators;
    // Limit the number of operators
    uint160 public operatorLimit = 1;
    // The number of owners it takes to come to an agreement
    uint160 public ownerAgreementThreshold = 1;
    // Limit per Transaction to impose
    // A limit of zero means no limit imposed
    uint256 public transactionLimit = 0;
    // Stores each vote for each resolution number (int)
    mapping(address => mapping(uint256 => bool)) public ownerVotes;
    // The next available resolution number
    uint256 public nextResolution = 1;
    mapping(address => uint256) lastOwnerResolutionNumber;
    // Stores the resolutions
    mapping(uint256 => Resolution) public resolutions;

    // ////////////////////////////////////////////////////
    // EVENTS
    // ////////////////////////////////////////////////////
    event OwnerAddition(address owner);
    event OwnerRemoval(address owner);
    event OwnerReplacement(address oldOwner, address newOwner);

    event OperatorAddition(address newOperator);
    event OperatorRemoval(address oldOperator);
    event OperatorReplacement(address oldOperator, address newOperator);

    event UpdateThreshold(uint160 newThreshold);
    event UpdateNumberOfOperators(uint160 newOperators);
    event UpdateTransactionLimit(uint256 newLimit);
    /// @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);

    // ////////////////////////////////////////////////////
    // MODIFIERS
    // ////////////////////////////////////////////////////
    function isValidAddress(address newAddr) public pure {
        require(newAddr != address(0), "Invaild Address");
    }

    modifier onlyOperators() {
        isValidAddress(msg.sender);
        require(
            EnumerableSet.contains(_operators, msg.sender) == true,
            "Only the operator can run this function."
        );
        _;
    }
    modifier onlyOwners() {
        isValidAddress(msg.sender);
        require(
            EnumerableSet.contains(_owners, msg.sender) == true,
            "Only an owner can run this function."
        );
        _;
    }

    modifier onlyOwnersOrOperator() {
        isValidAddress(msg.sender);
        require(
            EnumerableSet.contains(_operators, msg.sender) == true || 
            EnumerableSet.contains(_owners, msg.sender) == true,
            "Only an owner or the operator can run this function."
        );
        _;
    }

    modifier ownerExists(address owner) {
        require(
            EnumerableSet.contains(_owners, owner) == true,
            "Owner does not exists."
        );
        _;
    }

    /**
     * @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, "Smart Contract is paused");
        _;
    }

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

    /// @dev Modifier to make a function callable only when the amount is within the transaction limit
    modifier withinLimit(uint256 amount) {
        require(transactionLimit == 0 || amount <= transactionLimit, "Amount is over the transaction limit");
        _;
    }

    // ////////////////////////////////////////////////////
    // CONSTRUCTOR
    // ////////////////////////////////////////////////////
    constructor() {
        _addOwner(msg.sender);
        _paused = false;
    }

    // ////////////////////////////////////////////////////
    // VIEW FUNCTIONS
    // ////////////////////////////////////////////////////

    /// @dev Returns list of owners.
    /// @return List of owner addresses.
    function getOwners() public view returns (address[] memory) {
        uint256 len = EnumerableSet.length(_owners);
        address[] memory o = new address[](len);

        for (uint256 i = 0; i < len; i++) {
            o[i] = EnumerableSet.at(_owners, i);
        }

        return o;
    }

    /// @dev Returns the number of owners.
    /// @return Number of owners.
    function getNumberOfOwners() public view returns (uint8) {
        return uint8(EnumerableSet.length(_owners));
    }

    /// @dev Returns list of owners.
    /// @return List of owner addresses.
    function getOperators() public view returns (address[] memory) {
        uint256 len = EnumerableSet.length(_operators);
        address[] memory o = new address[](len);

        for (uint256 i = 0; i < len; i++) {
            o[i] = EnumerableSet.at(_operators, i);
        }

        return o;
    }

    /// @dev Returns the number of operators.
    /// @return Number of operators.
    function getNumberOfOperators() public view returns (uint8) {
        return uint8(EnumerableSet.length(_operators));
    }

    /// @dev How many owners does it take to approve a resolution
    /// @return minimum number of owner votes
    function getVoteThreshold() public view returns (uint160) {
        return ownerAgreementThreshold;
    }

    /// @dev Returns the maximum amount a transaction can contain
    /// @return maximum amount or zero is no limit
    function getTransactionLimit() public view returns (uint256) {
        return transactionLimit;
    }

    /// @dev Returns the next available resolution.
    /// @return The next available resolution number
    function getNextResolutionNumber() public view returns (uint256) {
        return nextResolution;
    }

    /// @dev Returns the next available resolution.
    /// @return The next available resolution number
    function getLastOwnerResolutionNumber(address owner) public view returns (uint256) {
        return lastOwnerResolutionNumber[owner];
    }

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

    /// @dev Helper function to fail if resolution number is already in use.
    function resolutionAlreadyUsed(uint256 resNum) public view {
        require(
            // atleast one of the address must not be equal to address(0)
            !(resolutions[resNum].oldAddress != address(0) ||
                resolutions[resNum].newAddress != address(0)),
            "Resolution is already in use."
        );
    }

    function isResolutionPassed(uint256 resNum) public view returns (bool) {
        return resolutions[resNum].passed;
    }

    function canResolutionPass(uint256 resNum) public view returns (bool) {
        uint256 voteCount = 0;
        uint256 len = EnumerableSet.length(_owners);

        for (uint256 i = 0; i < len; i++) {
            if (ownerVotes[EnumerableSet.at(_owners, i)][resNum] == true) {
                voteCount++;
            }
        }

        return voteCount >= ownerAgreementThreshold;
    }

    // ////////////////////////////////////////////////////
    // PUBLIC FUNCTIONS
    // ////////////////////////////////////////////////////

    /// @notice Vote Yes on a Resolution.
    /// @dev The owner who tips the agreement threshold will pay the gas for performing the resolution.
    /// @return TRUE if the resolution passed
    function voteResolution(uint256 resNum) public onlyOwners() returns (bool) {
        ownerVotes[msg.sender][resNum] = true;

        // If the reolution has already passed, then do nothing
        if (isResolutionPassed(resNum)) {
            return true;
        }

        // If the resolution can now be passed, then do so
        if (canResolutionPass(resNum)) {
            _performResolution(resNum);
            return true;
        }

        // The resolution cannot be passed yet
        return false;
    }

    /// @dev Create a resolution to add an owner. Performs addition if threshold is 1 or zero.
    function createResolutionAddOwner(address newOwner) public onlyOwners() {
        isValidAddress(newOwner);
        require(!EnumerableSet.contains(_owners, newOwner),"newOwner already exists.");

        createResolution(ResolutionType.AddOwner, address(0), newOwner);
    }

    /// @dev Create a resolution to remove an owner. Performs removal if threshold is 1 or zero.
    /// @dev Updates the threshold to keep it less than or equal to the number of new owners
    function createResolutionRemoveOwner(address owner) public onlyOwners() {
        isValidAddress(owner);
        require(getNumberOfOwners() > 1, "Must always be one owner");
        require(EnumerableSet.contains(_owners, owner),"owner is not an owner.");

        createResolution(ResolutionType.RemoveOwner, owner, address(0));
    }

    /// @dev Create a resolution to repalce an owner. Performs replacement if threshold is 1 or zero.
    function createResolutionReplaceOwner(address oldOwner, address newOwner)
        public
        onlyOwners()
    {
        isValidAddress(oldOwner);
        isValidAddress(newOwner);
        require(EnumerableSet.contains(_owners, oldOwner),"oldOwner is not an owner.");
        require(!EnumerableSet.contains(_owners, newOwner),"newOwner already exists.");

        createResolution(ResolutionType.ReplaceOwner, oldOwner, newOwner);
    }

    /// @dev Create a resolution to add an operator. Performs addition if threshold is 1 or zero.
    function createResolutionAddOperator(address newOperator) public onlyOwners() {
        isValidAddress(newOperator);
        require(!EnumerableSet.contains(_operators, newOperator),"newOperator already exists.");

        createResolution(ResolutionType.AddOperator, address(0), newOperator);
    }

    /// @dev Create a resolution to remove the operator. Performs removal if threshold is 1 or zero.
    function createResolutionRemoveOperator(address operator) public onlyOwners() {
        require(EnumerableSet.contains(_operators, operator),"operator is not an Operator.");
        createResolution(ResolutionType.RemoveOperator, operator, address(0));
    }

    /// @dev Create a resolution to replace the operator account. Performs replacement if threshold is 1 or zero.
    function createResolutionReplaceOperator(address oldOperator, address newOperator)
        public
        onlyOwners()
    {
        isValidAddress(oldOperator);
        isValidAddress(newOperator);
        require(EnumerableSet.contains(_operators, oldOperator),"oldOperator is not an Operator.");
        require(!EnumerableSet.contains(_operators, newOperator),"newOperator already exists.");

        createResolution(ResolutionType.ReplaceOperator, oldOperator, newOperator);
    }

    /// @dev Create a resolution to update the transaction limit. Performs update if threshold is 1 or zero.
    function createResolutionUpdateTransactionLimit(uint160 newLimit)
        public
        onlyOwners()
    {
        createResolution(ResolutionType.UpdateTransactionLimit, address(0), address(newLimit));
    }

    /// @dev Create a resolution to update the owner agreement threshold. Performs update if threshold is 1 or zero.
    function createResolutionUpdateThreshold(uint160 threshold)
        public
        onlyOwners()
    {
        createResolution(ResolutionType.UpdateThreshold, address(0), address(threshold));
    }

    /// @dev Pause the contract. Does not require owner agreement.
    function pause() public onlyOwners() {
        _pause();
    }

    /// @dev Create a resolution to unpause the contract. Performs update if threshold is 1 or zero.
    function createResolutionUnpause() public onlyOwners() {
        createResolution(ResolutionType.Unpause, address(1), address(1));
    }

    // ////////////////////////////////////////////////////
    // INTERNAL FUNCTIONS
    // ////////////////////////////////////////////////////
    /// @dev Create a resolution and check if we can call perofrm the resolution with 1 vote.
    function createResolution(ResolutionType resType, address oldAddress, address newAddress) internal {
        uint256 resNum = nextResolution;
        nextResolution++;
        resolutionAlreadyUsed(resNum);

        resolutions[resNum].resType = resType;
        resolutions[resNum].oldAddress = oldAddress;
        resolutions[resNum].newAddress = newAddress;

        ownerVotes[msg.sender][resNum] = true;
        lastOwnerResolutionNumber[msg.sender] = resNum;

        // Check if agreement is already reached
        if (ownerAgreementThreshold <= 1) {
            _performResolution(resNum);
        }
    }

    /// @dev Performs the resolution and then marks it as passed. No checks prevent it from performing the resolutions.
    function _performResolution(uint256 resNum) internal {
        if (resolutions[resNum].resType == ResolutionType.AddOwner) {
            _addOwner(resolutions[resNum].newAddress);
        } else if (resolutions[resNum].resType == ResolutionType.RemoveOwner) {
            _removeOwner(resolutions[resNum].oldAddress);
        } else if (resolutions[resNum].resType == ResolutionType.ReplaceOwner) {
            _replaceOwner(
                resolutions[resNum].oldAddress,
                resolutions[resNum].newAddress
            );
        } else if (
            resolutions[resNum].resType == ResolutionType.AddOperator
        ) {
            _addOperator(resolutions[resNum].newAddress);
        } else if (
            resolutions[resNum].resType == ResolutionType.RemoveOperator
        ) {
            _removeOperator(resolutions[resNum].oldAddress);
        } else if (
            resolutions[resNum].resType == ResolutionType.ReplaceOperator
        ) {
            _replaceOperator(resolutions[resNum].oldAddress,resolutions[resNum].newAddress);
        } else if (
            resolutions[resNum].resType == ResolutionType.UpdateTransactionLimit
        ) {
            _updateTransactionLimit(uint160(resolutions[resNum].newAddress));
        } else if (
            resolutions[resNum].resType == ResolutionType.UpdateThreshold
        ) {
            _updateThreshold(uint160(resolutions[resNum].newAddress));
        } else if (
            resolutions[resNum].resType == ResolutionType.Pause
        ) {
            _pause();
        } else if (
            resolutions[resNum].resType == ResolutionType.Unpause
        ) {
            _unpause();
        }

        resolutions[resNum].passed = true;
    }

    /// @dev
    function _addOwner(address owner) internal {
        EnumerableSet.add(_owners, owner);
        emit OwnerAddition(owner);
    }

    /// @dev
    function _removeOwner(address owner) internal {
        EnumerableSet.remove(_owners, owner);
        emit OwnerRemoval(owner);

        uint8 numOwners = getNumberOfOwners();
        if(ownerAgreementThreshold > numOwners) {
            _updateThreshold(numOwners);
        }
    }

    /// @dev
    function _replaceOwner(address oldOwner, address newOwner) internal {
        EnumerableSet.remove(_owners, oldOwner);
        EnumerableSet.add(_owners, newOwner);
        emit OwnerReplacement(oldOwner, newOwner);
    }

    /// @dev
    function _addOperator(address operator) internal {
        EnumerableSet.add(_operators, operator);
        emit OperatorAddition(operator);
    }

    /// @dev
    function _removeOperator(address operator) internal {
        EnumerableSet.remove(_operators, operator);
        emit OperatorRemoval(operator);
    }

    /// @dev
    function _replaceOperator(address oldOperator, address newOperator) internal {
        emit OperatorReplacement(oldOperator, newOperator);
        EnumerableSet.remove(_operators, oldOperator);
        EnumerableSet.add(_operators, newOperator);
    }

    /// @dev Internal function to update and emit the new transaction limit
    function _updateTransactionLimit(uint256 newLimit) internal {
        emit UpdateTransactionLimit(newLimit);
        transactionLimit = newLimit;
    }

    /// @dev Internal function to update and emit the new voting threshold
    function _updateThreshold(uint160 threshold) internal {
        require(threshold <= getNumberOfOwners(), "Unable to set threshold above the number of owners");
        emit UpdateThreshold(threshold);
        ownerAgreementThreshold = threshold;
    }

    /// @dev Internal function to update and emit the new voting threshold
    function _updateNumberOfOperators(uint160 numOperators) internal {
        require(numOperators >= getNumberOfOperators(), "Unable to set number of Operators below the number of operators");
        emit UpdateNumberOfOperators(numOperators);
        operatorLimit = numOperators;
    }


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

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

// File: contracts/URQAToken.sol

pragma solidity >=0.7.0 <0.9.0;



/// @title UREEQA's URQA Token
/// @author Dr. Jonathan Shahen at UREEQA
contract URQAToken is OwnershipAgreement, ERC20 {

    constructor() ERC20("UREEQA Token", "URQA") {
        // Total Supply: 100 million
        _mint(msg.sender, 100_000_000e18);
    }

    /**
     * @dev Batch transfer to reduce gas fees. Utilizes SafeMath and self.transfer
     *
     * Requirements:
     *
     * - `recipients` cannot contain the zero address.
     * - the caller must have a balance of at least SUM `amounts`.
     */
    function batchTransfer(address[] memory recipients, uint256[] memory amounts) public returns (bool) {
        for(uint256 i=0; i< amounts.length; i++) {
            transfer(recipients[i], amounts[i]);
        }
        return true;
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {
        super._beforeTokenTransfer(from, to, amount);

        require(!paused(), "Cannot complete token transfer while Contract is Paused");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":false,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOperator","type":"address"}],"name":"OperatorRemoval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOperator","type":"address"},{"indexed":false,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorReplacement","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnerAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnerRemoval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerReplacement","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint160","name":"newOperators","type":"uint160"}],"name":"UpdateNumberOfOperators","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint160","name":"newThreshold","type":"uint160"}],"name":"UpdateThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"UpdateTransactionLimit","type":"event"},{"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":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"resNum","type":"uint256"}],"name":"canResolutionPass","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"createResolutionAddOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"createResolutionAddOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"createResolutionRemoveOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"createResolutionRemoveOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oldOperator","type":"address"},{"internalType":"address","name":"newOperator","type":"address"}],"name":"createResolutionReplaceOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oldOwner","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"createResolutionReplaceOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"createResolutionUnpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint160","name":"threshold","type":"uint160"}],"name":"createResolutionUpdateThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint160","name":"newLimit","type":"uint160"}],"name":"createResolutionUpdateTransactionLimit","outputs":[],"stateMutability":"nonpayable","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":"owner","type":"address"}],"name":"getLastOwnerResolutionNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextResolutionNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfOperators","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfOwners","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOperators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransactionLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVoteThreshold","outputs":[{"internalType":"uint160","name":"","type":"uint160"}],"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":[{"internalType":"uint256","name":"resNum","type":"uint256"}],"name":"isResolutionPassed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddr","type":"address"}],"name":"isValidAddress","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextResolution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorLimit","outputs":[{"internalType":"uint160","name":"","type":"uint160"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerAgreementThreshold","outputs":[{"internalType":"uint160","name":"","type":"uint160"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerVotes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"resNum","type":"uint256"}],"name":"resolutionAlreadyUsed","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"resolutions","outputs":[{"internalType":"bool","name":"passed","type":"bool"},{"internalType":"enum OwnershipAgreement.ResolutionType","name":"resType","type":"uint8"},{"internalType":"address","name":"oldAddress","type":"address"},{"internalType":"address","name":"newAddress","type":"address"}],"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":"transactionLimit","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":"uint256","name":"resNum","type":"uint256"}],"name":"voteResolution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040526005805460016001600160a01b03199182168117909255600680549091168217905560006007556009553480156200003b57600080fd5b506040518060400160405280600c81526020016b2aa922a2a8a0902a37b5b2b760a11b815250604051806040016040528060048152602001635552514160e01b8152506200008f33620000ea60201b60201c565b6002805460ff191690558151620000ae90600f906020850190620002ea565b508051620000c4906010906020840190620002ea565b505050620000e4336a52b7d2dcc80cd2e40000006200013f60201b60201c565b620004a3565b620001026000826200021360201b620010a21760201c565b507ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d8160405162000134919062000390565b60405180910390a150565b6001600160a01b038216620001715760405162461bcd60e51b8152600401620001689062000401565b60405180910390fd5b6200017f6000838362000233565b80600e600082825462000193919062000441565b90915550506001600160a01b0382166000908152600c602052604081208054839290620001c290849062000441565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906200020790859062000438565b60405180910390a35050565b60006200022a836001600160a01b0384166200027a565b90505b92915050565b6200024b8383836200027560201b620010be1760201c565b62000255620002c9565b15620002755760405162461bcd60e51b81526004016200016890620003a4565b505050565b6000620002888383620002d2565b620002c0575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200022d565b5060006200022d565b60025460ff1690565b60009081526001919091016020526040902054151590565b828054620002f89062000466565b90600052602060002090601f0160209004810192826200031c576000855562000367565b82601f106200033757805160ff191683800117855562000367565b8280016001018555821562000367579182015b82811115620003675782518255916020019190600101906200034a565b506200037592915062000379565b5090565b5b808211156200037557600081556001016200037a565b6001600160a01b0391909116815260200190565b60208082526037908201527f43616e6e6f7420636f6d706c65746520746f6b656e207472616e73666572207760408201527f68696c6520436f6e747261637420697320506175736564000000000000000000606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b600082198211156200046157634e487b7160e01b81526011600452602481fd5b500190565b6002810460018216806200047b57607f821691505b602082108114156200049d57634e487b7160e01b600052602260045260246000fd5b50919050565b61271c80620004b36000396000f3fe608060405234801561001057600080fd5b506004361061025d5760003560e01c80637ad8ed1e11610146578063a9059cbb116100c3578063c3743cff11610087578063c3743cff146104dd578063ccc19752146104e5578063dd62ed3e146104ed578063dee80c0f14610500578063f1376a9814610508578063f19605d61461051b5761025d565b8063a9059cbb14610494578063b85e5b74146104a7578063b8d95d7e146104af578063baa98fbd146104c2578063c0d795de146104ca5761025d565b806390e4ed591161010a57806390e4ed591461044657806395d89b411461044e578063a0e67e2b14610456578063a457c2d71461045e578063a4b7f5ce146104715761025d565b80637ad8ed1e146103fd5780638456cb591461041057806384be5ea91461041857806385a1a60b1461042b57806388d695b2146104335761025d565b806326eb2735116101df5780633a008949116101a35780633a0089491461039f5780635c975abb146103a75780635e7d907f146103af578063654079ba146103c45780636cc8bcff146103d757806370a08231146103ea5761025d565b806326eb27351461033c57806327a099d81461034f5780632e33e1e314610364578063313ce56714610377578063395093511461038c5761025d565b806312c290cb1161022657806312c290cb146102e857806312c44515146102fb57806318160ddd1461030e578063203365661461031657806323b872dd146103295761025d565b80623f07fa14610262578063037af12c14610277578063053a04f1146102a057806306fdde03146102c0578063095ea7b3146102d5575b600080fd5b610275610270366004611da1565b610523565b005b61028a610285366004611da1565b610555565b60405161029791906125bb565b60405180910390f35b6102b36102ae366004611f20565b610574565b6040516102979190611fb3565b6102c8610589565b604051610297919061200a565b6102b36102e3366004611e35565b61061b565b6102756102f6366004611da1565b610639565b610275610309366004611da1565b6106ac565b61028a6106ee565b610275610324366004611dbd565b6106f4565b6102b3610337366004611df5565b61079a565b61027561034a366004611da1565b610831565b6103576108cd565b6040516102979190611f66565b610275610372366004611da1565b610999565b61037f610a0c565b60405161029791906125c4565b6102b361039a366004611e35565b610a11565b61028a610a60565b6102b3610a66565b6103b7610a6f565b6040516102979190611f38565b6102b36103d2366004611e35565b610a7e565b6102756103e5366004611f20565b610a9e565b61028a6103f8366004611da1565b610aff565b61027561040b366004611da1565b610b1a565b610275610b5c565b610275610426366004611dbd565b610b9b565b61037f610c3d565b6102b3610441366004611e60565b610c4e565b6103b7610cd0565b6102c8610cdf565b610357610cee565b6102b361046c366004611e35565b610db3565b61048461047f366004611f20565b610e24565b6040516102979493929190611fbe565b6102b36104a2366004611e35565b610e5f565b61037f610e73565b6102756104bd366004611da1565b610e7f565b610275610ee8565b6102b36104d8366004611f20565b610f2a565b61028a610fbd565b61028a610fc3565b61028a6104fb366004611dbd565b610fc9565b6103b7610ff4565b6102b3610516366004611f20565b611003565b61028a61109c565b6001600160a01b0381166105525760405162461bcd60e51b815260040161054990612482565b60405180910390fd5b50565b6001600160a01b0381166000908152600a60205260409020545b919050565b6000908152600b602052604090205460ff1690565b6060600f80546105989061264f565b80601f01602080910402602001604051908101604052809291908181526020018280546105c49061264f565b80156106115780601f106105e657610100808354040283529160200191610611565b820191906000526020600020905b8154815290600101906020018083116105f457829003601f168201915b5050505050905090565b600061062f6106286110c3565b84846110c7565b5060015b92915050565b61064233610523565b61064d60003361117b565b151560011461066e5760405162461bcd60e51b815260040161054990612407565b61067781610523565b61068260038261117b565b1561069f5760405162461bcd60e51b8152600401610549906122cf565b6105526004600083611190565b6106b533610523565b6106c060003361117b565b15156001146106e15760405162461bcd60e51b815260040161054990612407565b6105526007600083611190565b600e5490565b6106fd33610523565b61070860003361117b565b15156001146107295760405162461bcd60e51b815260040161054990612407565b61073282610523565b61073b81610523565b61074660038361117b565b6107625760405162461bcd60e51b8152600401610549906121ad565b61076d60038261117b565b1561078a5760405162461bcd60e51b8152600401610549906122cf565b61079660068383611190565b5050565b60006107a7848484611285565b6001600160a01b0384166000908152600d60205260408120816107c86110c3565b6001600160a01b03166001600160a01b031681526020019081526020016000205490508281101561080b5760405162461bcd60e51b815260040161054990612336565b610826856108176110c3565b6108218685612638565b6110c7565b506001949350505050565b61083a33610523565b61084560003361117b565b15156001146108665760405162461bcd60e51b815260040161054990612407565b61086f81610523565b6001610879610e73565b60ff16116108995760405162461bcd60e51b815260040161054990612134565b6108a460008261117b565b6108c05760405162461bcd60e51b815260040161054990612306565b6105526002826000611190565b606060006108db60036113ad565b905060008167ffffffffffffffff81111561090657634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561092f578160200160208202803683370190505b50905060005b82811015610992576109486003826113b8565b82828151811061096857634e487b7160e01b600052603260045260246000fd5b6001600160a01b03909216602092830291909101909101528061098a8161268a565b915050610935565b5091505090565b6109a233610523565b6109ad60003361117b565b15156001146109ce5760405162461bcd60e51b815260040161054990612407565b6109d781610523565b6109e260008261117b565b156109ff5760405162461bcd60e51b81526004016105499061222a565b6105526001600083611190565b601290565b600061062f610a1e6110c3565b8484600d6000610a2c6110c3565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546108219190612620565b60095490565b60025460ff1690565b6006546001600160a01b031690565b600860209081526000928352604080842090915290825290205460ff1681565b6000818152600b60205260409020546201000090046001600160a01b0316151580610ae257506000818152600b60205260409020600101546001600160a01b031615155b156105525760405162461bcd60e51b81526004016105499061253f565b6001600160a01b03166000908152600c602052604090205490565b610b2333610523565b610b2e60003361117b565b1515600114610b4f5760405162461bcd60e51b815260040161054990612407565b6105526008600083611190565b610b6533610523565b610b7060003361117b565b1515600114610b915760405162461bcd60e51b815260040161054990612407565b610b996113c4565b565b610ba433610523565b610baf60003361117b565b1515600114610bd05760405162461bcd60e51b815260040161054990612407565b610bd982610523565b610be281610523565b610bed60008361117b565b610c095760405162461bcd60e51b815260040161054990612261565b610c1460008261117b565b15610c315760405162461bcd60e51b81526004016105499061222a565b61079660038383611190565b6000610c4960036113ad565b905090565b6000805b8251811015610cc657610cb3848281518110610c7e57634e487b7160e01b600052603260045260246000fd5b6020026020010151848381518110610ca657634e487b7160e01b600052603260045260246000fd5b6020026020010151610e5f565b5080610cbe8161268a565b915050610c52565b5060019392505050565b6005546001600160a01b031681565b6060601080546105989061264f565b60606000610cfc60006113ad565b905060008167ffffffffffffffff811115610d2757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610d50578160200160208202803683370190505b50905060005b8281101561099257610d696000826113b8565b828281518110610d8957634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091019091015280610dab8161268a565b915050610d56565b600080600d6000610dc26110c3565b6001600160a01b0390811682526020808301939093526040918201600090812091881681529252902054905082811015610e0e5760405162461bcd60e51b815260040161054990612576565b610cc6610e196110c3565b856108218685612638565b600b602052600090815260409020805460019091015460ff808316926101008104909116916001600160a01b03620100009092048216911684565b600061062f610e6c6110c3565b8484611285565b6000610c4960006113ad565b610e8833610523565b610e9360003361117b565b1515600114610eb45760405162461bcd60e51b815260040161054990612407565b610ebf60038261117b565b610edb5760405162461bcd60e51b8152600401610549906124ab565b6105526005826000611190565b610ef133610523565b610efc60003361117b565b1515600114610f1d5760405162461bcd60e51b815260040161054990612407565b610b99600a600180611190565b60008080610f37816113ad565b905060005b81811015610fa75760086000610f536000846113b8565b6001600160a01b031681526020808201929092526040908101600090812088825290925290205460ff16151560011415610f955782610f918161268a565b9350505b80610f9f8161268a565b915050610f3c565b50506006546001600160a01b0316111592915050565b60075490565b60095481565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b6006546001600160a01b031681565b600061100e33610523565b61101960003361117b565b151560011461103a5760405162461bcd60e51b815260040161054990612407565b3360009081526008602090815260408083208584529091529020805460ff1916600117905561106882610574565b156110755750600161056f565b61107e82610f2a565b156110945761108c8261142e565b50600161056f565b506000919050565b60075481565b60006110b7836001600160a01b038416611820565b9392505050565b505050565b3390565b6001600160a01b0383166110ed5760405162461bcd60e51b8152600401610549906123c3565b6001600160a01b0382166111135760405162461bcd60e51b81526004016105499061216b565b6001600160a01b038084166000818152600d602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061116e9085906125bb565b60405180910390a3505050565b60006110b7836001600160a01b03841661186a565b6009805490819060006111a28361268a565b91905055506111b081610a9e565b6000818152600b602081905260409091208054869261ff0019909116906101009084908111156111f057634e487b7160e01b600052602160045260246000fd5b02179055506000818152600b60209081526040808320805462010000600160b01b031916620100006001600160a01b0389811691909102919091178255600191820180546001600160a01b03191688831617905533808652600885528386208787528552838620805460ff1916841790558552600a9093529220839055600654161161127f5761127f8161142e565b50505050565b6001600160a01b0383166112ab5760405162461bcd60e51b81526004016105499061237e565b6001600160a01b0382166112d15760405162461bcd60e51b81526004016105499061209f565b6112dc838383611882565b6001600160a01b0383166000908152600c6020526040902054818110156113155760405162461bcd60e51b8152600401610549906121e4565b61131f8282612638565b6001600160a01b038086166000908152600c60205260408082209390935590851681529081208054849290611355908490612620565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161139f91906125bb565b60405180910390a350505050565b6000610633826118b2565b60006110b783836118b6565b60025460ff16156113e75760405162461bcd60e51b81526004016105499061244b565b6002805460ff191660011790556040517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890611424903390611f38565b60405180910390a1565b60016000828152600b6020819052604090912054610100900460ff169081111561146857634e487b7160e01b600052602160045260246000fd5b1415611497576000818152600b6020526040902060010154611492906001600160a01b031661190f565b611805565b60026000828152600b6020819052604090912054610100900460ff16908111156114d157634e487b7160e01b600052602160045260246000fd5b14156114fe576000818152600b6020526040902054611492906201000090046001600160a01b0316611955565b60036000828152600b6020819052604090912054610100900460ff169081111561153857634e487b7160e01b600052602160045260246000fd5b1415611570576000818152600b602052604090208054600190910154611492916001600160a01b0362010000909104811691166119c9565b60046000828152600b6020819052604090912054610100900460ff16908111156115aa57634e487b7160e01b600052602160045260246000fd5b14156115d4576000818152600b6020526040902060010154611492906001600160a01b0316611a1e565b60056000828152600b6020819052604090912054610100900460ff169081111561160e57634e487b7160e01b600052602160045260246000fd5b141561163b576000818152600b6020526040902054611492906201000090046001600160a01b0316611a59565b60066000828152600b6020819052604090912054610100900460ff169081111561167557634e487b7160e01b600052602160045260246000fd5b14156116ad576000818152600b602052604090208054600190910154611492916001600160a01b036201000090910481169116611a94565b60086000828152600b6020819052604090912054610100900460ff16908111156116e757634e487b7160e01b600052602160045260246000fd5b1415611711576000818152600b6020526040902060010154611492906001600160a01b0316611ae4565b60076000828152600b6020819052604090912054610100900460ff169081111561174b57634e487b7160e01b600052602160045260246000fd5b1415611775576000818152600b6020526040902060010154611492906001600160a01b0316611b20565b60096000828152600b6020819052604090912054610100900460ff16908111156117af57634e487b7160e01b600052602160045260246000fd5b14156117bd576114926113c4565b600a6000828152600b6020819052604090912054610100900460ff16908111156117f757634e487b7160e01b600052602160045260246000fd5b141561180557611805611bac565b6000908152600b60205260409020805460ff19166001179055565b600061182c838361186a565b61186257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610633565b506000610633565b60009081526001919091016020526040902054151590565b61188d8383836110be565b611895610a66565b156110be5760405162461bcd60e51b8152600401610549906124e2565b5490565b815460009082106118d95760405162461bcd60e51b81526004016105499061205d565b8260000182815481106118fc57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b61191a6000826110a2565b507ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d8160405161194a9190611f38565b60405180910390a150565b611960600082611c08565b507f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b90816040516119909190611f38565b60405180910390a160006119a2610e73565b60065490915060ff82166001600160a01b039091161115610796576107968160ff16611b20565b6119d4600083611c08565b506119e06000826110a2565b507f1b82188083c6040dda91df3d142280a20fa00e5a433eb921fdbf2e4ad1db45e58282604051611a12929190611f4c565b60405180910390a15050565b611a296003826110a2565b507fe96a56aa17dd8ae64ac3a51347e8e8a03d52f1cb2acdf8ed49b20d55662ebecc8160405161194a9190611f38565b611a64600382611c08565b507f108286147377add4f5f7bcdd7b6104dc6bdac3443e499142a612d418aa0be1548160405161194a9190611f38565b7f409833df5b08419a3bd86d34683f91767845e813a29d30d8a4338fba95158d8a8282604051611ac5929190611f4c565b60405180910390a1611ad8600383611c08565b506110be6003826110a2565b7f5ba74490711ccc5e81b24b40b8c5d2bd282981e4bc080dd8789bb10c1dfc2ea981604051611b1391906125bb565b60405180910390a1600755565b611b28610e73565b60ff16816001600160a01b03161115611b535760405162461bcd60e51b8152600401610549906120e2565b7f52ca658c4a059b2955bf70b065638aaa67f124556851d788a113d7c213f9ac9881604051611b829190611f38565b60405180910390a1600680546001600160a01b0319166001600160a01b0392909216919091179055565b60025460ff16611bce5760405162461bcd60e51b815260040161054990612298565b6002805460ff191690556040517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90611424903390611f38565b60006110b7836001600160a01b03841660008181526001830160205260408120548015611d2b576000611c3c600183612638565b8554909150600090611c5090600190612638565b90506000866000018281548110611c7757634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110611ca857634e487b7160e01b600052603260045260246000fd5b600091825260209091200155611cbf836001612620565b60008281526001890160205260409020558654879080611cef57634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610633565b6000915050610633565b600082601f830112611d45578081fd5b81356020611d5a611d55836125fc565b6125d2565b8281528181019085830183850287018401881015611d76578586fd5b855b85811015611d9457813584529284019290840190600101611d78565b5090979650505050505050565b600060208284031215611db2578081fd5b81356110b7816126d1565b60008060408385031215611dcf578081fd5b8235611dda816126d1565b91506020830135611dea816126d1565b809150509250929050565b600080600060608486031215611e09578081fd5b8335611e14816126d1565b92506020840135611e24816126d1565b929592945050506040919091013590565b60008060408385031215611e47578182fd5b8235611e52816126d1565b946020939093013593505050565b60008060408385031215611e72578182fd5b823567ffffffffffffffff80821115611e89578384fd5b818501915085601f830112611e9c578384fd5b81356020611eac611d55836125fc565b82815281810190858301838502870184018b1015611ec8578889fd5b8896505b84871015611ef3578035611edf816126d1565b835260019690960195918301918301611ecc565b5096505086013592505080821115611f09578283fd5b50611f1685828601611d35565b9150509250929050565b600060208284031215611f31578081fd5b5035919050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015611fa75783516001600160a01b031683529284019291840191600101611f82565b50909695505050505050565b901515815260200190565b841515815260808101600c8510611fe557634e487b7160e01b600052602160045260246000fd5b60208201949094526001600160a01b0392831660408201529116606090910152919050565b6000602080835283518082850152825b818110156120365785810183015185820160400152820161201a565b818111156120475783604083870101525b50601f01601f1916929092016040019392505050565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526032908201527f556e61626c6520746f20736574207468726573686f6c642061626f766520746860408201527165206e756d626572206f66206f776e65727360701b606082015260800190565b60208082526018908201527f4d75737420616c77617973206265206f6e65206f776e65720000000000000000604082015260600190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601f908201527f6f6c644f70657261746f72206973206e6f7420616e204f70657261746f722e00604082015260600190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526018908201527f6e65774f776e657220616c7265616479206578697374732e0000000000000000604082015260600190565b60208082526019908201527f6f6c644f776e6572206973206e6f7420616e206f776e65722e00000000000000604082015260600190565b6020808252601c908201527f536d61727420436f6e7472616374206973206e6f742070617573656400000000604082015260600190565b6020808252601b908201527f6e65774f70657261746f7220616c7265616479206578697374732e0000000000604082015260600190565b60208082526016908201527537bbb732b91034b9903737ba1030b71037bbb732b91760511b604082015260600190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526024908201527f4f6e6c7920616e206f776e65722063616e2072756e20746869732066756e637460408201526334b7b71760e11b606082015260800190565b60208082526018908201527f536d61727420436f6e7472616374206973207061757365640000000000000000604082015260600190565b6020808252600f908201526e496e7661696c64204164647265737360881b604082015260600190565b6020808252601c908201527f6f70657261746f72206973206e6f7420616e204f70657261746f722e00000000604082015260600190565b60208082526037908201527f43616e6e6f7420636f6d706c65746520746f6b656e207472616e73666572207760408201527f68696c6520436f6e747261637420697320506175736564000000000000000000606082015260800190565b6020808252601d908201527f5265736f6c7574696f6e20697320616c726561647920696e207573652e000000604082015260600190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b90815260200190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156125f4576125f46126bb565b604052919050565b600067ffffffffffffffff821115612616576126166126bb565b5060209081020190565b60008219821115612633576126336126a5565b500190565b60008282101561264a5761264a6126a5565b500390565b60028104600182168061266357607f821691505b6020821081141561268457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561269e5761269e6126a5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461055257600080fdfea264697066735822122020f35fd5fde27c8601d5cc74fdfb18d78ca5df70c12ae5217331d9dad11207bf64736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061025d5760003560e01c80637ad8ed1e11610146578063a9059cbb116100c3578063c3743cff11610087578063c3743cff146104dd578063ccc19752146104e5578063dd62ed3e146104ed578063dee80c0f14610500578063f1376a9814610508578063f19605d61461051b5761025d565b8063a9059cbb14610494578063b85e5b74146104a7578063b8d95d7e146104af578063baa98fbd146104c2578063c0d795de146104ca5761025d565b806390e4ed591161010a57806390e4ed591461044657806395d89b411461044e578063a0e67e2b14610456578063a457c2d71461045e578063a4b7f5ce146104715761025d565b80637ad8ed1e146103fd5780638456cb591461041057806384be5ea91461041857806385a1a60b1461042b57806388d695b2146104335761025d565b806326eb2735116101df5780633a008949116101a35780633a0089491461039f5780635c975abb146103a75780635e7d907f146103af578063654079ba146103c45780636cc8bcff146103d757806370a08231146103ea5761025d565b806326eb27351461033c57806327a099d81461034f5780632e33e1e314610364578063313ce56714610377578063395093511461038c5761025d565b806312c290cb1161022657806312c290cb146102e857806312c44515146102fb57806318160ddd1461030e578063203365661461031657806323b872dd146103295761025d565b80623f07fa14610262578063037af12c14610277578063053a04f1146102a057806306fdde03146102c0578063095ea7b3146102d5575b600080fd5b610275610270366004611da1565b610523565b005b61028a610285366004611da1565b610555565b60405161029791906125bb565b60405180910390f35b6102b36102ae366004611f20565b610574565b6040516102979190611fb3565b6102c8610589565b604051610297919061200a565b6102b36102e3366004611e35565b61061b565b6102756102f6366004611da1565b610639565b610275610309366004611da1565b6106ac565b61028a6106ee565b610275610324366004611dbd565b6106f4565b6102b3610337366004611df5565b61079a565b61027561034a366004611da1565b610831565b6103576108cd565b6040516102979190611f66565b610275610372366004611da1565b610999565b61037f610a0c565b60405161029791906125c4565b6102b361039a366004611e35565b610a11565b61028a610a60565b6102b3610a66565b6103b7610a6f565b6040516102979190611f38565b6102b36103d2366004611e35565b610a7e565b6102756103e5366004611f20565b610a9e565b61028a6103f8366004611da1565b610aff565b61027561040b366004611da1565b610b1a565b610275610b5c565b610275610426366004611dbd565b610b9b565b61037f610c3d565b6102b3610441366004611e60565b610c4e565b6103b7610cd0565b6102c8610cdf565b610357610cee565b6102b361046c366004611e35565b610db3565b61048461047f366004611f20565b610e24565b6040516102979493929190611fbe565b6102b36104a2366004611e35565b610e5f565b61037f610e73565b6102756104bd366004611da1565b610e7f565b610275610ee8565b6102b36104d8366004611f20565b610f2a565b61028a610fbd565b61028a610fc3565b61028a6104fb366004611dbd565b610fc9565b6103b7610ff4565b6102b3610516366004611f20565b611003565b61028a61109c565b6001600160a01b0381166105525760405162461bcd60e51b815260040161054990612482565b60405180910390fd5b50565b6001600160a01b0381166000908152600a60205260409020545b919050565b6000908152600b602052604090205460ff1690565b6060600f80546105989061264f565b80601f01602080910402602001604051908101604052809291908181526020018280546105c49061264f565b80156106115780601f106105e657610100808354040283529160200191610611565b820191906000526020600020905b8154815290600101906020018083116105f457829003601f168201915b5050505050905090565b600061062f6106286110c3565b84846110c7565b5060015b92915050565b61064233610523565b61064d60003361117b565b151560011461066e5760405162461bcd60e51b815260040161054990612407565b61067781610523565b61068260038261117b565b1561069f5760405162461bcd60e51b8152600401610549906122cf565b6105526004600083611190565b6106b533610523565b6106c060003361117b565b15156001146106e15760405162461bcd60e51b815260040161054990612407565b6105526007600083611190565b600e5490565b6106fd33610523565b61070860003361117b565b15156001146107295760405162461bcd60e51b815260040161054990612407565b61073282610523565b61073b81610523565b61074660038361117b565b6107625760405162461bcd60e51b8152600401610549906121ad565b61076d60038261117b565b1561078a5760405162461bcd60e51b8152600401610549906122cf565b61079660068383611190565b5050565b60006107a7848484611285565b6001600160a01b0384166000908152600d60205260408120816107c86110c3565b6001600160a01b03166001600160a01b031681526020019081526020016000205490508281101561080b5760405162461bcd60e51b815260040161054990612336565b610826856108176110c3565b6108218685612638565b6110c7565b506001949350505050565b61083a33610523565b61084560003361117b565b15156001146108665760405162461bcd60e51b815260040161054990612407565b61086f81610523565b6001610879610e73565b60ff16116108995760405162461bcd60e51b815260040161054990612134565b6108a460008261117b565b6108c05760405162461bcd60e51b815260040161054990612306565b6105526002826000611190565b606060006108db60036113ad565b905060008167ffffffffffffffff81111561090657634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561092f578160200160208202803683370190505b50905060005b82811015610992576109486003826113b8565b82828151811061096857634e487b7160e01b600052603260045260246000fd5b6001600160a01b03909216602092830291909101909101528061098a8161268a565b915050610935565b5091505090565b6109a233610523565b6109ad60003361117b565b15156001146109ce5760405162461bcd60e51b815260040161054990612407565b6109d781610523565b6109e260008261117b565b156109ff5760405162461bcd60e51b81526004016105499061222a565b6105526001600083611190565b601290565b600061062f610a1e6110c3565b8484600d6000610a2c6110c3565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546108219190612620565b60095490565b60025460ff1690565b6006546001600160a01b031690565b600860209081526000928352604080842090915290825290205460ff1681565b6000818152600b60205260409020546201000090046001600160a01b0316151580610ae257506000818152600b60205260409020600101546001600160a01b031615155b156105525760405162461bcd60e51b81526004016105499061253f565b6001600160a01b03166000908152600c602052604090205490565b610b2333610523565b610b2e60003361117b565b1515600114610b4f5760405162461bcd60e51b815260040161054990612407565b6105526008600083611190565b610b6533610523565b610b7060003361117b565b1515600114610b915760405162461bcd60e51b815260040161054990612407565b610b996113c4565b565b610ba433610523565b610baf60003361117b565b1515600114610bd05760405162461bcd60e51b815260040161054990612407565b610bd982610523565b610be281610523565b610bed60008361117b565b610c095760405162461bcd60e51b815260040161054990612261565b610c1460008261117b565b15610c315760405162461bcd60e51b81526004016105499061222a565b61079660038383611190565b6000610c4960036113ad565b905090565b6000805b8251811015610cc657610cb3848281518110610c7e57634e487b7160e01b600052603260045260246000fd5b6020026020010151848381518110610ca657634e487b7160e01b600052603260045260246000fd5b6020026020010151610e5f565b5080610cbe8161268a565b915050610c52565b5060019392505050565b6005546001600160a01b031681565b6060601080546105989061264f565b60606000610cfc60006113ad565b905060008167ffffffffffffffff811115610d2757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610d50578160200160208202803683370190505b50905060005b8281101561099257610d696000826113b8565b828281518110610d8957634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091019091015280610dab8161268a565b915050610d56565b600080600d6000610dc26110c3565b6001600160a01b0390811682526020808301939093526040918201600090812091881681529252902054905082811015610e0e5760405162461bcd60e51b815260040161054990612576565b610cc6610e196110c3565b856108218685612638565b600b602052600090815260409020805460019091015460ff808316926101008104909116916001600160a01b03620100009092048216911684565b600061062f610e6c6110c3565b8484611285565b6000610c4960006113ad565b610e8833610523565b610e9360003361117b565b1515600114610eb45760405162461bcd60e51b815260040161054990612407565b610ebf60038261117b565b610edb5760405162461bcd60e51b8152600401610549906124ab565b6105526005826000611190565b610ef133610523565b610efc60003361117b565b1515600114610f1d5760405162461bcd60e51b815260040161054990612407565b610b99600a600180611190565b60008080610f37816113ad565b905060005b81811015610fa75760086000610f536000846113b8565b6001600160a01b031681526020808201929092526040908101600090812088825290925290205460ff16151560011415610f955782610f918161268a565b9350505b80610f9f8161268a565b915050610f3c565b50506006546001600160a01b0316111592915050565b60075490565b60095481565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b6006546001600160a01b031681565b600061100e33610523565b61101960003361117b565b151560011461103a5760405162461bcd60e51b815260040161054990612407565b3360009081526008602090815260408083208584529091529020805460ff1916600117905561106882610574565b156110755750600161056f565b61107e82610f2a565b156110945761108c8261142e565b50600161056f565b506000919050565b60075481565b60006110b7836001600160a01b038416611820565b9392505050565b505050565b3390565b6001600160a01b0383166110ed5760405162461bcd60e51b8152600401610549906123c3565b6001600160a01b0382166111135760405162461bcd60e51b81526004016105499061216b565b6001600160a01b038084166000818152600d602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061116e9085906125bb565b60405180910390a3505050565b60006110b7836001600160a01b03841661186a565b6009805490819060006111a28361268a565b91905055506111b081610a9e565b6000818152600b602081905260409091208054869261ff0019909116906101009084908111156111f057634e487b7160e01b600052602160045260246000fd5b02179055506000818152600b60209081526040808320805462010000600160b01b031916620100006001600160a01b0389811691909102919091178255600191820180546001600160a01b03191688831617905533808652600885528386208787528552838620805460ff1916841790558552600a9093529220839055600654161161127f5761127f8161142e565b50505050565b6001600160a01b0383166112ab5760405162461bcd60e51b81526004016105499061237e565b6001600160a01b0382166112d15760405162461bcd60e51b81526004016105499061209f565b6112dc838383611882565b6001600160a01b0383166000908152600c6020526040902054818110156113155760405162461bcd60e51b8152600401610549906121e4565b61131f8282612638565b6001600160a01b038086166000908152600c60205260408082209390935590851681529081208054849290611355908490612620565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161139f91906125bb565b60405180910390a350505050565b6000610633826118b2565b60006110b783836118b6565b60025460ff16156113e75760405162461bcd60e51b81526004016105499061244b565b6002805460ff191660011790556040517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890611424903390611f38565b60405180910390a1565b60016000828152600b6020819052604090912054610100900460ff169081111561146857634e487b7160e01b600052602160045260246000fd5b1415611497576000818152600b6020526040902060010154611492906001600160a01b031661190f565b611805565b60026000828152600b6020819052604090912054610100900460ff16908111156114d157634e487b7160e01b600052602160045260246000fd5b14156114fe576000818152600b6020526040902054611492906201000090046001600160a01b0316611955565b60036000828152600b6020819052604090912054610100900460ff169081111561153857634e487b7160e01b600052602160045260246000fd5b1415611570576000818152600b602052604090208054600190910154611492916001600160a01b0362010000909104811691166119c9565b60046000828152600b6020819052604090912054610100900460ff16908111156115aa57634e487b7160e01b600052602160045260246000fd5b14156115d4576000818152600b6020526040902060010154611492906001600160a01b0316611a1e565b60056000828152600b6020819052604090912054610100900460ff169081111561160e57634e487b7160e01b600052602160045260246000fd5b141561163b576000818152600b6020526040902054611492906201000090046001600160a01b0316611a59565b60066000828152600b6020819052604090912054610100900460ff169081111561167557634e487b7160e01b600052602160045260246000fd5b14156116ad576000818152600b602052604090208054600190910154611492916001600160a01b036201000090910481169116611a94565b60086000828152600b6020819052604090912054610100900460ff16908111156116e757634e487b7160e01b600052602160045260246000fd5b1415611711576000818152600b6020526040902060010154611492906001600160a01b0316611ae4565b60076000828152600b6020819052604090912054610100900460ff169081111561174b57634e487b7160e01b600052602160045260246000fd5b1415611775576000818152600b6020526040902060010154611492906001600160a01b0316611b20565b60096000828152600b6020819052604090912054610100900460ff16908111156117af57634e487b7160e01b600052602160045260246000fd5b14156117bd576114926113c4565b600a6000828152600b6020819052604090912054610100900460ff16908111156117f757634e487b7160e01b600052602160045260246000fd5b141561180557611805611bac565b6000908152600b60205260409020805460ff19166001179055565b600061182c838361186a565b61186257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610633565b506000610633565b60009081526001919091016020526040902054151590565b61188d8383836110be565b611895610a66565b156110be5760405162461bcd60e51b8152600401610549906124e2565b5490565b815460009082106118d95760405162461bcd60e51b81526004016105499061205d565b8260000182815481106118fc57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b61191a6000826110a2565b507ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d8160405161194a9190611f38565b60405180910390a150565b611960600082611c08565b507f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b90816040516119909190611f38565b60405180910390a160006119a2610e73565b60065490915060ff82166001600160a01b039091161115610796576107968160ff16611b20565b6119d4600083611c08565b506119e06000826110a2565b507f1b82188083c6040dda91df3d142280a20fa00e5a433eb921fdbf2e4ad1db45e58282604051611a12929190611f4c565b60405180910390a15050565b611a296003826110a2565b507fe96a56aa17dd8ae64ac3a51347e8e8a03d52f1cb2acdf8ed49b20d55662ebecc8160405161194a9190611f38565b611a64600382611c08565b507f108286147377add4f5f7bcdd7b6104dc6bdac3443e499142a612d418aa0be1548160405161194a9190611f38565b7f409833df5b08419a3bd86d34683f91767845e813a29d30d8a4338fba95158d8a8282604051611ac5929190611f4c565b60405180910390a1611ad8600383611c08565b506110be6003826110a2565b7f5ba74490711ccc5e81b24b40b8c5d2bd282981e4bc080dd8789bb10c1dfc2ea981604051611b1391906125bb565b60405180910390a1600755565b611b28610e73565b60ff16816001600160a01b03161115611b535760405162461bcd60e51b8152600401610549906120e2565b7f52ca658c4a059b2955bf70b065638aaa67f124556851d788a113d7c213f9ac9881604051611b829190611f38565b60405180910390a1600680546001600160a01b0319166001600160a01b0392909216919091179055565b60025460ff16611bce5760405162461bcd60e51b815260040161054990612298565b6002805460ff191690556040517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90611424903390611f38565b60006110b7836001600160a01b03841660008181526001830160205260408120548015611d2b576000611c3c600183612638565b8554909150600090611c5090600190612638565b90506000866000018281548110611c7757634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110611ca857634e487b7160e01b600052603260045260246000fd5b600091825260209091200155611cbf836001612620565b60008281526001890160205260409020558654879080611cef57634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610633565b6000915050610633565b600082601f830112611d45578081fd5b81356020611d5a611d55836125fc565b6125d2565b8281528181019085830183850287018401881015611d76578586fd5b855b85811015611d9457813584529284019290840190600101611d78565b5090979650505050505050565b600060208284031215611db2578081fd5b81356110b7816126d1565b60008060408385031215611dcf578081fd5b8235611dda816126d1565b91506020830135611dea816126d1565b809150509250929050565b600080600060608486031215611e09578081fd5b8335611e14816126d1565b92506020840135611e24816126d1565b929592945050506040919091013590565b60008060408385031215611e47578182fd5b8235611e52816126d1565b946020939093013593505050565b60008060408385031215611e72578182fd5b823567ffffffffffffffff80821115611e89578384fd5b818501915085601f830112611e9c578384fd5b81356020611eac611d55836125fc565b82815281810190858301838502870184018b1015611ec8578889fd5b8896505b84871015611ef3578035611edf816126d1565b835260019690960195918301918301611ecc565b5096505086013592505080821115611f09578283fd5b50611f1685828601611d35565b9150509250929050565b600060208284031215611f31578081fd5b5035919050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015611fa75783516001600160a01b031683529284019291840191600101611f82565b50909695505050505050565b901515815260200190565b841515815260808101600c8510611fe557634e487b7160e01b600052602160045260246000fd5b60208201949094526001600160a01b0392831660408201529116606090910152919050565b6000602080835283518082850152825b818110156120365785810183015185820160400152820161201a565b818111156120475783604083870101525b50601f01601f1916929092016040019392505050565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526032908201527f556e61626c6520746f20736574207468726573686f6c642061626f766520746860408201527165206e756d626572206f66206f776e65727360701b606082015260800190565b60208082526018908201527f4d75737420616c77617973206265206f6e65206f776e65720000000000000000604082015260600190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601f908201527f6f6c644f70657261746f72206973206e6f7420616e204f70657261746f722e00604082015260600190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526018908201527f6e65774f776e657220616c7265616479206578697374732e0000000000000000604082015260600190565b60208082526019908201527f6f6c644f776e6572206973206e6f7420616e206f776e65722e00000000000000604082015260600190565b6020808252601c908201527f536d61727420436f6e7472616374206973206e6f742070617573656400000000604082015260600190565b6020808252601b908201527f6e65774f70657261746f7220616c7265616479206578697374732e0000000000604082015260600190565b60208082526016908201527537bbb732b91034b9903737ba1030b71037bbb732b91760511b604082015260600190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526024908201527f4f6e6c7920616e206f776e65722063616e2072756e20746869732066756e637460408201526334b7b71760e11b606082015260800190565b60208082526018908201527f536d61727420436f6e7472616374206973207061757365640000000000000000604082015260600190565b6020808252600f908201526e496e7661696c64204164647265737360881b604082015260600190565b6020808252601c908201527f6f70657261746f72206973206e6f7420616e204f70657261746f722e00000000604082015260600190565b60208082526037908201527f43616e6e6f7420636f6d706c65746520746f6b656e207472616e73666572207760408201527f68696c6520436f6e747261637420697320506175736564000000000000000000606082015260800190565b6020808252601d908201527f5265736f6c7574696f6e20697320616c726561647920696e207573652e000000604082015260600190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b90815260200190565b60ff91909116815260200190565b60405181810167ffffffffffffffff811182821017156125f4576125f46126bb565b604052919050565b600067ffffffffffffffff821115612616576126166126bb565b5060209081020190565b60008219821115612633576126336126a5565b500190565b60008282101561264a5761264a6126a5565b500390565b60028104600182168061266357607f821691505b6020821081141561268457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561269e5761269e6126a5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461055257600080fdfea264697066735822122020f35fd5fde27c8601d5cc74fdfb18d78ca5df70c12ae5217331d9dad11207bf64736f6c63430008000033

Deployed Bytecode Sourcemap

43792:968:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27669:121;;;;;;:::i;:::-;;:::i;:::-;;31988:141;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32728:123;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5814:91::-;;;:::i;:::-;;;;;;;:::i;7954:169::-;;;;;;:::i;:::-;;:::i;35739:304::-;;;;;;:::i;:::-;;:::i;37491:202::-;;;;;;:::i;:::-;;:::i;6907:108::-;;;:::i;36537:496::-;;;;;;:::i;:::-;;:::i;8605:422::-;;;;;;:::i;:::-;;:::i;34728:342::-;;;;;;:::i;:::-;;:::i;30666:310::-;;;:::i;:::-;;;;;;;:::i;34248:280::-;;;;;;:::i;:::-;;:::i;6758:84::-;;;:::i;:::-;;;;;;;:::i;9436:215::-;;;;;;:::i;:::-;;:::i;31768:105::-;;;:::i;32212:78::-;;;:::i;31316:107::-;;;:::i;:::-;;;;;;;:::i;26404:62::-;;;;;;:::i;:::-;;:::i;32376:344::-;;;;;;:::i;:::-;;:::i;7078:127::-;;;;;;:::i;:::-;;:::i;37151:214::-;;;;;;:::i;:::-;;:::i;37769:64::-;;;:::i;35181:451::-;;;;;;:::i;:::-;;:::i;31069:125::-;;;:::i;44255:243::-;;;;;;:::i;:::-;;:::i;26067:32::-;;;:::i;6024:95::-;;;:::i;30071:301::-;;;:::i;10154:377::-;;;;;;:::i;:::-;;:::i;26649:49::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;7418:175::-;;;;;;:::i;:::-;;:::i;30459:119::-;;;:::i;36153:261::-;;;;;;:::i;:::-;;:::i;37943:138::-;;;:::i;32859:400::-;;;;;;:::i;:::-;;:::i;31550:103::-;;;:::i;26518:33::-;;;:::i;7656:151::-;;;;;;:::i;:::-;;:::i;26168:42::-;;;:::i;33611:533::-;;;;;;:::i;:::-;;:::i;26304:35::-;;;:::i;27669:121::-;-1:-1:-1;;;;;27741:21:0;;27733:49;;;;-1:-1:-1;;;27733:49:0;;;;;;;:::i;:::-;;;;;;;;;27669:121;:::o;31988:141::-;-1:-1:-1;;;;;32089:32:0;;32062:7;32089:32;;;:25;:32;;;;;;31988:141;;;;:::o;32728:123::-;32793:4;32817:19;;;:11;:19;;;;;:26;;;;32728:123::o;5814:91::-;5859:13;5892:5;5885:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5814:91;:::o;7954:169::-;8037:4;8054:39;8063:12;:10;:12::i;:::-;8077:7;8086:6;8054:8;:39::i;:::-;-1:-1:-1;8111:4:0;7954:169;;;;;:::o;35739:304::-;28074:26;28089:10;28074:14;:26::i;:::-;28133:43;28156:7;28165:10;28133:22;:43::i;:::-;:51;;28180:4;28133:51;28111:137;;;;-1:-1:-1;;;28111:137:0;;;;;;;:::i;:::-;35828:27:::1;35843:11;35828:14;:27::i;:::-;35875:47;35898:10;35910:11;35875:22;:47::i;:::-;35874:48;35866:87;;;;-1:-1:-1::0;;;35866:87:0::1;;;;;;;:::i;:::-;35966:69;35983:26;36019:1;36023:11;35966:16;:69::i;37491:202::-:0;28074:26;28089:10;28074:14;:26::i;:::-;28133:43;28156:7;28165:10;28133:22;:43::i;:::-;:51;;28180:4;28133:51;28111:137;;;;-1:-1:-1;;;28111:137:0;;;;;;;:::i;:::-;37605:80:::1;37622:30;37662:1;37674:9;37605:16;:80::i;6907:108::-:0;6995:12;;6907:108;:::o;36537:496::-;28074:26;28089:10;28074:14;:26::i;:::-;28133:43;28156:7;28165:10;28133:22;:43::i;:::-;:51;;28180:4;28133:51;28111:137;;;;-1:-1:-1;;;28111:137:0;;;;;;;:::i;:::-;36674:27:::1;36689:11;36674:14;:27::i;:::-;36712;36727:11;36712:14;:27::i;:::-;36758:47;36781:10;36793:11;36758:22;:47::i;:::-;36750:90;;;;-1:-1:-1::0;;;36750:90:0::1;;;;;;;:::i;:::-;36860:47;36883:10;36895:11;36860:22;:47::i;:::-;36859:48;36851:87;;;;-1:-1:-1::0;;;36851:87:0::1;;;;;;;:::i;:::-;36951:74;36968:30;37000:11;37013;36951:16;:74::i;:::-;36537:496:::0;;:::o;8605:422::-;8711:4;8728:36;8738:6;8746:9;8757:6;8728:9;:36::i;:::-;-1:-1:-1;;;;;8804:19:0;;8777:24;8804:19;;;:11;:19;;;;;8777:24;8824:12;:10;:12::i;:::-;-1:-1:-1;;;;;8804:33:0;-1:-1:-1;;;;;8804:33:0;;;;;;;;;;;;;8777:60;;8876:6;8856:16;:26;;8848:79;;;;-1:-1:-1;;;8848:79:0;;;;;;;:::i;:::-;8938:57;8947:6;8955:12;:10;:12::i;:::-;8969:25;8988:6;8969:16;:25;:::i;:::-;8938:8;:57::i;:::-;-1:-1:-1;9015:4:0;;8605:422;-1:-1:-1;;;;8605:422:0:o;34728:342::-;28074:26;28089:10;28074:14;:26::i;:::-;28133:43;28156:7;28165:10;28133:22;:43::i;:::-;:51;;28180:4;28133:51;28111:137;;;;-1:-1:-1;;;28111:137:0;;;;;;;:::i;:::-;34811:21:::1;34826:5;34811:14;:21::i;:::-;34873:1;34851:19;:17;:19::i;:::-;:23;;;34843:60;;;;-1:-1:-1::0;;;34843:60:0::1;;;;;;;:::i;:::-;34922:38;34945:7;34954:5;34922:22;:38::i;:::-;34914:72;;;;-1:-1:-1::0;;;34914:72:0::1;;;;;;;:::i;:::-;34999:63;35016:26;35044:5;35059:1;34999:16;:63::i;30666:310::-:0;30711:16;30740:11;30754:32;30775:10;30754:20;:32::i;:::-;30740:46;;30797:18;30832:3;30818:18;;;;;;-1:-1:-1;;;30818:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30818:18:0;;30797:39;;30854:9;30849:99;30873:3;30869:1;:7;30849:99;;;30905:31;30922:10;30934:1;30905:16;:31::i;:::-;30898:1;30900;30898:4;;;;;;-1:-1:-1;;;30898:4:0;;;;;;;;;-1:-1:-1;;;;;30898:38:0;;;:4;;;;;;;;;;;:38;30878:3;;;;:::i;:::-;;;;30849:99;;;-1:-1:-1;30967:1:0;-1:-1:-1;;30666:310:0;:::o;34248:280::-;28074:26;28089:10;28074:14;:26::i;:::-;28133:43;28156:7;28165:10;28133:22;:43::i;:::-;:51;;28180:4;28133:51;28111:137;;;;-1:-1:-1;;;28111:137:0;;;;;;;:::i;:::-;34331:24:::1;34346:8;34331:14;:24::i;:::-;34375:41;34398:7;34407:8;34375:22;:41::i;:::-;34374:42;34366:78;;;;-1:-1:-1::0;;;34366:78:0::1;;;;;;;:::i;:::-;34457:63;34474:23;34507:1;34511:8;34457:16;:63::i;6758:84::-:0;6832:2;6758:84;:::o;9436:215::-;9524:4;9541:80;9550:12;:10;:12::i;:::-;9564:7;9610:10;9573:11;:25;9585:12;:10;:12::i;:::-;-1:-1:-1;;;;;9573:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;9573:25:0;;;:34;;;;;;;;;;:47;;;;:::i;31768:105::-;31851:14;;31768:105;:::o;32212:78::-;32275:7;;;;32212:78;:::o;31316:107::-;31392:23;;-1:-1:-1;;;;;31392:23:0;31316:107;:::o;26404:62::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32376:344::-;32587:1;32545:19;;;:11;:19;;;;;:30;;;;-1:-1:-1;;;;;32545:30:0;:44;;;:109;;-1:-1:-1;32652:1:0;32610:19;;;:11;:19;;;;;:30;;;-1:-1:-1;;;;;32610:30:0;:44;;32545:109;32543:112;32446:266;;;;-1:-1:-1;;;32446:266:0;;;;;;;:::i;7078:127::-;-1:-1:-1;;;;;7179:18:0;7152:7;7179:18;;;:9;:18;;;;;;;7078:127::o;37151:214::-;28074:26;28089:10;28074:14;:26::i;:::-;28133:43;28156:7;28165:10;28133:22;:43::i;:::-;:51;;28180:4;28133:51;28111:137;;;;-1:-1:-1;;;28111:137:0;;;;;;;:::i;:::-;37271:86:::1;37288:37;37335:1;37347:8;37271:16;:86::i;37769:64::-:0;28074:26;28089:10;28074:14;:26::i;:::-;28133:43;28156:7;28165:10;28133:22;:43::i;:::-;:51;;28180:4;28133:51;28111:137;;;;-1:-1:-1;;;28111:137:0;;;;;;;:::i;:::-;37817:8:::1;:6;:8::i;:::-;37769:64::o:0;35181:451::-;28074:26;28089:10;28074:14;:26::i;:::-;28133:43;28156:7;28165:10;28133:22;:43::i;:::-;:51;;28180:4;28133:51;28111:137;;;;-1:-1:-1;;;28111:137:0;;;;;;;:::i;:::-;35309:24:::1;35324:8;35309:14;:24::i;:::-;35344;35359:8;35344:14;:24::i;:::-;35387:41;35410:7;35419:8;35387:22;:41::i;:::-;35379:78;;;;-1:-1:-1::0;;;35379:78:0::1;;;;;;;:::i;:::-;35477:41;35500:7;35509:8;35477:22;:41::i;:::-;35476:42;35468:78;;;;-1:-1:-1::0;;;35468:78:0::1;;;;;;;:::i;:::-;35559:65;35576:27;35605:8;35615;35559:16;:65::i;31069:125::-:0;31122:5;31153:32;31174:10;31153:20;:32::i;:::-;31140:46;;31069:125;:::o;44255:243::-;44349:4;;44366:103;44386:7;:14;44383:1;:17;44366:103;;;44422:35;44431:10;44442:1;44431:13;;;;;;-1:-1:-1;;;44431:13:0;;;;;;;;;;;;;;;44446:7;44454:1;44446:10;;;;;;-1:-1:-1;;;44446:10:0;;;;;;;;;;;;;;;44422:8;:35::i;:::-;-1:-1:-1;44402:3:0;;;;:::i;:::-;;;;44366:103;;;-1:-1:-1;44486:4:0;;44255:243;-1:-1:-1;;;44255:243:0:o;26067:32::-;;;-1:-1:-1;;;;;26067:32:0;;:::o;6024:95::-;6071:13;6104:7;6097:14;;;;;:::i;30071:301::-;30113:16;30142:11;30156:29;30177:7;30156:20;:29::i;:::-;30142:43;;30196:18;30231:3;30217:18;;;;;;-1:-1:-1;;;30217:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30217:18:0;;30196:39;;30253:9;30248:96;30272:3;30268:1;:7;30248:96;;;30304:28;30321:7;30330:1;30304:16;:28::i;:::-;30297:1;30299;30297:4;;;;;;-1:-1:-1;;;30297:4:0;;;;;;;;;-1:-1:-1;;;;;30297:35:0;;;:4;;;;;;;;;;;:35;30277:3;;;;:::i;:::-;;;;30248:96;;10154:377;10247:4;10264:24;10291:11;:25;10303:12;:10;:12::i;:::-;-1:-1:-1;;;;;10291:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;10291:25:0;;;:34;;;;;;;;;;;-1:-1:-1;10344:35:0;;;;10336:85;;;;-1:-1:-1;;;10336:85:0;;;;;;;:::i;:::-;10432:67;10441:12;:10;:12::i;:::-;10455:7;10464:34;10483:15;10464:16;:34;:::i;26649:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26649:49:0;;;;;;;;;:::o;7418:175::-;7504:4;7521:42;7531:12;:10;:12::i;:::-;7545:9;7556:6;7521:9;:42::i;30459:119::-;30509:5;30540:29;30561:7;30540:20;:29::i;36153:261::-;28074:26;28089:10;28074:14;:26::i;:::-;28133:43;28156:7;28165:10;28133:22;:43::i;:::-;:51;;28180:4;28133:51;28111:137;;;;-1:-1:-1;;;28111:137:0;;;;;;;:::i;:::-;36250:44:::1;36273:10;36285:8;36250:22;:44::i;:::-;36242:84;;;;-1:-1:-1::0;;;36242:84:0::1;;;;;;;:::i;:::-;36337:69;36354:29;36385:8;36403:1;36337:16;:69::i;37943:138::-:0;28074:26;28089:10;28074:14;:26::i;:::-;28133:43;28156:7;28165:10;28133:22;:43::i;:::-;:51;;28180:4;28133:51;28111:137;;;;-1:-1:-1;;;28111:137:0;;;;;;;:::i;:::-;38009:64:::1;38026:22;38058:1;38070::::0;38009:16:::1;:64::i;32859:400::-:0;32923:4;;;32986:29;32923:4;32986:20;:29::i;:::-;32972:43;;33033:9;33028:168;33052:3;33048:1;:7;33028:168;;;33081:10;:40;33092:28;33109:7;33118:1;33092:16;:28::i;:::-;-1:-1:-1;;;;;33081:40:0;;;;;;;;;;;;;;;-1:-1:-1;33081:40:0;;;:48;;;;;;;;;;;:56;;:48;:56;33077:108;;;33158:11;;;;:::i;:::-;;;;33077:108;33057:3;;;;:::i;:::-;;;;33028:168;;;-1:-1:-1;;33228:23:0;;-1:-1:-1;;;;;33228:23:0;-1:-1:-1;33215:36:0;;32859:400;-1:-1:-1;;32859:400:0:o;31550:103::-;31629:16;;31550:103;:::o;26518:33::-;;;;:::o;7656:151::-;-1:-1:-1;;;;;7772:18:0;;;7745:7;7772:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;7656:151::o;26168:42::-;;;-1:-1:-1;;;;;26168:42:0;;:::o;33611:533::-;33680:4;28074:26;28089:10;28074:14;:26::i;:::-;28133:43;28156:7;28165:10;28133:22;:43::i;:::-;:51;;28180:4;28133:51;28111:137;;;;-1:-1:-1;;;28111:137:0;;;;;;;:::i;:::-;33708:10:::1;33697:22;::::0;;;:10:::1;:22;::::0;;;;;;;:30;;;;;;;;:37;;-1:-1:-1;;33697:37:0::1;33730:4;33697:37;::::0;;33816:26:::1;33720:6:::0;33816:18:::1;:26::i;:::-;33812:70;;;-1:-1:-1::0;33866:4:0::1;33859:11;;33812:70;33958:25;33976:6;33958:17;:25::i;:::-;33954:110;;;34000:26;34019:6;34000:18;:26::i;:::-;-1:-1:-1::0;34048:4:0::1;34041:11;;33954:110;-1:-1:-1::0;34131:5:0::1;33611:533:::0;;;:::o;26304:35::-;;;;:::o;21212:152::-;21282:4;21306:50;21311:3;-1:-1:-1;;;;;21331:23:0;;21306:4;:50::i;:::-;21299:57;21212:152;-1:-1:-1;;;21212:152:0:o;14459:92::-;;;;:::o;3419:98::-;3499:10;3419:98;:::o;13510:346::-;-1:-1:-1;;;;;13612:19:0;;13604:68;;;;-1:-1:-1;;;13604:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13691:21:0;;13683:68;;;;-1:-1:-1;;;13683:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13764:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;13816:32;;;;;13794:6;;13816:32;:::i;:::-;;;;;;;;13510:346;;;:::o;21784:167::-;21864:4;21888:55;21898:3;-1:-1:-1;;;;;21918:23:0;;21888:9;:55::i;38333:630::-;38460:14;;;;;;38443;38485:16;38460:14;38485:16;:::i;:::-;;;;;;38512:29;38534:6;38512:21;:29::i;:::-;38554:19;;;;:11;:19;;;;;;;;:37;;38584:7;;-1:-1:-1;;38554:37:0;;;;;;38584:7;;38554:37;;;;;-1:-1:-1;;;38554:37:0;;;;;;;;;;;;;-1:-1:-1;38602:19:0;;;;:11;:19;;;;;;;;:43;;-1:-1:-1;;;;;;38602:43:0;;-1:-1:-1;;;;;38602:43:0;;;;;;;;;;;;;-1:-1:-1;38656:30:0;;;:43;;-1:-1:-1;;;;;;38656:43:0;;;;;;;38723:10;38712:22;;;:10;:22;;;;;:30;;;;;;;;:37;;-1:-1:-1;;38712:37:0;;;;;38760;;:25;:37;;;;;:46;;;38873:23;;;:28;38869:87;;38918:26;38937:6;38918:18;:26::i;:::-;38333:630;;;;:::o;11021:604::-;-1:-1:-1;;;;;11127:20:0;;11119:70;;;;-1:-1:-1;;;11119:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11208:23:0;;11200:71;;;;-1:-1:-1;;;11200:71:0;;;;;;;:::i;:::-;11284:47;11305:6;11313:9;11324:6;11284:20;:47::i;:::-;-1:-1:-1;;;;;11368:17:0;;11344:21;11368:17;;;:9;:17;;;;;;11404:23;;;;11396:74;;;;-1:-1:-1;;;11396:74:0;;;;;;;:::i;:::-;11501:22;11517:6;11501:13;:22;:::i;:::-;-1:-1:-1;;;;;11481:17:0;;;;;;;:9;:17;;;;;;:42;;;;11534:20;;;;;;;;:30;;11558:6;;11481:17;11534:30;;11558:6;;11534:30;:::i;:::-;;;;;;;;11599:9;-1:-1:-1;;;;;11582:35:0;11591:6;-1:-1:-1;;;;;11582:35:0;;11610:6;11582:35;;;;;;:::i;:::-;;;;;;;;11021:604;;;;:::o;22037:117::-;22100:7;22127:19;22135:3;22127:7;:19::i;22498:158::-;22572:7;22623:22;22627:3;22639:5;22623:3;:22::i;43278:116::-;29008:7;;;;29007:8;28999:45;;;;-1:-1:-1;;;28999:45:0;;;;;;;:::i;:::-;43338:7:::1;:14:::0;;-1:-1:-1;;43338:14:0::1;43348:4;43338:14;::::0;;43368:18:::1;::::0;::::1;::::0;::::1;::::0;43375:10:::1;::::0;43368:18:::1;:::i;:::-;;;;;;;;43278:116::o:0;39092:1769::-;39191:23;39160:19;;;;:11;:19;;;;;;;;:27;;;;;;;:54;;;;;-1:-1:-1;;;39160:54:0;;;;;;;;;;39156:1652;;;39241:19;;;;:11;:19;;;;;:30;;;39231:41;;-1:-1:-1;;;;;39241:30:0;39231:9;:41::i;:::-;39156:1652;;;39325:26;39294:19;;;;:11;:19;;;;;;;;:27;;;;;;;:57;;;;;-1:-1:-1;;;39294:57:0;;;;;;;;;;39290:1518;;;39381:19;;;;:11;:19;;;;;:30;39368:44;;39381:30;;;-1:-1:-1;;;;;39381:30:0;39368:12;:44::i;39290:1518::-;39465:27;39434:19;;;;:11;:19;;;;;;;;:27;;;;;;;:58;;;;;-1:-1:-1;;;39434:58:0;;;;;;;;;;39430:1378;;;39541:19;;;;:11;:19;;;;;:30;;39590;;;;;39509:126;;-1:-1:-1;;;;;39541:30:0;;;;;;;39590;39509:13;:126::i;39430:1378::-;39702:26;39671:19;;;;:11;:19;;;;;;;;:27;;;;;;;:57;;;;;-1:-1:-1;;;39671:57:0;;;;;;;;;;39653:1155;;;39768:19;;;;:11;:19;;;;;:30;;;39755:44;;-1:-1:-1;;;;;39768:30:0;39755:12;:44::i;39653:1155::-;39866:29;39835:19;;;;:11;:19;;;;;;;;:27;;;;;;;:60;;;;;-1:-1:-1;;;39835:60:0;;;;;;;;;;39817:991;;;39938:19;;;;:11;:19;;;;;:30;39922:47;;39938:30;;;-1:-1:-1;;;;;39938:30:0;39922:15;:47::i;39817:991::-;40036:30;40005:19;;;;:11;:19;;;;;;;;:27;;;;;;;:61;;;;;-1:-1:-1;;;40005:61:0;;;;;;;;;;39987:821;;;40110:19;;;;:11;:19;;;;;:30;;40141;;;;;40093:79;;-1:-1:-1;;;;;40110:30:0;;;;;;;40141;40093:16;:79::i;39987:821::-;40239:37;40208:19;;;;:11;:19;;;;;;;;:27;;;;;;;:68;;;;;-1:-1:-1;;;40208:68:0;;;;;;;;;;40190:618;;;40335:19;;;;:11;:19;;;;;:30;;;40303:64;;-1:-1:-1;;;;;40335:30:0;40303:23;:64::i;40190:618::-;40434:30;40403:19;;;;:11;:19;;;;;;;;:27;;;;;;;:61;;;;;-1:-1:-1;;;40403:61:0;;;;;;;;;;40385:423;;;40516:19;;;;:11;:19;;;;;:30;;;40491:57;;-1:-1:-1;;;;;40516:30:0;40491:16;:57::i;40385:423::-;40615:20;40584:19;;;;:11;:19;;;;;;;;:27;;;;;;;:51;;;;;-1:-1:-1;;;40584:51:0;;;;;;;;;;40566:242;;;40662:8;:6;:8::i;40566:242::-;40737:22;40706:19;;;;:11;:19;;;;;;;;:27;;;;;;;:53;;;;;-1:-1:-1;;;40706:53:0;;;;;;;;;;40688:120;;;40786:10;:8;:10::i;:::-;40820:19;;;;:11;:19;;;;;:33;;-1:-1:-1;;40820:33:0;40849:4;40820:33;;;39092:1769::o;16276:414::-;16339:4;16361:21;16371:3;16376:5;16361:9;:21::i;:::-;16356:327;;-1:-1:-1;16399:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;16582:18;;16560:19;;;:12;;;:19;;;;;;:40;;;;16615:11;;16356:327;-1:-1:-1;16666:5:0;16659:12;;18496:129;18569:4;18593:19;;;:12;;;;;:19;;;;;;:24;;;18496:129::o;44506:251::-;44615:44;44642:4;44648:2;44652:6;44615:26;:44::i;:::-;44681:8;:6;:8::i;:::-;44680:9;44672:77;;;;-1:-1:-1;;;44672:77:0;;;;;;;:::i;18711:109::-;18794:18;;18711:109::o;19164:204::-;19259:18;;19231:7;;19259:26;-1:-1:-1;19251:73:0;;;;-1:-1:-1;;;19251:73:0;;;;;;;:::i;:::-;19342:3;:11;;19354:5;19342:18;;;;;;-1:-1:-1;;;19342:18:0;;;;;;;;;;;;;;;;;19335:25;;19164:204;;;;:::o;40883:131::-;40937:33;40955:7;40964:5;40937:17;:33::i;:::-;;40986:20;41000:5;40986:20;;;;;;:::i;:::-;;;;;;;;40883:131;:::o;41036:290::-;41093:36;41114:7;41123:5;41093:20;:36::i;:::-;;41145:19;41158:5;41145:19;;;;;;:::i;:::-;;;;;;;;41177:15;41195:19;:17;:19::i;:::-;41228:23;;41177:37;;-1:-1:-1;41228:35:0;;;-1:-1:-1;;;;;41228:23:0;;;:35;41225:94;;;41280:27;41297:9;41280:27;;:16;:27::i;41348:225::-;41427:39;41448:7;41457:8;41427:20;:39::i;:::-;;41477:36;41495:7;41504:8;41477:17;:36::i;:::-;;41529;41546:8;41556;41529:36;;;;;;;:::i;:::-;;;;;;;;41348:225;;:::o;41595:149::-;41655:39;41673:10;41685:8;41655:17;:39::i;:::-;;41710:26;41727:8;41710:26;;;;;;:::i;41766:154::-;41829:42;41850:10;41862:8;41829:20;:42::i;:::-;;41887:25;41903:8;41887:25;;;;;;:::i;41942:255::-;42035:45;42055:11;42068;42035:45;;;;;;;:::i;:::-;;;;;;;;42091;42112:10;42124:11;42091:20;:45::i;:::-;;42147:42;42165:10;42177:11;42147:17;:42::i;42282:154::-;42358:32;42381:8;42358:32;;;;;;:::i;:::-;;;;;;;;42401:16;:27;42282:154::o;42520:256::-;42606:19;:17;:19::i;:::-;42593:32;;:9;-1:-1:-1;;;;;42593:32:0;;;42585:95;;;;-1:-1:-1;;;42585:95:0;;;;;;;:::i;:::-;42696:26;42712:9;42696:26;;;;;;:::i;:::-;;;;;;;;42733:23;:35;;-1:-1:-1;;;;;;42733:35:0;-1:-1:-1;;;;;42733:35:0;;;;;;;;;;42520:256::o;43517:118::-;29266:7;;;;29258:48;;;;-1:-1:-1;;;29258:48:0;;;;;;;:::i;:::-;43576:7:::1;:15:::0;;-1:-1:-1;;43576:15:0::1;::::0;;43607:20:::1;::::0;::::1;::::0;::::1;::::0;43616:10:::1;::::0;43607:20:::1;:::i;21540:158::-:0;21613:4;21637:53;21645:3;-1:-1:-1;;;;;21665:23:0;;16932:4;17071:19;;;:12;;;:19;;;;;;17107:15;;17103:1300;;17469:21;17493:14;17506:1;17493:10;:14;:::i;:::-;17542:18;;17469:38;;-1:-1:-1;17522:17:0;;17542:22;;17563:1;;17542:22;:::i;:::-;17522:42;;17809:17;17829:3;:11;;17841:9;17829:22;;;;;;-1:-1:-1;;;17829:22:0;;;;;;;;;;;;;;;;;17809:42;;17975:9;17946:3;:11;;17958:13;17946:26;;;;;;-1:-1:-1;;;17946:26:0;;;;;;;;;;;;;;;;;;:38;18078:17;:13;18094:1;18078:17;:::i;:::-;18052:23;;;;:12;;;:23;;;;;:43;18204:17;;18052:3;;18204:17;;;-1:-1:-1;;;18204:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;18299:3;:12;;:19;18312:5;18299:19;;;;;;;;;;;18292:26;;;18342:4;18335:11;;;;;;;;17103:1300;18386:5;18379:12;;;;;14:705:1;;127:3;120:4;112:6;108:17;104:27;94:2;;149:5;142;135:20;94:2;189:6;176:20;215:4;239:65;254:49;300:2;254:49;:::i;:::-;239:65;:::i;:::-;338:15;;;369:12;;;;401:15;;;447:11;;;435:24;;431:33;;428:42;-1:-1:-1;425:2:1;;;487:5;480;473:20;425:2;513:5;527:163;541:2;538:1;535:9;527:163;;;598:17;;586:30;;636:12;;;;668;;;;559:1;552:9;527:163;;;-1:-1:-1;708:5:1;;84:635;-1:-1:-1;;;;;;;84:635:1:o;724:259::-;;836:2;824:9;815:7;811:23;807:32;804:2;;;857:6;849;842:22;804:2;901:9;888:23;920:33;947:5;920:33;:::i;988:402::-;;;1117:2;1105:9;1096:7;1092:23;1088:32;1085:2;;;1138:6;1130;1123:22;1085:2;1182:9;1169:23;1201:33;1228:5;1201:33;:::i;:::-;1253:5;-1:-1:-1;1310:2:1;1295:18;;1282:32;1323:35;1282:32;1323:35;:::i;:::-;1377:7;1367:17;;;1075:315;;;;;:::o;1395:470::-;;;;1541:2;1529:9;1520:7;1516:23;1512:32;1509:2;;;1562:6;1554;1547:22;1509:2;1606:9;1593:23;1625:33;1652:5;1625:33;:::i;:::-;1677:5;-1:-1:-1;1734:2:1;1719:18;;1706:32;1747:35;1706:32;1747:35;:::i;:::-;1499:366;;1801:7;;-1:-1:-1;;;1855:2:1;1840:18;;;;1827:32;;1499:366::o;1870:327::-;;;1999:2;1987:9;1978:7;1974:23;1970:32;1967:2;;;2020:6;2012;2005:22;1967:2;2064:9;2051:23;2083:33;2110:5;2083:33;:::i;:::-;2135:5;2187:2;2172:18;;;;2159:32;;-1:-1:-1;;;1957:240:1:o;2202:1295::-;;;2381:2;2369:9;2360:7;2356:23;2352:32;2349:2;;;2402:6;2394;2387:22;2349:2;2447:9;2434:23;2476:18;2517:2;2509:6;2506:14;2503:2;;;2538:6;2530;2523:22;2503:2;2581:6;2570:9;2566:22;2556:32;;2626:7;2619:4;2615:2;2611:13;2607:27;2597:2;;2653:6;2645;2638:22;2597:2;2694;2681:16;2716:4;2740:65;2755:49;2801:2;2755:49;:::i;2740:65::-;2839:15;;;2870:12;;;;2902:11;;;2940;;;2932:20;;2928:29;;2925:42;-1:-1:-1;2922:2:1;;;2985:6;2977;2970:22;2922:2;3012:6;3003:15;;3027:240;3041:2;3038:1;3035:9;3027:240;;;3112:3;3099:17;3129:33;3156:5;3129:33;:::i;:::-;3175:18;;3059:1;3052:9;;;;;3213:12;;;;3245;;3027:240;;;-1:-1:-1;3286:5:1;-1:-1:-1;;3329:18:1;;3316:32;;-1:-1:-1;;3360:16:1;;;3357:2;;;3394:6;3386;3379:22;3357:2;;3422:69;3483:7;3472:8;3461:9;3457:24;3422:69;:::i;:::-;3412:79;;;2339:1158;;;;;:::o;3766:190::-;;3878:2;3866:9;3857:7;3853:23;3849:32;3846:2;;;3899:6;3891;3884:22;3846:2;-1:-1:-1;3927:23:1;;3836:120;-1:-1:-1;3836:120:1:o;3961:203::-;-1:-1:-1;;;;;4125:32:1;;;;4107:51;;4095:2;4080:18;;4062:102::o;4169:304::-;-1:-1:-1;;;;;4399:15:1;;;4381:34;;4451:15;;4446:2;4431:18;;4424:43;4331:2;4316:18;;4298:175::o;4478:661::-;4649:2;4701:21;;;4771:13;;4674:18;;;4793:22;;;4478:661;;4649:2;4872:15;;;;4846:2;4831:18;;;4478:661;4918:195;4932:6;4929:1;4926:13;4918:195;;;4997:13;;-1:-1:-1;;;;;4993:39:1;4981:52;;5088:15;;;;5053:12;;;;5029:1;4947:9;4918:195;;;-1:-1:-1;5130:3:1;;4629:510;-1:-1:-1;;;;;;4629:510:1:o;5144:187::-;5309:14;;5302:22;5284:41;;5272:2;5257:18;;5239:92::o;5336:628::-;5603:14;;5596:22;5578:41;;5565:3;5550:19;;5649:2;5638:14;;5628:2;;5695:10;5690:3;5686:20;5683:1;5676:31;5730:4;5727:1;5720:15;5758:4;5755:1;5748:15;5628:2;5804;5789:18;;5782:34;;;;-1:-1:-1;;;;;5890:15:1;;;5885:2;5870:18;;5863:43;5942:15;;5937:2;5922:18;;;5915:43;5532:432;;-1:-1:-1;5532:432:1:o;5969:603::-;;6110:2;6139;6128:9;6121:21;6171:6;6165:13;6214:6;6209:2;6198:9;6194:18;6187:34;6239:4;6252:140;6266:6;6263:1;6260:13;6252:140;;;6361:14;;;6357:23;;6351:30;6327:17;;;6346:2;6323:26;6316:66;6281:10;;6252:140;;;6410:6;6407:1;6404:13;6401:2;;;6480:4;6475:2;6466:6;6455:9;6451:22;6447:31;6440:45;6401:2;-1:-1:-1;6556:2:1;6535:15;-1:-1:-1;;6531:29:1;6516:45;;;;6563:2;6512:54;;6090:482;-1:-1:-1;;;6090:482:1:o;6577:398::-;6779:2;6761:21;;;6818:2;6798:18;;;6791:30;6857:34;6852:2;6837:18;;6830:62;-1:-1:-1;;;6923:2:1;6908:18;;6901:32;6965:3;6950:19;;6751:224::o;6980:399::-;7182:2;7164:21;;;7221:2;7201:18;;;7194:30;7260:34;7255:2;7240:18;;7233:62;-1:-1:-1;;;7326:2:1;7311:18;;7304:33;7369:3;7354:19;;7154:225::o;7384:414::-;7586:2;7568:21;;;7625:2;7605:18;;;7598:30;7664:34;7659:2;7644:18;;7637:62;-1:-1:-1;;;7730:2:1;7715:18;;7708:48;7788:3;7773:19;;7558:240::o;7803:348::-;8005:2;7987:21;;;8044:2;8024:18;;;8017:30;8083:26;8078:2;8063:18;;8056:54;8142:2;8127:18;;7977:174::o;8156:398::-;8358:2;8340:21;;;8397:2;8377:18;;;8370:30;8436:34;8431:2;8416:18;;8409:62;-1:-1:-1;;;8502:2:1;8487:18;;8480:32;8544:3;8529:19;;8330:224::o;8559:355::-;8761:2;8743:21;;;8800:2;8780:18;;;8773:30;8839:33;8834:2;8819:18;;8812:61;8905:2;8890:18;;8733:181::o;8919:402::-;9121:2;9103:21;;;9160:2;9140:18;;;9133:30;9199:34;9194:2;9179:18;;9172:62;-1:-1:-1;;;9265:2:1;9250:18;;9243:36;9311:3;9296:19;;9093:228::o;9326:348::-;9528:2;9510:21;;;9567:2;9547:18;;;9540:30;9606:26;9601:2;9586:18;;9579:54;9665:2;9650:18;;9500:174::o;9679:349::-;9881:2;9863:21;;;9920:2;9900:18;;;9893:30;9959:27;9954:2;9939:18;;9932:55;10019:2;10004:18;;9853:175::o;10033:352::-;10235:2;10217:21;;;10274:2;10254:18;;;10247:30;10313;10308:2;10293:18;;10286:58;10376:2;10361:18;;10207:178::o;10390:351::-;10592:2;10574:21;;;10631:2;10611:18;;;10604:30;10670:29;10665:2;10650:18;;10643:57;10732:2;10717:18;;10564:177::o;10746:346::-;10948:2;10930:21;;;10987:2;10967:18;;;10960:30;-1:-1:-1;;;11021:2:1;11006:18;;10999:52;11083:2;11068:18;;10920:172::o;11097:404::-;11299:2;11281:21;;;11338:2;11318:18;;;11311:30;11377:34;11372:2;11357:18;;11350:62;-1:-1:-1;;;11443:2:1;11428:18;;11421:38;11491:3;11476:19;;11271:230::o;11506:401::-;11708:2;11690:21;;;11747:2;11727:18;;;11720:30;11786:34;11781:2;11766:18;;11759:62;-1:-1:-1;;;11852:2:1;11837:18;;11830:35;11897:3;11882:19;;11680:227::o;11912:400::-;12114:2;12096:21;;;12153:2;12133:18;;;12126:30;12192:34;12187:2;12172:18;;12165:62;-1:-1:-1;;;12258:2:1;12243:18;;12236:34;12302:3;12287:19;;12086:226::o;12317:400::-;12519:2;12501:21;;;12558:2;12538:18;;;12531:30;12597:34;12592:2;12577:18;;12570:62;-1:-1:-1;;;12663:2:1;12648:18;;12641:34;12707:3;12692:19;;12491:226::o;12722:348::-;12924:2;12906:21;;;12963:2;12943:18;;;12936:30;13002:26;12997:2;12982:18;;12975:54;13061:2;13046:18;;12896:174::o;13075:339::-;13277:2;13259:21;;;13316:2;13296:18;;;13289:30;-1:-1:-1;;;13350:2:1;13335:18;;13328:45;13405:2;13390:18;;13249:165::o;13419:352::-;13621:2;13603:21;;;13660:2;13640:18;;;13633:30;13699;13694:2;13679:18;;13672:58;13762:2;13747:18;;13593:178::o;13776:419::-;13978:2;13960:21;;;14017:2;13997:18;;;13990:30;14056:34;14051:2;14036:18;;14029:62;14127:25;14122:2;14107:18;;14100:53;14185:3;14170:19;;13950:245::o;14200:353::-;14402:2;14384:21;;;14441:2;14421:18;;;14414:30;14480:31;14475:2;14460:18;;14453:59;14544:2;14529:18;;14374:179::o;14558:401::-;14760:2;14742:21;;;14799:2;14779:18;;;14772:30;14838:34;14833:2;14818:18;;14811:62;-1:-1:-1;;;14904:2:1;14889:18;;14882:35;14949:3;14934:19;;14732:227::o;15172:177::-;15318:25;;;15306:2;15291:18;;15273:76::o;15354:184::-;15526:4;15514:17;;;;15496:36;;15484:2;15469:18;;15451:87::o;15543:251::-;15613:2;15607:9;15643:17;;;15690:18;15675:34;;15711:22;;;15672:62;15669:2;;;15737:18;;:::i;:::-;15773:2;15766:22;15587:207;;-1:-1:-1;15587:207:1:o;15799:192::-;;15898:18;15890:6;15887:30;15884:2;;;15920:18;;:::i;:::-;-1:-1:-1;15980:4:1;15961:17;;;15957:28;;15874:117::o;15996:128::-;;16067:1;16063:6;16060:1;16057:13;16054:2;;;16073:18;;:::i;:::-;-1:-1:-1;16109:9:1;;16044:80::o;16129:125::-;;16197:1;16194;16191:8;16188:2;;;16202:18;;:::i;:::-;-1:-1:-1;16239:9:1;;16178:76::o;16259:380::-;16344:1;16334:12;;16391:1;16381:12;;;16402:2;;16456:4;16448:6;16444:17;16434:27;;16402:2;16509;16501:6;16498:14;16478:18;16475:38;16472:2;;;16555:10;16550:3;16546:20;16543:1;16536:31;16590:4;16587:1;16580:15;16618:4;16615:1;16608:15;16472:2;;16314:325;;;:::o;16644:135::-;;-1:-1:-1;;16704:17:1;;16701:2;;;16724:18;;:::i;:::-;-1:-1:-1;16771:1:1;16760:13;;16691:88::o;16784:127::-;16845:10;16840:3;16836:20;16833:1;16826:31;16876:4;16873:1;16866:15;16900:4;16897:1;16890:15;16916:127;16977:10;16972:3;16968:20;16965:1;16958:31;17008:4;17005:1;16998:15;17032:4;17029:1;17022:15;17048:133;-1:-1:-1;;;;;17125:31:1;;17115:42;;17105:2;;17171:1;17168;17161:12

Swarm Source

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