ETH Price: $2,713.44 (-2.11%)

Token

AXIA COIN (AXC)
 

Overview

Max Total Supply

72,560,000,000 AXC

Holders

1,590

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 AXC

Value
$0.00
0x08774cba7b5c7a8cd0bba3ae311a512389f7f2f4
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
AXCToken

Compiler Version
v0.7.0+commit.9e61f92b

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 2 of 2: AXCToken.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;

import "./AccessControl.sol";

/**
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

/**
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
abstract contract Ownable {
    address internal _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
    }

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

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

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

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @dev Implementation of the {IERC20} interface.
 */
contract ERC20 is IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) internal _balances;

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

    uint256 private _maxTotalSupply;
    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;


    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     */
    constructor (string memory name_, string memory symbol_, uint256 maxTotalSupply_) {
        _name = name_;
        _symbol = symbol_;
        _maxTotalSupply = maxTotalSupply_;
        _decimals = 18;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view 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`).
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

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

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

    /**
     * @dev See {IERC20-transfer}.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(msg.sender, 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}.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender,msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     */
    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");

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");
        require(_totalSupply.add(amount) <= _maxTotalSupply, "Can not exceed maxTotalSupply");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     */
    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 return maxTotalSupply
     */
    function getMaxTotalSupply() public view returns (uint256) {
        return _maxTotalSupply;
    }
}

contract AXCToken is ERC20, Ownable, AccessControl {
    using SafeMath for uint256;

    mapping (address => bool) private _exemptedAddresses;

    constructor() ERC20("AXIA COIN", "AXC", 72560000000000000000000000000) {
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
    }

    /**
     * @dev mint a new amout of tokens to an account
     */
    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }

    /**
     * @dev mint multiple amounts of tokens to a list of accounts
     */
    function multiMint(address[] memory to_list, uint256[] memory amounts) public onlyOwner {
        require(to_list.length == amounts.length, "Lengths mismatch");
        for (uint256 i = 0; i < to_list.length; i++) {
            _mint(to_list[i], amounts[i]);
        }
    }

    /**
     * @dev sums a list of uint
     */
    function _sum(uint256[] memory data) private pure returns (uint256) {
        uint256 sum;
        for(uint256 i; i < data.length; i++){
            sum = sum.add(data[i]);
        }
        return sum;
    }

    /**
     * @dev return whether a user is exempted
     */
    function exempted(address account) view public returns (bool) {
        return _exemptedAddresses[account];
    }

    /**
     * @dev add self to exempted addresses
     */
    function exemptSelf() public returns (bool) {
        _exemptedAddresses[msg.sender] = true;
        return true;
    }

    /**
     * @dev remove self from exempted addresses
     */
    function revertExemptSelf() public returns (bool) {
        delete _exemptedAddresses[msg.sender];
        return true;
    }

    /**
     * @dev update a balances for multiple accounts
     */
    function batchUpdateBalances(address[] memory to_add_list, uint256[] memory to_add_amounts, address[] memory to_sub_list, uint256[] memory to_sub_amounts) public returns (bool) {
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "Caller is not an admin");
        require(_sum(to_add_amounts).sub(_sum(to_sub_amounts), "Not sum up to ZERO") == 0, "Not sum up to ZERO");

        require(to_add_list.length == to_add_amounts.length, "Lengths mismatch");
        require(to_sub_list.length == to_sub_amounts.length, "Lengths mismatch");

        for(uint256 i; i < to_sub_list.length; i++){
            require(_exemptedAddresses[to_sub_list[i]] == false, "Exempted");
        }

        for(uint256 i; i < to_sub_list.length; i++){
            _balances[to_sub_list[i]] = _balances[to_sub_list[i]].sub(to_sub_amounts[i], "Batch sub amount exceeds balance");
        }

        for(uint256 i; i < to_add_list.length; i++){
            _balances[to_add_list[i]] = _balances[to_add_list[i]].add(to_add_amounts[i]);
        }

        return true;
    }

    /**
     * @dev grant admin roles for multiple accounts
     */
    function batchGrantAdmin(address[] memory to_grant_list) public {
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender) || _owner == msg.sender, "Caller is not an admin or owner");
        for(uint256 i; i < to_grant_list.length; i++){
            _grantRole(DEFAULT_ADMIN_ROLE, to_grant_list[i]);
        }
    }

    /**
     * @dev revoke admin roles for multiple accounts
     */
    function batchRevokeAdmin(address[] memory to_revoke_list) public {
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender) || _owner == msg.sender, "Caller is not an admin or owner");
        for(uint256 i; i < to_revoke_list.length; i++){
            _revokeRole(DEFAULT_ADMIN_ROLE, to_revoke_list[i]);
        }
    }
}

File 1 of 2: AccessControl.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <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 GSN 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 payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


/**
 * @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(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(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(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(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));
    }
}


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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context {
    using EnumerableSet for EnumerableSet.AddressSet;
    using Address for address;

    struct RoleData {
        EnumerableSet.AddressSet members;
        bytes32 adminRole;
    }

    mapping (bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view returns (bool) {
        return _roles[role].members.contains(account);
    }

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) public view returns (uint256) {
        return _roles[role].members.length();
    }

    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) public view returns (address) {
        return _roles[role].members.at(index);
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual {
        require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant");

        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual {
        require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke");

        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        emit RoleAdminChanged(role, _roles[role].adminRole, adminRole);
        _roles[role].adminRole = adminRole;
    }

    function _grantRole(bytes32 role, address account) internal {
        if (_roles[role].members.add(account)) {
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) internal {
        if (_roles[role].members.remove(account)) {
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"to_grant_list","type":"address[]"}],"name":"batchGrantAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"to_revoke_list","type":"address[]"}],"name":"batchRevokeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"to_add_list","type":"address[]"},{"internalType":"uint256[]","name":"to_add_amounts","type":"uint256[]"},{"internalType":"address[]","name":"to_sub_list","type":"address[]"},{"internalType":"uint256[]","name":"to_sub_amounts","type":"uint256[]"}],"name":"batchUpdateBalances","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"exemptSelf","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"exempted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"to_list","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"multiMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revertExemptSelf","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600981526020017f4158494120434f494e00000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f41584300000000000000000000000000000000000000000000000000000000008152506bea7439a9c70458f1700000008260049080519060200190620000a392919062000331565b508160059080519060200190620000bc92919062000331565b50806002819055506012600660006101000a81548160ff021916908360ff16021790555050505033600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3620001946000801b336200019a60201b60201c565b620003d7565b620001ac8282620001b060201b60201c565b5050565b620001df81600760008581526020019081526020016000206000016200025460201b6200231b1790919060201c565b156200025057620001f56200028c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000284836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200029460201b60201c565b905092915050565b600033905090565b6000620002a883836200030e60201b60201c565b6200030357826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000308565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200037457805160ff1916838001178555620003a5565b82800160010185558215620003a5579182015b82811115620003a457825182559160200191906001019062000387565b5b509050620003b49190620003b8565b5090565b5b80821115620003d3576000816000905550600101620003b9565b5090565b6131b080620003e76000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063a457c2d7116100a2578063ca15c87311610071578063ca15c87314610dd2578063d547741f14610e14578063dd62ed3e14610e62578063f2fde38b14610eda576101da565b8063a457c2d714610c90578063a9059cbb14610cf4578063b05fb15814610d58578063bfe262cc14610d78576101da565b80639010d07c116100de5780639010d07c14610b2957806391d1485414610b8b57806395d89b4114610bef578063a217fddf14610c72576101da565b806370a08231146108135780638da5cb5b1461086b578063900126421461089f576101da565b80632f2ff15d1161017c578063395093511161014b578063395093511461068b57806340c10f19146106ef5780635db30bb11461073d5780636669eb681461075b576101da565b80632f2ff15d146104825780632f81bc71146104d0578063313ce5671461061c57806336568abe1461063d576101da565b80631680c901116101b85780631680c9011461037e57806318160ddd1461039e57806323b872dd146103bc578063248a9ca314610440576101da565b806306fdde03146101df578063095ea7b314610262578063151375a6146102c6575b600080fd5b6101e7610f1e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561022757808201518184015260208101905061020c565b50505050905090810190601f1680156102545780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102ae6004803603604081101561027857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fc0565b60405180821515815260200191505060405180910390f35b61037c600480360360208110156102dc57600080fd5b81019080803590602001906401000000008111156102f957600080fd5b82018360208201111561030b57600080fd5b8035906020019184602083028401116401000000008311171561032d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050610fd7565b005b6103866110eb565b60405180821515815260200191505060405180910390f35b6103a6611143565b6040518082815260200191505060405180910390f35b610428600480360360608110156103d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061114d565b60405180821515815260200191505060405180910390f35b61046c6004803603602081101561045657600080fd5b8101908080359060200190929190505050611218565b6040518082815260200191505060405180910390f35b6104ce6004803603604081101561049857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611238565b005b61061a600480360360408110156104e657600080fd5b810190808035906020019064010000000081111561050357600080fd5b82018360208201111561051557600080fd5b8035906020019184602083028401116401000000008311171561053757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561059757600080fd5b8201836020820111156105a957600080fd5b803590602001918460208302840111640100000000831117156105cb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506112c2565b005b61062461144a565b604051808260ff16815260200191505060405180910390f35b6106896004803603604081101561065357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611461565b005b6106d7600480360360408110156106a157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114fa565b60405180821515815260200191505060405180910390f35b61073b6004803603604081101561070557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061159f565b005b610745611670565b6040518082815260200191505060405180910390f35b6108116004803603602081101561077157600080fd5b810190808035906020019064010000000081111561078e57600080fd5b8201836020820111156107a057600080fd5b803590602001918460208302840111640100000000831117156107c257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929050505061167a565b005b6108556004803603602081101561082957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061178e565b6040518082815260200191505060405180910390f35b6108736117d6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b11600480360360808110156108b557600080fd5b81019080803590602001906401000000008111156108d257600080fd5b8201836020820111156108e457600080fd5b8035906020019184602083028401116401000000008311171561090657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561096657600080fd5b82018360208201111561097857600080fd5b8035906020019184602083028401116401000000008311171561099a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156109fa57600080fd5b820183602082011115610a0c57600080fd5b80359060200191846020830284011164010000000083111715610a2e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610a8e57600080fd5b820183602082011115610aa057600080fd5b80359060200191846020830284011164010000000083111715610ac257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611800565b60405180821515815260200191505060405180910390f35b610b5f60048036036040811015610b3f57600080fd5b810190808035906020019092919080359060200190929190505050611d40565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610bd760048036036040811015610ba157600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d72565b60405180821515815260200191505060405180910390f35b610bf7611da4565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c37578082015181840152602081019050610c1c565b50505050905090810190601f168015610c645780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610c7a611e46565b6040518082815260200191505060405180910390f35b610cdc60048036036040811015610ca657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611e4d565b60405180821515815260200191505060405180910390f35b610d4060048036036040811015610d0a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f0c565b60405180821515815260200191505060405180910390f35b610d60611f23565b60405180821515815260200191505060405180910390f35b610dba60048036036020811015610d8e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f84565b60405180821515815260200191505060405180910390f35b610dfe60048036036020811015610de857600080fd5b8101908080359060200190929190505050611fda565b6040518082815260200191505060405180910390f35b610e6060048036036040811015610e2a57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612001565b005b610ec460048036036040811015610e7857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061208b565b6040518082815260200191505060405180910390f35b610f1c60048036036020811015610ef057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612112565b005b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fb65780601f10610f8b57610100808354040283529160200191610fb6565b820191906000526020600020905b815481529060010190602001808311610f9957829003601f168201915b5050505050905090565b6000610fcd33848461234b565b6001905092915050565b610fe46000801b33611d72565b8061103c57503373ffffffffffffffffffffffffffffffffffffffff16600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6110ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f43616c6c6572206973206e6f7420616e2061646d696e206f72206f776e65720081525060200191505060405180910390fd5b60005b81518110156110e7576110da6000801b8383815181106110cd57fe5b6020026020010151612542565b80806001019150506110b1565b5050565b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690556001905090565b6000600354905090565b600061115a8484846125d6565b61120d8433611208856040518060600160405280602881526020016130b660289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461288c9092919063ffffffff16565b61234b565b600190509392505050565b600060076000838152602001908152602001600020600201549050919050565b61125f600760008481526020019081526020016000206002015461125a61294c565b611d72565b6112b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180612fe9602f913960400191505060405180910390fd5b6112be8282612542565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611385576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80518251146113fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4c656e67746873206d69736d617463680000000000000000000000000000000081525060200191505060405180910390fd5b60005b82518110156114455761143883828151811061141757fe5b602002602001015183838151811061142b57fe5b6020026020010151612954565b80806001019150506113ff565b505050565b6000600660009054906101000a900460ff16905090565b61146961294c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061314c602f913960400191505060405180910390fd5b6114f68282612b9b565b5050565b6000611595338461159085600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c2f90919063ffffffff16565b61234b565b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611662576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61166c8282612954565b5050565b6000600254905090565b6116876000801b33611d72565b806116df57503373ffffffffffffffffffffffffffffffffffffffff16600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f43616c6c6572206973206e6f7420616e2061646d696e206f72206f776e65720081525060200191505060405180910390fd5b60005b815181101561178a5761177d6000801b83838151811061177057fe5b6020026020010151612b9b565b8080600101915050611754565b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061180f6000801b33611d72565b611881576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f43616c6c6572206973206e6f7420616e2061646d696e0000000000000000000081525060200191505060405180910390fd5b60006118dd61188f84612cb7565b6040518060400160405280601281526020017f4e6f742073756d20757020746f205a45524f00000000000000000000000000008152506118ce88612cb7565b61288c9092919063ffffffff16565b14611950576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f742073756d20757020746f205a45524f000000000000000000000000000081525060200191505060405180910390fd5b83518551146119c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4c656e67746873206d69736d617463680000000000000000000000000000000081525060200191505060405180910390fd5b8151835114611a3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4c656e67746873206d69736d617463680000000000000000000000000000000081525060200191505060405180910390fd5b60005b8351811015611b30576000151560086000868481518110611a5e57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611b23576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260088152602001807f4578656d7074656400000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8080600101915050611a41565b5060005b8351811015611c4d57611beb838281518110611b4c57fe5b60200260200101516040518060400160405280602081526020017f42617463682073756220616d6f756e7420657863656564732062616c616e6365815250600080888681518110611b9957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461288c9092919063ffffffff16565b600080868481518110611bfa57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080600101915050611b34565b5060005b8551811015611d3357611cd1858281518110611c6957fe5b6020026020010151600080898581518110611c8057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c2f90919063ffffffff16565b600080888481518110611ce057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080600101915050611c51565b5060019050949350505050565b6000611d6a8260076000868152602001908152602001600020600001612d0590919063ffffffff16565b905092915050565b6000611d9c8260076000868152602001908152602001600020600001612d1f90919063ffffffff16565b905092915050565b606060058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e3c5780601f10611e1157610100808354040283529160200191611e3c565b820191906000526020600020905b815481529060010190602001808311611e1f57829003601f168201915b5050505050905090565b6000801b81565b6000611f023384611efd8560405180606001604052806025815260200161312760259139600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461288c9092919063ffffffff16565b61234b565b6001905092915050565b6000611f193384846125d6565b6001905092915050565b60006001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001905090565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000611ffa60076000848152602001908152602001600020600001612d4f565b9050919050565b612028600760008481526020019081526020016000206002015461202361294c565b611d72565b61207d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806130866030913960400191505060405180910390fd5b6120878282612b9b565b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561225b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806130186026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612343836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612d64565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806131036024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061303e6022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b61256a816007600085815260200190815260200160002060000161231b90919063ffffffff16565b156125d25761257761294c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561265c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806130de6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126e2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180612fc66023913960400191505060405180910390fd5b61274d81604051806060016040528060268152602001613060602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461288c9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506127e0816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c2f90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290612939576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156128fe5780820151818401526020810190506128e3565b50505050905090810190601f16801561292b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b600254612a0f82600354612c2f90919063ffffffff16565b1115612a83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f43616e206e6f7420657863656564206d6178546f74616c537570706c7900000081525060200191505060405180910390fd5b612a9881600354612c2f90919063ffffffff16565b600381905550612aef816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c2f90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b612bc38160076000858152602001908152602001600020600001612dd490919063ffffffff16565b15612c2b57612bd061294c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600080828401905083811015612cad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60008060005b8351811015612cfb57612cec848281518110612cd557fe5b602002602001015183612c2f90919063ffffffff16565b91508080600101915050612cbd565b5080915050919050565b6000612d148360000183612e04565b60001c905092915050565b6000612d47836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612e87565b905092915050565b6000612d5d82600001612eaa565b9050919050565b6000612d708383612e87565b612dc9578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612dce565b600090505b92915050565b6000612dfc836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612ebb565b905092915050565b600081836000018054905011612e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180612fa46022913960400191505060405180910390fd5b826000018281548110612e7457fe5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b60008083600101600084815260200190815260200160002054905060008114612f975760006001820390506000600186600001805490500390506000866000018281548110612f0657fe5b9060005260206000200154905080876000018481548110612f2357fe5b9060005260206000200181905550600183018760010160008381526020019081526020016000208190555086600001805480612f5b57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612f9d565b60009150505b9291505056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e647345524332303a207472616e7366657220746f20746865207a65726f2061646472657373416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e744f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b6545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66a2646970667358221220f7359ae6fd873541c1545cceb557517e351a56741375b6bbd13a5599a096984864736f6c63430007000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063a457c2d7116100a2578063ca15c87311610071578063ca15c87314610dd2578063d547741f14610e14578063dd62ed3e14610e62578063f2fde38b14610eda576101da565b8063a457c2d714610c90578063a9059cbb14610cf4578063b05fb15814610d58578063bfe262cc14610d78576101da565b80639010d07c116100de5780639010d07c14610b2957806391d1485414610b8b57806395d89b4114610bef578063a217fddf14610c72576101da565b806370a08231146108135780638da5cb5b1461086b578063900126421461089f576101da565b80632f2ff15d1161017c578063395093511161014b578063395093511461068b57806340c10f19146106ef5780635db30bb11461073d5780636669eb681461075b576101da565b80632f2ff15d146104825780632f81bc71146104d0578063313ce5671461061c57806336568abe1461063d576101da565b80631680c901116101b85780631680c9011461037e57806318160ddd1461039e57806323b872dd146103bc578063248a9ca314610440576101da565b806306fdde03146101df578063095ea7b314610262578063151375a6146102c6575b600080fd5b6101e7610f1e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561022757808201518184015260208101905061020c565b50505050905090810190601f1680156102545780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102ae6004803603604081101561027857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fc0565b60405180821515815260200191505060405180910390f35b61037c600480360360208110156102dc57600080fd5b81019080803590602001906401000000008111156102f957600080fd5b82018360208201111561030b57600080fd5b8035906020019184602083028401116401000000008311171561032d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050610fd7565b005b6103866110eb565b60405180821515815260200191505060405180910390f35b6103a6611143565b6040518082815260200191505060405180910390f35b610428600480360360608110156103d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061114d565b60405180821515815260200191505060405180910390f35b61046c6004803603602081101561045657600080fd5b8101908080359060200190929190505050611218565b6040518082815260200191505060405180910390f35b6104ce6004803603604081101561049857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611238565b005b61061a600480360360408110156104e657600080fd5b810190808035906020019064010000000081111561050357600080fd5b82018360208201111561051557600080fd5b8035906020019184602083028401116401000000008311171561053757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561059757600080fd5b8201836020820111156105a957600080fd5b803590602001918460208302840111640100000000831117156105cb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506112c2565b005b61062461144a565b604051808260ff16815260200191505060405180910390f35b6106896004803603604081101561065357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611461565b005b6106d7600480360360408110156106a157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114fa565b60405180821515815260200191505060405180910390f35b61073b6004803603604081101561070557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061159f565b005b610745611670565b6040518082815260200191505060405180910390f35b6108116004803603602081101561077157600080fd5b810190808035906020019064010000000081111561078e57600080fd5b8201836020820111156107a057600080fd5b803590602001918460208302840111640100000000831117156107c257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929050505061167a565b005b6108556004803603602081101561082957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061178e565b6040518082815260200191505060405180910390f35b6108736117d6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b11600480360360808110156108b557600080fd5b81019080803590602001906401000000008111156108d257600080fd5b8201836020820111156108e457600080fd5b8035906020019184602083028401116401000000008311171561090657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561096657600080fd5b82018360208201111561097857600080fd5b8035906020019184602083028401116401000000008311171561099a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156109fa57600080fd5b820183602082011115610a0c57600080fd5b80359060200191846020830284011164010000000083111715610a2e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610a8e57600080fd5b820183602082011115610aa057600080fd5b80359060200191846020830284011164010000000083111715610ac257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611800565b60405180821515815260200191505060405180910390f35b610b5f60048036036040811015610b3f57600080fd5b810190808035906020019092919080359060200190929190505050611d40565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610bd760048036036040811015610ba157600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d72565b60405180821515815260200191505060405180910390f35b610bf7611da4565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c37578082015181840152602081019050610c1c565b50505050905090810190601f168015610c645780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610c7a611e46565b6040518082815260200191505060405180910390f35b610cdc60048036036040811015610ca657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611e4d565b60405180821515815260200191505060405180910390f35b610d4060048036036040811015610d0a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f0c565b60405180821515815260200191505060405180910390f35b610d60611f23565b60405180821515815260200191505060405180910390f35b610dba60048036036020811015610d8e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f84565b60405180821515815260200191505060405180910390f35b610dfe60048036036020811015610de857600080fd5b8101908080359060200190929190505050611fda565b6040518082815260200191505060405180910390f35b610e6060048036036040811015610e2a57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612001565b005b610ec460048036036040811015610e7857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061208b565b6040518082815260200191505060405180910390f35b610f1c60048036036020811015610ef057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612112565b005b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fb65780601f10610f8b57610100808354040283529160200191610fb6565b820191906000526020600020905b815481529060010190602001808311610f9957829003601f168201915b5050505050905090565b6000610fcd33848461234b565b6001905092915050565b610fe46000801b33611d72565b8061103c57503373ffffffffffffffffffffffffffffffffffffffff16600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6110ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f43616c6c6572206973206e6f7420616e2061646d696e206f72206f776e65720081525060200191505060405180910390fd5b60005b81518110156110e7576110da6000801b8383815181106110cd57fe5b6020026020010151612542565b80806001019150506110b1565b5050565b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690556001905090565b6000600354905090565b600061115a8484846125d6565b61120d8433611208856040518060600160405280602881526020016130b660289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461288c9092919063ffffffff16565b61234b565b600190509392505050565b600060076000838152602001908152602001600020600201549050919050565b61125f600760008481526020019081526020016000206002015461125a61294c565b611d72565b6112b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180612fe9602f913960400191505060405180910390fd5b6112be8282612542565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611385576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80518251146113fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4c656e67746873206d69736d617463680000000000000000000000000000000081525060200191505060405180910390fd5b60005b82518110156114455761143883828151811061141757fe5b602002602001015183838151811061142b57fe5b6020026020010151612954565b80806001019150506113ff565b505050565b6000600660009054906101000a900460ff16905090565b61146961294c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f81526020018061314c602f913960400191505060405180910390fd5b6114f68282612b9b565b5050565b6000611595338461159085600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c2f90919063ffffffff16565b61234b565b6001905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611662576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61166c8282612954565b5050565b6000600254905090565b6116876000801b33611d72565b806116df57503373ffffffffffffffffffffffffffffffffffffffff16600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f43616c6c6572206973206e6f7420616e2061646d696e206f72206f776e65720081525060200191505060405180910390fd5b60005b815181101561178a5761177d6000801b83838151811061177057fe5b6020026020010151612b9b565b8080600101915050611754565b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061180f6000801b33611d72565b611881576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f43616c6c6572206973206e6f7420616e2061646d696e0000000000000000000081525060200191505060405180910390fd5b60006118dd61188f84612cb7565b6040518060400160405280601281526020017f4e6f742073756d20757020746f205a45524f00000000000000000000000000008152506118ce88612cb7565b61288c9092919063ffffffff16565b14611950576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f742073756d20757020746f205a45524f000000000000000000000000000081525060200191505060405180910390fd5b83518551146119c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4c656e67746873206d69736d617463680000000000000000000000000000000081525060200191505060405180910390fd5b8151835114611a3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4c656e67746873206d69736d617463680000000000000000000000000000000081525060200191505060405180910390fd5b60005b8351811015611b30576000151560086000868481518110611a5e57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611b23576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260088152602001807f4578656d7074656400000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8080600101915050611a41565b5060005b8351811015611c4d57611beb838281518110611b4c57fe5b60200260200101516040518060400160405280602081526020017f42617463682073756220616d6f756e7420657863656564732062616c616e6365815250600080888681518110611b9957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461288c9092919063ffffffff16565b600080868481518110611bfa57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080600101915050611b34565b5060005b8551811015611d3357611cd1858281518110611c6957fe5b6020026020010151600080898581518110611c8057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c2f90919063ffffffff16565b600080888481518110611ce057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080600101915050611c51565b5060019050949350505050565b6000611d6a8260076000868152602001908152602001600020600001612d0590919063ffffffff16565b905092915050565b6000611d9c8260076000868152602001908152602001600020600001612d1f90919063ffffffff16565b905092915050565b606060058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e3c5780601f10611e1157610100808354040283529160200191611e3c565b820191906000526020600020905b815481529060010190602001808311611e1f57829003601f168201915b5050505050905090565b6000801b81565b6000611f023384611efd8560405180606001604052806025815260200161312760259139600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461288c9092919063ffffffff16565b61234b565b6001905092915050565b6000611f193384846125d6565b6001905092915050565b60006001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001905090565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000611ffa60076000848152602001908152602001600020600001612d4f565b9050919050565b612028600760008481526020019081526020016000206002015461202361294c565b611d72565b61207d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806130866030913960400191505060405180910390fd5b6120878282612b9b565b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561225b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806130186026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612343836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612d64565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806131036024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061303e6022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b61256a816007600085815260200190815260200160002060000161231b90919063ffffffff16565b156125d25761257761294c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561265c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806130de6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126e2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180612fc66023913960400191505060405180910390fd5b61274d81604051806060016040528060268152602001613060602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461288c9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506127e0816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c2f90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290612939576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156128fe5780820151818401526020810190506128e3565b50505050905090810190601f16801561292b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b600254612a0f82600354612c2f90919063ffffffff16565b1115612a83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f43616e206e6f7420657863656564206d6178546f74616c537570706c7900000081525060200191505060405180910390fd5b612a9881600354612c2f90919063ffffffff16565b600381905550612aef816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c2f90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b612bc38160076000858152602001908152602001600020600001612dd490919063ffffffff16565b15612c2b57612bd061294c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600080828401905083811015612cad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60008060005b8351811015612cfb57612cec848281518110612cd557fe5b602002602001015183612c2f90919063ffffffff16565b91508080600101915050612cbd565b5080915050919050565b6000612d148360000183612e04565b60001c905092915050565b6000612d47836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612e87565b905092915050565b6000612d5d82600001612eaa565b9050919050565b6000612d708383612e87565b612dc9578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612dce565b600090505b92915050565b6000612dfc836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612ebb565b905092915050565b600081836000018054905011612e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180612fa46022913960400191505060405180910390fd5b826000018281548110612e7457fe5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b60008083600101600084815260200190815260200160002054905060008114612f975760006001820390506000600186600001805490500390506000866000018281548110612f0657fe5b9060005260206000200154905080876000018481548110612f2357fe5b9060005260206000200181905550600183018760010160008381526020019081526020016000208190555086600001805480612f5b57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612f9d565b60009150505b9291505056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e647345524332303a207472616e7366657220746f20746865207a65726f2061646472657373416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e744f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b6545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66a2646970667358221220f7359ae6fd873541c1545cceb557517e351a56741375b6bbd13a5599a096984864736f6c63430007000033

Deployed Bytecode Sourcemap

8808:3546:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4481:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5904:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11642:315;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10314:125;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;5141:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6129:312;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21122:112:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21484:223;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;9343:274:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5000:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22658:205:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6546:211:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;9162:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;8706:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12032:320;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5297:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2273:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;10513:1055;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20805:136:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;19790:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;4675:85:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18567:49:1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6862:262:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;5471:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;10125:119;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;9947:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20095:125:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21941:226;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5699:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2701:232;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4481:81;4518:13;4550:5;4543:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4481:81;:::o;5904:164::-;5987:4;6003:37;6012:10;6024:7;6033:6;6003:8;:37::i;:::-;6057:4;6050:11;;5904:164;;;;:::o;11642:315::-;11724:39;18612:4:1;11732:18:0;;11752:10;11724:7;:39::i;:::-;:63;;;;11777:10;11767:20;;:6;;;;;;;;;;;:20;;;11724:63;11716:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11837:9;11833:118;11852:13;:20;11848:1;:24;11833:118;;;11892:48;18612:4:1;11903:18:0;;11923:13;11937:1;11923:16;;;;;;;;;;;;;;11892:10;:48::i;:::-;11874:3;;;;;;;11833:118;;;;11642:315;:::o;10314:125::-;10358:4;10381:18;:30;10400:10;10381:30;;;;;;;;;;;;;;;;10374:37;;;;;;;;;;;10428:4;10421:11;;10314:125;:::o;5141:98::-;5194:7;5220:12;;5213:19;;5141:98;:::o;6129:312::-;6235:4;6251:36;6261:6;6269:9;6280:6;6251:9;:36::i;:::-;6297:116;6306:6;6313:10;6325:87;6361:6;6325:87;;;;;;;;;;;;;;;;;:11;:19;6337:6;6325:19;;;;;;;;;;;;;;;:31;6345:10;6325:31;;;;;;;;;;;;;;;;:35;;:87;;;;;:::i;:::-;6297:8;:116::i;:::-;6430:4;6423:11;;6129:312;;;;;:::o;21122:112:1:-;21179:7;21205:6;:12;21212:4;21205:12;;;;;;;;;;;:22;;;21198:29;;21122:112;;;:::o;21484:223::-;21567:45;21575:6;:12;21582:4;21575:12;;;;;;;;;;;:22;;;21599:12;:10;:12::i;:::-;21567:7;:45::i;:::-;21559:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21675:25;21686:4;21692:7;21675:10;:25::i;:::-;21484:223;;:::o;9343:274:0:-;2487:10;2477:20;;:6;;;;;;;;;;;:20;;;2469:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9467:7:::1;:14;9449:7;:14;:32;9441:61;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;9517:9;9512:99;9536:7;:14;9532:1;:18;9512:99;;;9571:29;9577:7;9585:1;9577:10;;;;;;;;;;;;;;9589:7;9597:1;9589:10;;;;;;;;;;;;;;9571:5;:29::i;:::-;9552:3;;;;;;;9512:99;;;;9343:274:::0;;:::o;5000:81::-;5041:5;5065:9;;;;;;;;;;;5058:16;;5000:81;:::o;22658:205:1:-;22755:12;:10;:12::i;:::-;22744:23;;:7;:23;;;22736:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22830:26;22842:4;22848:7;22830:11;:26::i;:::-;22658:205;;:::o;6546:211:0:-;6634:4;6650:79;6659:10;6671:7;6680:48;6717:10;6680:11;:23;6692:10;6680:23;;;;;;;;;;;;;;;:32;6704:7;6680:32;;;;;;;;;;;;;;;;:36;;:48;;;;:::i;:::-;6650:8;:79::i;:::-;6746:4;6739:11;;6546:211;;;;:::o;9162:93::-;2487:10;2477:20;;:6;;;;;;;;;;;:20;;;2469:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9231:17:::1;9237:2;9241:6;9231:5;:17::i;:::-;9162:93:::0;;:::o;8706:98::-;8756:7;8782:15;;8775:22;;8706:98;:::o;12032:320::-;12116:39;18612:4:1;12124:18:0;;12144:10;12116:7;:39::i;:::-;:63;;;;12169:10;12159:20;;:6;;;;;;;;;;;:20;;;12116:63;12108:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12229:9;12225:121;12244:14;:21;12240:1;:25;12225:121;;;12285:50;18612:4:1;12297:18:0;;12317:14;12332:1;12317:17;;;;;;;;;;;;;;12285:11;:50::i;:::-;12267:3;;;;;;;12225:121;;;;12032:320;:::o;5297:117::-;5363:7;5389:9;:18;5399:7;5389:18;;;;;;;;;;;;;;;;5382:25;;5297:117;;;:::o;2273:77::-;2311:7;2337:6;;;;;;;;;;;2330:13;;2273:77;:::o;10513:1055::-;10684:4;10708:39;18612:4:1;10716:18:0;;10736:10;10708:7;:39::i;:::-;10700:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10864:1;10792:68;10817:20;10822:14;10817:4;:20::i;:::-;10792:68;;;;;;;;;;;;;;;;;:20;10797:14;10792:4;:20::i;:::-;:24;;:68;;;;;:::i;:::-;:73;10784:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10929:14;:21;10907:11;:18;:43;10899:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11011:14;:21;10989:11;:18;:43;10981:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11068:9;11064:132;11083:11;:18;11079:1;:22;11064:132;;;11167:5;11129:43;;:18;:34;11148:11;11160:1;11148:14;;;;;;;;;;;;;;11129:34;;;;;;;;;;;;;;;;;;;;;;;;;:43;;;11121:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11103:3;;;;;;;11064:132;;;;11210:9;11206:180;11225:11;:18;11221:1;:22;11206:180;;;11291:84;11321:14;11336:1;11321:17;;;;;;;;;;;;;;11291:84;;;;;;;;;;;;;;;;;:9;:25;11301:11;11313:1;11301:14;;;;;;;;;;;;;;11291:25;;;;;;;;;;;;;;;;:29;;:84;;;;;:::i;:::-;11263:9;:25;11273:11;11285:1;11273:14;;;;;;;;;;;;;;11263:25;;;;;;;;;;;;;;;:112;;;;11245:3;;;;;;;11206:180;;;;11400:9;11396:144;11415:11;:18;11411:1;:22;11396:144;;;11481:48;11511:14;11526:1;11511:17;;;;;;;;;;;;;;11481:9;:25;11491:11;11503:1;11491:14;;;;;;;;;;;;;;11481:25;;;;;;;;;;;;;;;;:29;;:48;;;;:::i;:::-;11453:9;:25;11463:11;11475:1;11463:14;;;;;;;;;;;;;;11453:25;;;;;;;;;;;;;;;:76;;;;11435:3;;;;;;;11396:144;;;;11557:4;11550:11;;10513:1055;;;;;;:::o;20805:136:1:-;20878:7;20904:30;20928:5;20904:6;:12;20911:4;20904:12;;;;;;;;;;;:20;;:23;;:30;;;;:::i;:::-;20897:37;;20805:136;;;;:::o;19790:137::-;19859:4;19882:38;19912:7;19882:6;:12;19889:4;19882:12;;;;;;;;;;;:20;;:29;;:38;;;;:::i;:::-;19875:45;;19790:137;;;;:::o;4675:85:0:-;4714:13;4746:7;4739:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4675:85;:::o;18567:49:1:-;18612:4;18567:49;;;:::o;6862:262:0:-;6955:4;6971:125;6980:10;6992:7;7001:94;7038:15;7001:94;;;;;;;;;;;;;;;;;:11;:23;7013:10;7001:23;;;;;;;;;;;;;;;:32;7025:7;7001:32;;;;;;;;;;;;;;;;:36;;:94;;;;;:::i;:::-;6971:8;:125::i;:::-;7113:4;7106:11;;6862:262;;;;:::o;5471:170::-;5557:4;5573:40;5583:10;5595:9;5606:6;5573:9;:40::i;:::-;5630:4;5623:11;;5471:170;;;;:::o;10125:119::-;10163:4;10212;10179:18;:30;10198:10;10179:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;10233:4;10226:11;;10125:119;:::o;9947:113::-;10003:4;10026:18;:27;10045:7;10026:27;;;;;;;;;;;;;;;;;;;;;;;;;10019:34;;9947:113;;;:::o;20095:125:1:-;20158:7;20184:29;:6;:12;20191:4;20184:12;;;;;;;;;;;:20;;:27;:29::i;:::-;20177:36;;20095:125;;;:::o;21941:226::-;22025:45;22033:6;:12;22040:4;22033:12;;;;;;;;;;;:22;;;22057:12;:10;:12::i;:::-;22025:7;:45::i;:::-;22017:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22134:26;22146:4;22152:7;22134:11;:26::i;:::-;21941:226;;:::o;5699:149:0:-;5788:7;5814:11;:18;5826:5;5814:18;;;;;;;;;;;;;;;:27;5833:7;5814:27;;;;;;;;;;;;;;;;5807:34;;5699:149;;;;:::o;2701:232::-;2487:10;2477:20;;:6;;;;;;;;;;;:20;;;2469:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2801:1:::1;2781:22;;:8;:22;;;;2773:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2890:8;2861:38;;2882:6;;;;;;;;;;;2861:38;;;;;;;;;;;;2918:8;2909:6;;:17;;;;;;;;;;;;;;;;;;2701:232:::0;:::o;7306:141:1:-;7376:4;7399:41;7404:3;:10;;7432:5;7424:14;;7416:23;;7399:4;:41::i;:::-;7392:48;;7306:141;;;;:::o;8310:340:0:-;8428:1;8411:19;;:5;:19;;;;8403:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8508:1;8489:21;;:7;:21;;;;8481:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8590:6;8560:11;:18;8572:5;8560:18;;;;;;;;;;;;;;;:27;8579:7;8560:27;;;;;;;;;;;;;;;:36;;;;8627:7;8611:32;;8620:5;8611:32;;;8636:6;8611:32;;;;;;;;;;;;;;;;;;8310:340;;;:::o;23865:185:1:-;23939:33;23964:7;23939:6;:12;23946:4;23939:12;;;;;;;;;;;:20;;:24;;:33;;;;:::i;:::-;23935:109;;;24020:12;:10;:12::i;:::-;23993:40;;24011:7;23993:40;;24005:4;23993:40;;;;;;;;;;23935:109;23865:185;;:::o;7210:472:0:-;7333:1;7315:20;;:6;:20;;;;7307:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7416:1;7395:23;;:9;:23;;;;7387:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7489;7511:6;7489:71;;;;;;;;;;;;;;;;;:9;:17;7499:6;7489:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;7469:9;:17;7479:6;7469:17;;;;;;;;;;;;;;;:91;;;;7593:32;7618:6;7593:9;:20;7603:9;7593:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;7570:9;:20;7580:9;7570:20;;;;;;;;;;;;;;;:55;;;;7657:9;7640:35;;7649:6;7640:35;;;7668:6;7640:35;;;;;;;;;;;;;;;;;;7210:472;;;:::o;512:187::-;598:7;630:1;625;:6;;633:12;617:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;656:9;672:1;668;:5;656:17;;691:1;684:8;;;512:187;;;;;:::o;598:104:1:-;651:15;685:10;678:17;;598:104;:::o;7800:405:0:-;7902:1;7883:21;;:7;:21;;;;7875:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7986:15;;7958:24;7975:6;7958:12;;:16;;:24;;;;:::i;:::-;:43;;7950:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8061:24;8078:6;8061:12;;:16;;:24;;;;:::i;:::-;8046:12;:39;;;;8116:30;8139:6;8116:9;:18;8126:7;8116:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;8095:9;:18;8105:7;8095:18;;;;;;;;;;;;;;;:51;;;;8182:7;8161:37;;8178:1;8161:37;;;8191:6;8161:37;;;;;;;;;;;;;;;;;;7800:405;;:::o;24056:189:1:-;24131:36;24159:7;24131:6;:12;24138:4;24131:12;;;;;;;;;;;:20;;:27;;:36;;;;:::i;:::-;24127:112;;;24215:12;:10;:12::i;:::-;24188:40;;24206:7;24188:40;;24200:4;24188:40;;;;;;;;;;24127:112;24056:189;;:::o;190:176:0:-;248:7;267:9;283:1;279;:5;267:17;;307:1;302;:6;;294:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;358:1;351:8;;;190:176;;;;:::o;9671:208::-;9730:7;9749:11;9774:9;9770:83;9789:4;:11;9785:1;:15;9770:83;;;9826:16;9834:4;9839:1;9834:7;;;;;;;;;;;;;;9826:3;:7;;:16;;;;:::i;:::-;9820:22;;9802:3;;;;;;;9770:83;;;;9869:3;9862:10;;;9671:208;;;:::o;8527:147:1:-;8601:7;8643:22;8647:3;:10;;8659:5;8643:3;:22::i;:::-;8635:31;;8620:47;;8527:147;;;;:::o;7843:156::-;7923:4;7946:46;7956:3;:10;;7984:5;7976:14;;7968:23;;7946:9;:46::i;:::-;7939:53;;7843:156;;;;:::o;8080:115::-;8143:7;8169:19;8177:3;:10;;8169:7;:19::i;:::-;8162:26;;8080:115;;;:::o;2517:404::-;2580:4;2601:21;2611:3;2616:5;2601:9;:21::i;:::-;2596:319;;2638:3;:11;;2655:5;2638:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2818:3;:11;;:18;;;;2796:3;:12;;:19;2809:5;2796:19;;;;;;;;;;;:40;;;;2857:4;2850:11;;;;2596:319;2899:5;2892:12;;2517:404;;;;;:::o;7615:147::-;7688:4;7711:44;7719:3;:10;;7747:5;7739:14;;7731:23;;7711:7;:44::i;:::-;7704:51;;7615:147;;;;:::o;5329:201::-;5396:7;5444:5;5423:3;:11;;:18;;;;:26;5415:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5505:3;:11;;5517:5;5505:18;;;;;;;;;;;;;;;;5498:25;;5329:201;;;;:::o;4682:127::-;4755:4;4801:1;4778:3;:12;;:19;4791:5;4778:19;;;;;;;;;;;;:24;;4771:31;;4682:127;;;;:::o;4890:107::-;4946:7;4972:3;:11;;:18;;;;4965:25;;4890:107;;;:::o;3089:1512::-;3155:4;3271:18;3292:3;:12;;:19;3305:5;3292:19;;;;;;;;;;;;3271:40;;3340:1;3326:10;:15;3322:1273;;3683:21;3720:1;3707:10;:14;3683:38;;3735:17;3776:1;3755:3;:11;;:18;;;;:22;3735:42;;4017:17;4037:3;:11;;4049:9;4037:22;;;;;;;;;;;;;;;;4017:42;;4180:9;4151:3;:11;;4163:13;4151:26;;;;;;;;;;;;;;;:38;;;;4297:1;4281:13;:17;4255:3;:12;;:23;4268:9;4255:23;;;;;;;;;;;:43;;;;4404:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;4496:3;:12;;:19;4509:5;4496:19;;;;;;;;;;;4489:26;;;4537:4;4530:11;;;;;;;;3322:1273;4579:5;4572:12;;;3089:1512;;;;;:::o

Swarm Source

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