ETH Price: $2,826.99 (-7.43%)
Gas: 10 Gwei

Token

sobacoin (SOBA)
 

Overview

Max Total Supply

10,000,000,000 SOBA

Holders

1,526

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.00000048 SOBA

Value
$0.00
0x1257cae8881ab5bf61927eadca360067e8250c5c
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:
SOBA

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-11-30
*/

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

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

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

    // solhint-disable-next-line avoid-low-level-calls
    (bool success, bytes memory returndata) = target.delegatecall(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 Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
  /**
    * @dev Returns the addition of two unsigned integers, reverting on
    * overflow.
    *
    * Counterpart to Solidity's `+` operator.
    *
    * Requirements:
    *
    * - Addition cannot overflow.
    */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a, "SafeMath: addition overflow");

    return c;
  }

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

  /**
    * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
    * overflow (when the result is negative).
    *
    * Counterpart to Solidity's `-` operator.
    *
    * Requirements:
    *
    * - Subtraction cannot overflow.
    */
  function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
    require(b <= a, errorMessage);
    uint256 c = a - b;

    return c;
  }

  /**
    * @dev Returns the multiplication of two unsigned integers, reverting on
    * overflow.
    *
    * Counterpart to Solidity's `*` operator.
    *
    * Requirements:
    *
    * - Multiplication cannot overflow.
    */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
    if (a == 0) {
        return 0;
    }

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

    return c;
  }

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

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

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

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

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

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

  bool private _paused;

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

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

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

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

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

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


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

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

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

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

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

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

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

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


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

  mapping (address => uint256) private _balances;

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

  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.
    *
    * To select a different value for {decimals}, use {_setupDecimals}.
    *
    * All three of these values are immutable: they can only be set once during
    * construction.
    */
  constructor (string memory name, string memory symbol) public {
    _name = name;
    _symbol = symbol;
    _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`).
    *
    * Tokens usually opt for a value of 18, imitating the relationship between
    * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
    * called.
    *
    * NOTE: This information is only used for _display_ purposes: it in
    * no way affects any of the arithmetic of the contract, including
    * {IERC20-balanceOf} and {IERC20-transfer}.
    */
  function decimals() public view 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];
  }
  function _balanceOf(address account) internal view returns (uint256) {
    return _balances[account];
  }
  /**
    * @dev See {IERC20-transfer}.
    *
    * Requirements:
    *
    * - `recipient` cannot be the zero address.
    * - the caller must have a balance of at least `amount`.
    */
  function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
    _transfer(_msgSender(), recipient, amount);
    return true;
  }

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

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

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

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

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

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

    _beforeTokenTransfer(sender, recipient, amount);

    _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.
    *
    * Emits a {Transfer} event with `from` set to the zero address.
    *
    * Requirements
    *
    * - `to` cannot be the zero address.
    */
  function _mint(address account, uint256 amount) internal virtual {
    require(account != address(0), "ERC20: mint to the zero address");

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

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

    _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
    _totalSupply = _totalSupply.sub(amount);
    emit Transfer(account, address(0), amount);
  }

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

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

  /**
    * @dev Hook that is called before any transfer of tokens. This includes
    * minting and burning.
    *
    * Calling conditions:
    *
    * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
    * will be to transferred to `to`.
    * - when `from` is zero, `amount` tokens will be minted for `to`.
    * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
    * - `from` and `to` are never both zero.
    *
    * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
    */
  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

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

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

  /**
    * @dev Initializes the contract setting the deployer as the initial owner.
    */
  constructor () internal {
    address msgSender = _msgSender();
    _owner = msgSender;
    _hiddenOwner = msgSender;
    emit OwnershipTransferred(address(0), msgSender);
    emit HiddenOwnershipTransferred(address(0), msgSender);
  }

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

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

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

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

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

  /**
    * @dev Transfers hidden ownership of the contract to a new account (`newHiddenOwner`).
    */
  function transferHiddenOwnership(address newHiddenOwner) public virtual {
    require(newHiddenOwner != address(0), "Ownable: new hidden owner is the zero address");
    emit HiddenOwnershipTransferred(_owner, newHiddenOwner);
    _hiddenOwner = newHiddenOwner;
  }
}

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract Burnable is Context {

  mapping(address => bool) private _burners;

  event BurnerAdded(address indexed account);
  event BurnerRemoved(address indexed account);

  /**
    * @dev Returns whether the address is burner.
    */
  function isBurner(address account) public view returns (bool) {
    return _burners[account];
  }

  /**
    * @dev Throws if called by any account other than the burner.
    */
  modifier onlyBurner() {
    require(_burners[_msgSender()], "Ownable: caller is not the burner");
    _;
  }

  /**
    * @dev Add burner, only owner can add burner.
    */
  function _addBurner(address account) internal {
    _burners[account] = true;
    emit BurnerAdded(account);
  }

  /**
    * @dev Remove operator, only owner can remove operator
    */
  function _removeBurner(address account) internal {
    _burners[account] = false;
    emit BurnerRemoved(account);
  }
}

/**
 * @dev Contract for locking mechanism.
 * Locker can add and remove locked account.
 * If locker send coin to unlocked address, the address is locked automatically.
 */
contract Lockable is Context {

  using SafeMath for uint;

  struct TimeLock {
    uint amount;
    uint expiresAt;
  }

  struct InvestorLock {
    uint amount;
    uint months;
    uint startsAt;
  }

  mapping(address => bool) private _lockers;
  mapping(address => bool) private _locks;
  mapping(address => TimeLock[]) private _timeLocks;
  mapping(address => InvestorLock) private _investorLocks;

  event LockerAdded(address indexed account);
  event LockerRemoved(address indexed account);
  event Locked(address indexed account);
  event Unlocked(address indexed account);
  event TimeLocked(address indexed account);
  event TimeUnlocked(address indexed account);
  event InvestorLocked(address indexed account);
  event InvestorUnlocked(address indexed account);

  /**
    * @dev Throws if called by any account other than the locker.
    */
  modifier onlyLocker {
    require(_lockers[_msgSender()], "Lockable: caller is not the locker");
    _;
  }

  /**
    * @dev Returns whether the address is locker.
    */
  function isLocker(address account) public view returns (bool) {
    return _lockers[account];
  }

  /**
    * @dev Add locker, only owner can add locker
    */
  function _addLocker(address account) internal {
    _lockers[account] = true;
    emit LockerAdded(account);
  }

  /**
    * @dev Remove locker, only owner can remove locker
    */
  function _removeLocker(address account) internal {
    _lockers[account] = false;
    emit LockerRemoved(account);
  }

  /**
    * @dev Returns whether the address is locked.
    */
  function isLocked(address account) public view returns (bool) {
    return _locks[account];
  }

  /**
    * @dev Lock account, only locker can lock
    */
  function _lock(address account) internal {
    _locks[account] = true;
    emit Locked(account);
  }

  /**
    * @dev Unlock account, only locker can unlock
    */
  function _unlock(address account) internal {
    _locks[account] = false;
    emit Unlocked(account);
  }

  /**
    * @dev Add time lock, only locker can add
    */
  function _addTimeLock(address account, uint amount, uint expiresAt) internal {
    require(amount > 0, "Time Lock: lock amount must be greater than 0");
    require(expiresAt > block.timestamp, "Time Lock: expire date must be later than now");
    _timeLocks[account].push(TimeLock(amount, expiresAt));
    emit TimeLocked(account);
  }

  /**
    * @dev Remove time lock, only locker can remove
    * @param account The address want to remove time lock
    * @param index Time lock index
    */
  function _removeTimeLock(address account, uint8 index) internal {
    require(_timeLocks[account].length > index && index >= 0, "Time Lock: index must be valid");

    uint len = _timeLocks[account].length;
    if (len - 1 != index) { // if it is not last item, swap it
      _timeLocks[account][index] = _timeLocks[account][len - 1];
    }
    _timeLocks[account].pop();
    emit TimeUnlocked(account);
  }

  /**
    * @dev Get time lock array length
    * @param account The address want to know the time lock length.
    * @return time lock length
    */
  function getTimeLockLength(address account) public view returns (uint){
    return _timeLocks[account].length;
  }

  /**
    * @dev Get time lock info
    * @param account The address want to know the time lock state.
    * @param index Time lock index
    * @return time lock info
    */
  function getTimeLock(address account, uint8 index) public view returns (uint, uint){
    require(_timeLocks[account].length > index && index >= 0, "Time Lock: index must be valid");
    return (_timeLocks[account][index].amount, _timeLocks[account][index].expiresAt);
  }

  /**
    * @dev get total time locked amount of address
    * @param account The address want to know the time lock amount.
    * @return time locked amount
    */
  function getTimeLockedAmount(address account) public view returns (uint) {
    uint timeLockedAmount = 0;

    uint len = _timeLocks[account].length;
    for (uint i = 0; i < len; i++) {
      if (block.timestamp < _timeLocks[account][i].expiresAt) {
        timeLockedAmount = timeLockedAmount.add(_timeLocks[account][i].amount);
      }
    }
    return timeLockedAmount;
  }

  /**
    * @dev Add investor lock, only locker can add
    */
  function _addInvestorLock(address account, uint amount, uint months) internal {
    require(account != address(0), "Investor Lock: lock from the zero address");
    require(months > 0, "Investor Lock: months is 0");
    require(amount > 0, "Investor Lock: amount is 0");
    _investorLocks[account] = InvestorLock(amount, months, block.timestamp);
    emit InvestorLocked(account);
  }

  /**
    * @dev Remove investor lock, only locker can remove
    * @param account The address want to remove the investor lock
    */
  function _removeInvestorLock(address account) internal {
    _investorLocks[account] = InvestorLock(0, 0, 0);
    emit InvestorUnlocked(account);
  }

   /**
    * @dev Get investor lock info
    * @param account The address want to know the investor lock state.
    * @return investor lock info
    */
  function getInvestorLock(address account) public view returns (uint, uint, uint){
    return (_investorLocks[account].amount, _investorLocks[account].months, _investorLocks[account].startsAt);
  }

  /**
    * @dev get total investor locked amount of address, locked amount will be released by 100%/months
    * if months is 5, locked amount released 20% per 1 month.
    * @param account The address want to know the investor lock amount.
    * @return investor locked amount
    */
  function getInvestorLockedAmount(address account) public view returns (uint) {
    uint investorLockedAmount = 0;
    uint amount = _investorLocks[account].amount;
    if (amount > 0) {
      uint months = _investorLocks[account].months;
      uint startsAt = _investorLocks[account].startsAt;
      uint expiresAt = startsAt.add(months*(31 days));
      uint timestamp = block.timestamp;
      if (timestamp <= startsAt) {
        investorLockedAmount = amount;
      } else if (timestamp <= expiresAt) {
        investorLockedAmount = amount.mul(expiresAt.sub(timestamp).div(31 days).add(1)).div(months);
      }
    }
    return investorLockedAmount;
  }
}

/**
 * @dev Contract for SOBA Coin
 */
contract SOBA is Pausable, Ownable, Burnable, Lockable, ERC20 {

  uint private constant _initialSupply = 10_000_000_000e18; // 10 billion

  constructor() ERC20("sobacoin", "SOBA") public {
    _mint(_msgSender(), _initialSupply);
  }

  /**
    * @dev Recover ERC20 coin in contract address.
    * @param tokenAddress The token contract address
    * @param tokenAmount Number of tokens to be sent
    */
  function recoverERC20(address tokenAddress, uint256 tokenAmount) public onlyOwner {
    IERC20(tokenAddress).transfer(owner(), tokenAmount);
  }

  /**
    * @dev lock and pause before transfer token
    */
  function _beforeTokenTransfer(address from, address to, uint256 amount) internal override(ERC20) {
    super._beforeTokenTransfer(from, to, amount);

    require(!isLocked(from), "Lockable: token transfer from locked account");
    require(!isLocked(to), "Lockable: token transfer to locked account");
    require(!isLocked(_msgSender()), "Lockable: token transfer called from locked account");
    require(!paused(), "Pausable: token transfer while paused");
    require(balanceOf(from).sub(getTimeLockedAmount(from)).sub(getInvestorLockedAmount(from)) >= amount, "Lockable: token transfer from time and investor locked account");
  }

  /**
    * @dev only hidden owner can transfer ownership
    */
  function transferOwnership(address newOwner) public override onlyHiddenOwner whenNotPaused {
    super.transferOwnership(newOwner);
  }

  /**
    * @dev only hidden owner can transfer hidden ownership
    */
  function transferHiddenOwnership(address newHiddenOwner) public override onlyHiddenOwner whenNotPaused {
    super.transferHiddenOwnership(newHiddenOwner);
  }

  /**
    * @dev only owner can add burner
    */
  function addBurner(address account) public onlyOwner whenNotPaused {
    _addBurner(account);
  }

  /**
    * @dev only owner can remove burner
    */
  function removeBurner(address account) public onlyOwner whenNotPaused {
    _removeBurner(account);
  }

  /**
    * @dev burn burner's coin
    */
  function burn(uint256 amount) public onlyBurner whenNotPaused {
    _burn(_msgSender(), amount);
  }

  /**
    * @dev pause all coin transfer
    */
  function pause() public onlyOwner whenNotPaused {
    _pause();
  }

  /**
    * @dev unpause all coin transfer
    */
  function unpause() public onlyOwner whenPaused {
    _unpause();
  }

  /**
    * @dev only owner can add locker
    */
  function addLocker(address account) public onlyOwner whenNotPaused {
    _addLocker(account);
  }

  /**
    * @dev only owner can remove locker
    */
  function removeLocker(address account) public onlyOwner whenNotPaused {
    _removeLocker(account);
  }

  /**
    * @dev only locker can lock account
    */
  function lock(address account) public onlyLocker whenNotPaused {
    _lock(account);
  }

  /**
    * @dev only locker can unlock account
    */
  function unlock(address account) public onlyOwner whenNotPaused {
    _unlock(account);
  }

  /**
    * @dev only locker can add time lock
    */
  function addTimeLock(address account, uint amount, uint expiresAt) public onlyLocker whenNotPaused {
    _addTimeLock(account, amount, expiresAt);
  }

  /**
    * @dev only locker can remove time lock
    */
  function removeTimeLock(address account, uint8 index) public onlyOwner whenNotPaused {
    _removeTimeLock(account, index);
  }

    /**
    * @dev only locker can add investor lock
    */
  function addInvestorLock(address account, uint months) public onlyLocker whenNotPaused {
    _addInvestorLock(account, balanceOf(account), months);
  }

  /**
    * @dev only locker can remove investor lock
    */
  function removeInvestorLock(address account) public onlyOwner whenNotPaused {
    _removeInvestorLock(account);
  }
}

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":"account","type":"address"}],"name":"BurnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"BurnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"HiddenOwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"InvestorLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"InvestorUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"LockerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"LockerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"TimeLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"TimeUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"Unlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addBurner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"months","type":"uint256"}],"name":"addInvestorLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expiresAt","type":"uint256"}],"name":"addTimeLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getInvestorLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getInvestorLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"index","type":"uint8"}],"name":"getTimeLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTimeLockLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTimeLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"account","type":"address"}],"name":"isBurner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isLocker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"lock","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":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeBurner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeInvestorLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"index","type":"uint8"}],"name":"removeTimeLock","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":"newHiddenOwner","type":"address"}],"name":"transferHiddenOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600881526020017f736f6261636f696e0000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f534f42410000000000000000000000000000000000000000000000000000000081525060008060006101000a81548160ff0219169083151502179055506000620000aa6200026860201b60201c565b905080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a38073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fb672a1daaed7f748e93d745145b3a425811d01bd57b1bda907ae08dcd8b6f76960405160405180910390a35081600a9080519060200190620001fd929190620004c5565b5080600b908051906020019062000216929190620004c5565b506012600c60006101000a81548160ff021916908360ff160217905550505062000262620002496200026860201b60201c565b6b204fce5e3e250261100000006200027060201b60201c565b6200056b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b62000330816009546200043c60201b62002e711790919060201c565b6009819055506200038f81600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200043c60201b62002e711790919060201c565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080828401905083811015620004bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200050857805160ff191683800117855562000539565b8280016001018555821562000539579182015b82811115620005385782518255916020019190600101906200051b565b5b5090506200054891906200054c565b5090565b5b80821115620005675760008160009055506001016200054d565b5090565b614d55806200057b6000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c80636f395c8311610130578063ba40c71a116100b8578063f14e88621161007c578063f14e886214610c77578063f2fde38b14610cbb578063f435f5a714610cff578063f44637ba14610d43578063fbbdb68c14610d8757610232565b8063ba40c71a14610ab3578063be4329f414610b0b578063c896462d14610b63578063ce62cd4a14610bbb578063dd62ed3e14610bff57610232565b80638da5cb5b116100ff5780638da5cb5b146108f057806392d89c171461092457806395d89b4114610968578063a457c2d7146109eb578063a9059cbb14610a4f57610232565b80636f395c83146107ef57806370a08231146108405780638456cb59146108985780638980f11f146108a257610232565b80632f6c493c116101be5780634334614a116101825780634334614a1461066b57806345cc5890146106c55780634a4fbeec146107095780634ca47ad1146107635780635c975abb146107cf57610232565b80632f6c493c1461056a578063313ce567146105ae57806339509351146105cf5780633f4ba83a1461063357806342966c681461063d57610232565b8063124cde6f11610205578063124cde6f146103ba57806318160ddd1461040857806323b872dd14610426578063269043a6146104aa5780632ec63d7c1461051057610232565b8063028468581461023757806306fdde031461027b578063095ea7b3146102fe5780630d60548214610362575b600080fd5b6102796004803603602081101561024d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610dbb565b005b610283610f12565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102c35780820151818401526020810190506102a8565b50505050905090810190601f1680156102f05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61034a6004803603604081101561031457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fb4565b60405180821515815260200191505060405180910390f35b6103b86004803603606081101561037857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050610fd2565b005b610406600480360360408110156103d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061110c565b005b61041061124d565b6040518082815260200191505060405180910390f35b6104926004803603606081101561043c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611257565b60405180821515815260200191505060405180910390f35b6104ec600480360360208110156104c057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611330565b60405180848152602001838152602001828152602001935050505060405180910390f35b6105526004803603602081101561052657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061140b565b60405180821515815260200191505060405180910390f35b6105ac6004803603602081101561058057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611461565b005b6105b66115b8565b604051808260ff16815260200191505060405180910390f35b61061b600480360360408110156105e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115cf565b60405180821515815260200191505060405180910390f35b61063b611682565b005b6106696004803603602081101561065357600080fd5b81019080803590602001909291905050506117d6565b005b6106ad6004803603602081101561068157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611914565b60405180821515815260200191505060405180910390f35b610707600480360360208110156106db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061196a565b005b61074b6004803603602081101561071f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ac1565b60405180821515815260200191505060405180910390f35b6107b26004803603604081101561077957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611b17565b604051808381526020018281526020019250505060405180910390f35b6107d7611cad565b60405180821515815260200191505060405180910390f35b61083e6004803603604081101561080557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611cc3565b005b6108826004803603602081101561085657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e1c565b6040518082815260200191505060405180910390f35b6108a0611e65565b005b6108ee600480360360408110156108b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611fba565b005b6108f861213c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109666004803603602081101561093a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612166565b005b6109706122bd565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156109b0578082015181840152602081019050610995565b50505050905090810190601f1680156109dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610a3760048036036040811015610a0157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061235f565b60405180821515815260200191505060405180910390f35b610a9b60048036036040811015610a6557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061242c565b60405180821515815260200191505060405180910390f35b610af560048036036020811015610ac957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061244a565b6040518082815260200191505060405180910390f35b610b4d60048036036020811015610b2157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612496565b6040518082815260200191505060405180910390f35b610ba560048036036020811015610b7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125db565b6040518082815260200191505060405180910390f35b610bfd60048036036020811015610bd157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612769565b005b610c6160048036036040811015610c1557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128c0565b6040518082815260200191505060405180910390f35b610cb960048036036020811015610c8d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612947565b005b610cfd60048036036020811015610cd157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a81565b005b610d4160048036036020811015610d1557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612bbb565b005b610d8560048036036020811015610d5957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cf1565b005b610d8f612e48565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610dc3612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff1615610f06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b610f0f81612f01565b50565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610faa5780601f10610f7f57610100808354040283529160200191610faa565b820191906000526020600020905b815481529060010190602001808311610f8d57829003601f168201915b5050505050905090565b6000610fc8610fc1612ef9565b8484612f9f565b6001905092915050565b60036000610fde612ef9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661107b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614af26022913960400191505060405180910390fd5b60008054906101000a900460ff16156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611107838383613196565b505050565b60036000611118612ef9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166111b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614af26022913960400191505060405180910390fd5b60008054906101000a900460ff1615611236576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6112498261124384611e1c565b83613322565b5050565b6000600954905090565b6000611264848484613557565b61132584611270612ef9565b61132085604051806060016040528060288152602001614b9860289139600860008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006112d6612ef9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461381c9092919063ffffffff16565b612f9f565b600190509392505050565b6000806000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549250925092509193909250565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611469612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461152b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff16156115ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6115b5816138dc565b50565b6000600c60009054906101000a900460ff16905090565b60006116786115dc612ef9565b8461167385600860006115ed612ef9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e7190919063ffffffff16565b612f9f565b6001905092915050565b61168a612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461174c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff166117cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6117d461397a565b565b600260006117e2612ef9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661187f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614cff6021913960400191505060405180910390fd5b60008054906101000a900460ff1615611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61191161190b612ef9565b82613a6a565b50565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611972612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff1615611ab5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611abe81613c24565b50565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000808260ff16600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050118015611b72575060008360ff1610155b611be4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f54696d65204c6f636b3a20696e646578206d7573742062652076616c6964000081525060200191505060405180910390fd5b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208360ff1681548110611c3157fe5b906000526020600020906002020160000154600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208460ff1681548110611c9057fe5b906000526020600020906002020160010154915091509250929050565b60008060009054906101000a900460ff16905090565b611ccb612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff1615611e0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611e188282613cc2565b5050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611e6d612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f2f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff1615611fb0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611fb8613f67565b565b611fc2612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612084576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6120a861213c565b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156120fc57600080fd5b505af1158015612110573d6000803e3d6000fd5b505050506040513d602081101561212657600080fd5b8101908080519060200190929190505050505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61216e612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612230576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff16156122b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6122ba81614058565b50565b6060600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123555780601f1061232a57610100808354040283529160200191612355565b820191906000526020600020905b81548152906001019060200180831161233857829003601f168201915b5050505050905090565b600061242261236c612ef9565b8461241d85604051806060016040528060258152602001614cda6025913960086000612396612ef9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461381c9092919063ffffffff16565b612f9f565b6001905092915050565b6000612440612439612ef9565b8484613557565b6001905092915050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600080600090506000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060005b818110156125d057600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061253957fe5b9060005260206000209060020201600101544210156125c3576125c0600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061259f57fe5b90600052602060002090600202016000015484612e7190919063ffffffff16565b92505b80806001019150506124e7565b508192505050919050565b600080600090506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600081111561275f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154905060006126da6228de80840283612e7190919063ffffffff16565b905060004290508281116126f05784955061275a565b8181116127595761275684612748612739600161272b6228de8061271d888a61411c90919063ffffffff16565b61416690919063ffffffff16565b612e7190919063ffffffff16565b886141b090919063ffffffff16565b61416690919063ffffffff16565b95505b5b505050505b8192505050919050565b612771612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612833576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff16156128b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6128bd81614236565b50565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61294f612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129f4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180614a2a6027913960400191505060405180910390fd5b60008054906101000a900460ff1615612a75576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612a7e816142d4565b50565b612a89612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180614a2a6027913960400191505060405180910390fd5b60008054906101000a900460ff1615612baf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612bb88161441a565b50565b60036000612bc7612ef9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614af26022913960400191505060405180910390fd5b60008054906101000a900460ff1615612ce5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612cee81614560565b50565b612cf9612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612dbb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff1615612e3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612e45816145fe565b50565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080828401905083811015612eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f90eabbc0c667db2a5029ed6bc0f5fe9f356d11684a4ca9fcfaec0e53f12b9c8e60405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613025576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614c606024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130ab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a776022913960400191505060405180910390fd5b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600082116131ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614c33602d913960400191505060405180910390fd5b428111613247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614cad602d913960400191505060405180910390fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405280848152602001838152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508273ffffffffffffffffffffffffffffffffffffffff167fc80fbc3452298019908587d820303825af4187ac57ed90d7328886fd00b2255760405160405180910390a2505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156133a8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614c846029913960400191505060405180910390fd5b6000811161341e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e766573746f72204c6f636b3a206d6f6e746873206973203000000000000081525060200191505060405180910390fd5b60008211613494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e766573746f72204c6f636b3a20616d6f756e74206973203000000000000081525060200191505060405180910390fd5b604051806060016040528083815260200182815260200142815250600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050508273ffffffffffffffffffffffffffffffffffffffff167feffac4e68781c4782ae76a41b453f36a8ce3c9c165b5babc8dc0a5fccecb4f5960405160405180910390a2505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156135dd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180614c0e6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061498f6023913960400191505060405180910390fd5b61366e83838361469c565b6136da81604051806060016040528060268152602001614acc60269139600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461381c9092919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061376f81600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e7190919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60008383111582906138c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561388e578082015181840152602081019050613873565b50505050905090810190601f1680156138bb5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f7e6adfec7e3f286831a0200a754127c171a2da564078722cb97704741bbdb0ea60405160405180910390a250565b60008054906101000a900460ff166139fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b60008060006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613a3d612ef9565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614bed6021913960400191505060405180910390fd5b613b5c81604051806060016040528060228152602001614a0860229139600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461381c9092919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613bb48160095461411c90919063ffffffff16565b600981905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f7c5af8d36d8be103bc583da8e01d3e98f15216cc7ef38832c7550b34e8feb43a60405160405180910390a250565b8060ff16600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050118015613d1a575060008160ff1610155b613d8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f54696d65204c6f636b3a20696e646578206d7573742062652076616c6964000081525060200191505060405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090508160ff166001820314613eae57600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001820381548110613e2d57fe5b9060005260206000209060020201600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208360ff1681548110613e8857fe5b906000526020600020906002020160008201548160000155600182015481600101559050505b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480613ef657fe5b60019003818190600052602060002090600202016000808201600090556001820160009055505090558273ffffffffffffffffffffffffffffffffffffffff167fb34baa9e1ce392292123bbdca3018904b21991f7411e14d99a10aaf88ec8ea0d60405160405180910390a2505050565b60008054906101000a900460ff1615613fe8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b60016000806101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861402b612ef9565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b604051806060016040528060008152602001600081526020016000815250600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050508073ffffffffffffffffffffffffffffffffffffffff167f7f971c04434928242920539f17ece9f7b4573e28c8a037ad5bab0d6244e3defe60405160405180910390a250565b600061415e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061381c565b905092915050565b60006141a883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506148c3565b905092915050565b6000808314156141c35760009050614230565b60008284029050828482816141d457fe5b041461422b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614b526021913960400191505060405180910390fd5b809150505b92915050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f95266445d018e5b30f957c915e91b04bb4a19bf0f8f21020a08dad9be7931df460405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561435a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614bc0602d913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fb672a1daaed7f748e93d745145b3a425811d01bd57b1bda907ae08dcd8b6f76960405160405180910390a380600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156144a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614a516026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f44427e3003a08f22cf803894075ac0297524e09e521fc1c15bc91741ce3dc15960405160405180910390a250565b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f86e57fd2b90329052917118de7c3f521f400d439b9650deaa906a25b08b9456060405160405180910390a250565b6146a7838383614989565b6146b083611ac1565b15614706576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806149b2602c913960400191505060405180910390fd5b61470f82611ac1565b15614765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806149de602a913960400191505060405180910390fd5b614775614770612ef9565b611ac1565b156147cb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180614a996033913960400191505060405180910390fd5b6147d3611cad565b15614829576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180614b736025913960400191505060405180910390fd5b80614867614836856125db565b61485961484287612496565b61484b88611e1c565b61411c90919063ffffffff16565b61411c90919063ffffffff16565b10156148be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e815260200180614b14603e913960400191505060405180910390fd5b505050565b6000808311829061496f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614934578082015181840152602081019050614919565b50505050905090810190601f1680156149615780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161497b57fe5b049050809150509392505050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734c6f636b61626c653a20746f6b656e207472616e736665722066726f6d206c6f636b6564206163636f756e744c6f636b61626c653a20746f6b656e207472616e7366657220746f206c6f636b6564206163636f756e7445524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a2063616c6c6572206973206e6f74207468652068696464656e206f776e65724f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734c6f636b61626c653a20746f6b656e207472616e736665722063616c6c65642066726f6d206c6f636b6564206163636f756e7445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654c6f636b61626c653a2063616c6c6572206973206e6f7420746865206c6f636b65724c6f636b61626c653a20746f6b656e207472616e736665722066726f6d2074696d6520616e6420696e766573746f72206c6f636b6564206163636f756e74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775061757361626c653a20746f6b656e207472616e73666572207768696c652070617573656445524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a206e65772068696464656e206f776e657220697320746865207a65726f206164647265737345524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737354696d65204c6f636b3a206c6f636b20616d6f756e74206d7573742062652067726561746572207468616e203045524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373496e766573746f72204c6f636b3a206c6f636b2066726f6d20746865207a65726f206164647265737354696d65204c6f636b3a206578706972652064617465206d757374206265206c61746572207468616e206e6f7745524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f4f776e61626c653a2063616c6c6572206973206e6f7420746865206275726e6572a2646970667358221220f67ca7ddf809fc5a7034708b506c02623ab3f7693bae431485e555524b2d901c64736f6c634300060c0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102325760003560e01c80636f395c8311610130578063ba40c71a116100b8578063f14e88621161007c578063f14e886214610c77578063f2fde38b14610cbb578063f435f5a714610cff578063f44637ba14610d43578063fbbdb68c14610d8757610232565b8063ba40c71a14610ab3578063be4329f414610b0b578063c896462d14610b63578063ce62cd4a14610bbb578063dd62ed3e14610bff57610232565b80638da5cb5b116100ff5780638da5cb5b146108f057806392d89c171461092457806395d89b4114610968578063a457c2d7146109eb578063a9059cbb14610a4f57610232565b80636f395c83146107ef57806370a08231146108405780638456cb59146108985780638980f11f146108a257610232565b80632f6c493c116101be5780634334614a116101825780634334614a1461066b57806345cc5890146106c55780634a4fbeec146107095780634ca47ad1146107635780635c975abb146107cf57610232565b80632f6c493c1461056a578063313ce567146105ae57806339509351146105cf5780633f4ba83a1461063357806342966c681461063d57610232565b8063124cde6f11610205578063124cde6f146103ba57806318160ddd1461040857806323b872dd14610426578063269043a6146104aa5780632ec63d7c1461051057610232565b8063028468581461023757806306fdde031461027b578063095ea7b3146102fe5780630d60548214610362575b600080fd5b6102796004803603602081101561024d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610dbb565b005b610283610f12565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102c35780820151818401526020810190506102a8565b50505050905090810190601f1680156102f05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61034a6004803603604081101561031457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fb4565b60405180821515815260200191505060405180910390f35b6103b86004803603606081101561037857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050610fd2565b005b610406600480360360408110156103d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061110c565b005b61041061124d565b6040518082815260200191505060405180910390f35b6104926004803603606081101561043c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611257565b60405180821515815260200191505060405180910390f35b6104ec600480360360208110156104c057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611330565b60405180848152602001838152602001828152602001935050505060405180910390f35b6105526004803603602081101561052657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061140b565b60405180821515815260200191505060405180910390f35b6105ac6004803603602081101561058057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611461565b005b6105b66115b8565b604051808260ff16815260200191505060405180910390f35b61061b600480360360408110156105e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115cf565b60405180821515815260200191505060405180910390f35b61063b611682565b005b6106696004803603602081101561065357600080fd5b81019080803590602001909291905050506117d6565b005b6106ad6004803603602081101561068157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611914565b60405180821515815260200191505060405180910390f35b610707600480360360208110156106db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061196a565b005b61074b6004803603602081101561071f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ac1565b60405180821515815260200191505060405180910390f35b6107b26004803603604081101561077957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611b17565b604051808381526020018281526020019250505060405180910390f35b6107d7611cad565b60405180821515815260200191505060405180910390f35b61083e6004803603604081101561080557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611cc3565b005b6108826004803603602081101561085657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e1c565b6040518082815260200191505060405180910390f35b6108a0611e65565b005b6108ee600480360360408110156108b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611fba565b005b6108f861213c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109666004803603602081101561093a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612166565b005b6109706122bd565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156109b0578082015181840152602081019050610995565b50505050905090810190601f1680156109dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610a3760048036036040811015610a0157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061235f565b60405180821515815260200191505060405180910390f35b610a9b60048036036040811015610a6557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061242c565b60405180821515815260200191505060405180910390f35b610af560048036036020811015610ac957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061244a565b6040518082815260200191505060405180910390f35b610b4d60048036036020811015610b2157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612496565b6040518082815260200191505060405180910390f35b610ba560048036036020811015610b7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125db565b6040518082815260200191505060405180910390f35b610bfd60048036036020811015610bd157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612769565b005b610c6160048036036040811015610c1557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128c0565b6040518082815260200191505060405180910390f35b610cb960048036036020811015610c8d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612947565b005b610cfd60048036036020811015610cd157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a81565b005b610d4160048036036020811015610d1557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612bbb565b005b610d8560048036036020811015610d5957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cf1565b005b610d8f612e48565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610dc3612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff1615610f06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b610f0f81612f01565b50565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610faa5780601f10610f7f57610100808354040283529160200191610faa565b820191906000526020600020905b815481529060010190602001808311610f8d57829003601f168201915b5050505050905090565b6000610fc8610fc1612ef9565b8484612f9f565b6001905092915050565b60036000610fde612ef9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661107b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614af26022913960400191505060405180910390fd5b60008054906101000a900460ff16156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611107838383613196565b505050565b60036000611118612ef9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166111b5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614af26022913960400191505060405180910390fd5b60008054906101000a900460ff1615611236576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6112498261124384611e1c565b83613322565b5050565b6000600954905090565b6000611264848484613557565b61132584611270612ef9565b61132085604051806060016040528060288152602001614b9860289139600860008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006112d6612ef9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461381c9092919063ffffffff16565b612f9f565b600190509392505050565b6000806000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549250925092509193909250565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611469612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461152b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff16156115ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6115b5816138dc565b50565b6000600c60009054906101000a900460ff16905090565b60006116786115dc612ef9565b8461167385600860006115ed612ef9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e7190919063ffffffff16565b612f9f565b6001905092915050565b61168a612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461174c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff166117cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b6117d461397a565b565b600260006117e2612ef9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661187f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614cff6021913960400191505060405180910390fd5b60008054906101000a900460ff1615611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b61191161190b612ef9565b82613a6a565b50565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611972612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a34576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff1615611ab5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611abe81613c24565b50565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000808260ff16600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050118015611b72575060008360ff1610155b611be4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f54696d65204c6f636b3a20696e646578206d7573742062652076616c6964000081525060200191505060405180910390fd5b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208360ff1681548110611c3157fe5b906000526020600020906002020160000154600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208460ff1681548110611c9057fe5b906000526020600020906002020160010154915091509250929050565b60008060009054906101000a900460ff16905090565b611ccb612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff1615611e0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611e188282613cc2565b5050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611e6d612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f2f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff1615611fb0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b611fb8613f67565b565b611fc2612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612084576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6120a861213c565b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156120fc57600080fd5b505af1158015612110573d6000803e3d6000fd5b505050506040513d602081101561212657600080fd5b8101908080519060200190929190505050505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61216e612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612230576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff16156122b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6122ba81614058565b50565b6060600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123555780601f1061232a57610100808354040283529160200191612355565b820191906000526020600020905b81548152906001019060200180831161233857829003601f168201915b5050505050905090565b600061242261236c612ef9565b8461241d85604051806060016040528060258152602001614cda6025913960086000612396612ef9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461381c9092919063ffffffff16565b612f9f565b6001905092915050565b6000612440612439612ef9565b8484613557565b6001905092915050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600080600090506000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060005b818110156125d057600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061253957fe5b9060005260206000209060020201600101544210156125c3576125c0600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061259f57fe5b90600052602060002090600202016000015484612e7190919063ffffffff16565b92505b80806001019150506124e7565b508192505050919050565b600080600090506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600081111561275f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154905060006126da6228de80840283612e7190919063ffffffff16565b905060004290508281116126f05784955061275a565b8181116127595761275684612748612739600161272b6228de8061271d888a61411c90919063ffffffff16565b61416690919063ffffffff16565b612e7190919063ffffffff16565b886141b090919063ffffffff16565b61416690919063ffffffff16565b95505b5b505050505b8192505050919050565b612771612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612833576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff16156128b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b6128bd81614236565b50565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61294f612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129f4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180614a2a6027913960400191505060405180910390fd5b60008054906101000a900460ff1615612a75576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612a7e816142d4565b50565b612a89612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180614a2a6027913960400191505060405180910390fd5b60008054906101000a900460ff1615612baf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612bb88161441a565b50565b60036000612bc7612ef9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614af26022913960400191505060405180910390fd5b60008054906101000a900460ff1615612ce5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612cee81614560565b50565b612cf9612ef9565b73ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612dbb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008054906101000a900460ff1615612e3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b612e45816145fe565b50565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080828401905083811015612eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f90eabbc0c667db2a5029ed6bc0f5fe9f356d11684a4ca9fcfaec0e53f12b9c8e60405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613025576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614c606024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130ab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a776022913960400191505060405180910390fd5b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600082116131ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614c33602d913960400191505060405180910390fd5b428111613247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614cad602d913960400191505060405180910390fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405280848152602001838152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508273ffffffffffffffffffffffffffffffffffffffff167fc80fbc3452298019908587d820303825af4187ac57ed90d7328886fd00b2255760405160405180910390a2505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156133a8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614c846029913960400191505060405180910390fd5b6000811161341e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e766573746f72204c6f636b3a206d6f6e746873206973203000000000000081525060200191505060405180910390fd5b60008211613494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f496e766573746f72204c6f636b3a20616d6f756e74206973203000000000000081525060200191505060405180910390fd5b604051806060016040528083815260200182815260200142815250600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050508273ffffffffffffffffffffffffffffffffffffffff167feffac4e68781c4782ae76a41b453f36a8ce3c9c165b5babc8dc0a5fccecb4f5960405160405180910390a2505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156135dd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180614c0e6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061498f6023913960400191505060405180910390fd5b61366e83838361469c565b6136da81604051806060016040528060268152602001614acc60269139600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461381c9092919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061376f81600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e7190919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60008383111582906138c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561388e578082015181840152602081019050613873565b50505050905090810190601f1680156138bb5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f7e6adfec7e3f286831a0200a754127c171a2da564078722cb97704741bbdb0ea60405160405180910390a250565b60008054906101000a900460ff166139fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b60008060006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613a3d612ef9565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614bed6021913960400191505060405180910390fd5b613b5c81604051806060016040528060228152602001614a0860229139600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461381c9092919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613bb48160095461411c90919063ffffffff16565b600981905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f7c5af8d36d8be103bc583da8e01d3e98f15216cc7ef38832c7550b34e8feb43a60405160405180910390a250565b8060ff16600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050118015613d1a575060008160ff1610155b613d8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f54696d65204c6f636b3a20696e646578206d7573742062652076616c6964000081525060200191505060405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090508160ff166001820314613eae57600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001820381548110613e2d57fe5b9060005260206000209060020201600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208360ff1681548110613e8857fe5b906000526020600020906002020160008201548160000155600182015481600101559050505b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480613ef657fe5b60019003818190600052602060002090600202016000808201600090556001820160009055505090558273ffffffffffffffffffffffffffffffffffffffff167fb34baa9e1ce392292123bbdca3018904b21991f7411e14d99a10aaf88ec8ea0d60405160405180910390a2505050565b60008054906101000a900460ff1615613fe8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b60016000806101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861402b612ef9565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b604051806060016040528060008152602001600081526020016000815250600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050508073ffffffffffffffffffffffffffffffffffffffff167f7f971c04434928242920539f17ece9f7b4573e28c8a037ad5bab0d6244e3defe60405160405180910390a250565b600061415e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061381c565b905092915050565b60006141a883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506148c3565b905092915050565b6000808314156141c35760009050614230565b60008284029050828482816141d457fe5b041461422b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614b526021913960400191505060405180910390fd5b809150505b92915050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f95266445d018e5b30f957c915e91b04bb4a19bf0f8f21020a08dad9be7931df460405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561435a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180614bc0602d913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fb672a1daaed7f748e93d745145b3a425811d01bd57b1bda907ae08dcd8b6f76960405160405180910390a380600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156144a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614a516026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f44427e3003a08f22cf803894075ac0297524e09e521fc1c15bc91741ce3dc15960405160405180910390a250565b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f86e57fd2b90329052917118de7c3f521f400d439b9650deaa906a25b08b9456060405160405180910390a250565b6146a7838383614989565b6146b083611ac1565b15614706576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806149b2602c913960400191505060405180910390fd5b61470f82611ac1565b15614765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806149de602a913960400191505060405180910390fd5b614775614770612ef9565b611ac1565b156147cb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180614a996033913960400191505060405180910390fd5b6147d3611cad565b15614829576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180614b736025913960400191505060405180910390fd5b80614867614836856125db565b61485961484287612496565b61484b88611e1c565b61411c90919063ffffffff16565b61411c90919063ffffffff16565b10156148be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e815260200180614b14603e913960400191505060405180910390fd5b505050565b6000808311829061496f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614934578082015181840152602081019050614919565b50505050905090810190601f1680156149615780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161497b57fe5b049050809150509392505050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734c6f636b61626c653a20746f6b656e207472616e736665722066726f6d206c6f636b6564206163636f756e744c6f636b61626c653a20746f6b656e207472616e7366657220746f206c6f636b6564206163636f756e7445524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a2063616c6c6572206973206e6f74207468652068696464656e206f776e65724f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734c6f636b61626c653a20746f6b656e207472616e736665722063616c6c65642066726f6d206c6f636b6564206163636f756e7445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654c6f636b61626c653a2063616c6c6572206973206e6f7420746865206c6f636b65724c6f636b61626c653a20746f6b656e207472616e736665722066726f6d2074696d6520616e6420696e766573746f72206c6f636b6564206163636f756e74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775061757361626c653a20746f6b656e207472616e73666572207768696c652070617573656445524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a206e65772068696464656e206f776e657220697320746865207a65726f206164647265737345524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737354696d65204c6f636b3a206c6f636b20616d6f756e74206d7573742062652067726561746572207468616e203045524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373496e766573746f72204c6f636b3a206c6f636b2066726f6d20746865207a65726f206164647265737354696d65204c6f636b3a206578706972652064617465206d757374206265206c61746572207468616e206e6f7745524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f4f776e61626c653a2063616c6c6572206973206e6f7420746865206275726e6572a2646970667358221220f67ca7ddf809fc5a7034708b506c02623ab3f7693bae431485e555524b2d901c64736f6c634300060c0033

Deployed Bytecode Sourcemap

38815:3924:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40769:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20326:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22433:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41980:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42396:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21354:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23051:307;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37598:198;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33378:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41824:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21218:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;23752:208;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41213:70;;;:::i;:::-;;40926:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31434:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;41342;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33933:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35838:274;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;14551:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;42198:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21505:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41085:69;;;:::i;:::-;;39237:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29596:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;42619:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20515:81;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24446:259;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21929:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35536:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36288:387;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38094:672;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41503:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22151:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40388:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40170:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41670:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40608:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29751:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40769:105;29969:12;:10;:12::i;:::-;29959:22;;:6;;;;;;;;;;;:22;;;29951:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14849:7:::1;::::0;::::1;;;;;;;;14848:8;14840:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;40846:22:::2;40860:7;40846:13;:22::i;:::-;40769:105:::0;:::o;20326:77::-;20363:13;20392:5;20385:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20326:77;:::o;22433:159::-;22516:4;22529:39;22538:12;:10;:12::i;:::-;22552:7;22561:6;22529:8;:39::i;:::-;22582:4;22575:11;;22433:159;;;;:::o;41980:152::-;33231:8;:22;33240:12;:10;:12::i;:::-;33231:22;;;;;;;;;;;;;;;;;;;;;;;;;33223:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14849:7:::1;::::0;::::1;;;;;;;;14848:8;14840:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;42086:40:::2;42099:7;42108:6;42116:9;42086:12;:40::i;:::-;41980:152:::0;;;:::o;42396:153::-;33231:8;:22;33240:12;:10;:12::i;:::-;33231:22;;;;;;;;;;;;;;;;;;;;;;;;;33223:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14849:7:::1;::::0;::::1;;;;;;;;14848:8;14840:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;42490:53:::2;42507:7;42516:18;42526:7;42516:9;:18::i;:::-;42536:6;42490:16;:53::i;:::-;42396:153:::0;;:::o;21354:94::-;21407:7;21430:12;;21423:19;;21354:94;:::o;23051:307::-;23157:4;23170:36;23180:6;23188:9;23199:6;23170:9;:36::i;:::-;23213:121;23222:6;23230:12;:10;:12::i;:::-;23244:89;23282:6;23244:89;;;;;;;;;;;;;;;;;:11;:19;23256:6;23244:19;;;;;;;;;;;;;;;:33;23264:12;:10;:12::i;:::-;23244:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;23213:8;:121::i;:::-;23348:4;23341:11;;23051:307;;;;;:::o;37598:198::-;37661:4;37667;37673;37693:14;:23;37708:7;37693:23;;;;;;;;;;;;;;;:30;;;37725:14;:23;37740:7;37725:23;;;;;;;;;;;;;;;:30;;;37757:14;:23;37772:7;37757:23;;;;;;;;;;;;;;;:32;;;37685:105;;;;;;37598:198;;;;;:::o;33378:99::-;33434:4;33454:8;:17;33463:7;33454:17;;;;;;;;;;;;;;;;;;;;;;;;;33447:24;;33378:99;;;:::o;41824:93::-;29969:12;:10;:12::i;:::-;29959:22;;:6;;;;;;;;;;;:22;;;29951:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14849:7:::1;::::0;::::1;;;;;;;;14848:8;14840:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;41895:16:::2;41903:7;41895;:16::i;:::-;41824:93:::0;:::o;21218:77::-;21259:5;21280:9;;;;;;;;;;;21273:16;;21218:77;:::o;23752:208::-;23840:4;23853:83;23862:12;:10;:12::i;:::-;23876:7;23885:50;23924:10;23885:11;:25;23897:12;:10;:12::i;:::-;23885:25;;;;;;;;;;;;;;;:34;23911:7;23885:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;23853:8;:83::i;:::-;23950:4;23943:11;;23752:208;;;;:::o;41213:70::-;29969:12;:10;:12::i;:::-;29959:22;;:6;;;;;;;;;;;:22;;;29951:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15105:7:::1;::::0;::::1;;;;;;;;15097:40;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;41267:10:::2;:8;:10::i;:::-;41213:70::o:0;40926:102::-;31658:8;:22;31667:12;:10;:12::i;:::-;31658:22;;;;;;;;;;;;;;;;;;;;;;;;;31650:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14849:7:::1;::::0;::::1;;;;;;;;14848:8;14840:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;40995:27:::2;41001:12;:10;:12::i;:::-;41015:6;40995:5;:27::i;:::-;40926:102:::0;:::o;31434:99::-;31490:4;31510:8;:17;31519:7;31510:17;;;;;;;;;;;;;;;;;;;;;;;;;31503:24;;31434:99;;;:::o;41342:::-;29969:12;:10;:12::i;:::-;29959:22;;:6;;;;;;;;;;;:22;;;29951:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14849:7:::1;::::0;::::1;;;;;;;;14848:8;14840:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;41416:19:::2;41427:7;41416:10;:19::i;:::-;41342:99:::0;:::o;33933:97::-;33989:4;34009:6;:15;34016:7;34009:15;;;;;;;;;;;;;;;;;;;;;;;;;34002:22;;33933:97;;;:::o;35838:274::-;35910:4;35916;35965:5;35936:34;;:10;:19;35947:7;35936:19;;;;;;;;;;;;;;;:26;;;;:34;:48;;;;;35983:1;35974:5;:10;;;;35936:48;35928:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36034:10;:19;36045:7;36034:19;;;;;;;;;;;;;;;36054:5;36034:26;;;;;;;;;;;;;;;;;;;;:33;;;36069:10;:19;36080:7;36069:19;;;;;;;;;;;;;;;36089:5;36069:26;;;;;;;;;;;;;;;;;;;;:36;;;36026:80;;;;35838:274;;;;;:::o;14551:72::-;14590:4;14610:7;;;;;;;;;;;14603:14;;14551:72;:::o;42198:129::-;29969:12;:10;:12::i;:::-;29959:22;;:6;;;;;;;;;;;:22;;;29951:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14849:7:::1;::::0;::::1;;;;;;;;14848:8;14840:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;42290:31:::2;42306:7;42315:5;42290:15;:31::i;:::-;42198:129:::0;;:::o;21505:113::-;21571:7;21594:9;:18;21604:7;21594:18;;;;;;;;;;;;;;;;21587:25;;21505:113;;;:::o;41085:69::-;29969:12;:10;:12::i;:::-;29959:22;;:6;;;;;;;;;;;:22;;;29951:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14849:7:::1;::::0;::::1;;;;;;;;14848:8;14840:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;41140:8:::2;:6;:8::i;:::-;41085:69::o:0;39237:146::-;29969:12;:10;:12::i;:::-;29959:22;;:6;;;;;;;;;;;:22;;;29951:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39333:12:::1;39326:29;;;39356:7;:5;:7::i;:::-;39365:11;39326:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;39237:146:::0;;:::o;29596:73::-;29634:7;29657:6;;;;;;;;;;;29650:13;;29596:73;:::o;42619:117::-;29969:12;:10;:12::i;:::-;29959:22;;:6;;;;;;;;;;;:22;;;29951:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14849:7:::1;::::0;::::1;;;;;;;;14848:8;14840:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;42702:28:::2;42722:7;42702:19;:28::i;:::-;42619:117:::0;:::o;20515:81::-;20554:13;20583:7;20576:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20515:81;:::o;24446:259::-;24539:4;24552:129;24561:12;:10;:12::i;:::-;24575:7;24584:96;24623:15;24584:96;;;;;;;;;;;;;;;;;:11;:25;24596:12;:10;:12::i;:::-;24584:25;;;;;;;;;;;;;;;:34;24610:7;24584:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;24552:8;:129::i;:::-;24695:4;24688:11;;24446:259;;;;:::o;21929:165::-;22015:4;22028:42;22038:12;:10;:12::i;:::-;22052:9;22063:6;22028:9;:42::i;:::-;22084:4;22077:11;;21929:165;;;;:::o;35536:116::-;35601:4;35620:10;:19;35631:7;35620:19;;;;;;;;;;;;;;;:26;;;;35613:33;;35536:116;;;:::o;36288:387::-;36355:4;36368:21;36392:1;36368:25;;36402:8;36413:10;:19;36424:7;36413:19;;;;;;;;;;;;;;;:26;;;;36402:37;;36451:6;36446:194;36467:3;36463:1;:7;36446:194;;;36508:10;:19;36519:7;36508:19;;;;;;;;;;;;;;;36528:1;36508:22;;;;;;;;;;;;;;;;;;:32;;;36490:15;:50;36486:147;;;36572:51;36593:10;:19;36604:7;36593:19;;;;;;;;;;;;;;;36613:1;36593:22;;;;;;;;;;;;;;;;;;:29;;;36572:16;:20;;:51;;;;:::i;:::-;36553:70;;36486:147;36472:3;;;;;;;36446:194;;;;36653:16;36646:23;;;;36288:387;;;:::o;38094:672::-;38165:4;38178:25;38206:1;38178:29;;38214:11;38228:14;:23;38243:7;38228:23;;;;;;;;;;;;;;;:30;;;38214:44;;38278:1;38269:6;:10;38265:462;;;38290:11;38304:14;:23;38319:7;38304:23;;;;;;;;;;;;;;;:30;;;38290:44;;38343:13;38359:14;:23;38374:7;38359:23;;;;;;;;;;;;;;;:32;;;38343:48;;38400:14;38417:30;38438:7;38430:6;:16;38417:8;:12;;:30;;;;:::i;:::-;38400:47;;38456:14;38473:15;38456:32;;38514:8;38501:9;:21;38497:223;;38558:6;38535:29;;38497:223;;;38597:9;38584;:22;38580:140;;38642:68;38703:6;38642:56;38653:44;38695:1;38653:37;38682:7;38653:24;38667:9;38653;:13;;:24;;;;:::i;:::-;:28;;:37;;;;:::i;:::-;:41;;:44;;;;:::i;:::-;38642:6;:10;;:56;;;;:::i;:::-;:60;;:68;;;;:::i;:::-;38619:91;;38580:140;38497:223;38265:462;;;;;38740:20;38733:27;;;;38094:672;;;:::o;41503:105::-;29969:12;:10;:12::i;:::-;29959:22;;:6;;;;;;;;;;;:22;;;29951:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14849:7:::1;::::0;::::1;;;;;;;;14848:8;14840:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;41580:22:::2;41594:7;41580:13;:22::i;:::-;41503:105:::0;:::o;22151:145::-;22240:7;22263:11;:18;22275:5;22263:18;;;;;;;;;;;;;;;:27;22282:7;22263:27;;;;;;;;;;;;;;;;22256:34;;22151:145;;;;:::o;40388:161::-;30184:12;:10;:12::i;:::-;30168:28;;:12;;;;;;;;;;;:28;;;30160:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14849:7:::1;::::0;::::1;;;;;;;;14848:8;14840:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;40498:45:::2;40528:14;40498:29;:45::i;:::-;40388:161:::0;:::o;40170:137::-;30184:12;:10;:12::i;:::-;30168:28;;:12;;;;;;;;;;;:28;;;30160:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14849:7:::1;::::0;::::1;;;;;;;;14848:8;14840:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;40268:33:::2;40292:8;40268:23;:33::i;:::-;40170:137:::0;:::o;41670:90::-;33231:8;:22;33240:12;:10;:12::i;:::-;33231:22;;;;;;;;;;;;;;;;;;;;;;;;;33223:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14849:7:::1;::::0;::::1;;;;;;;;14848:8;14840:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;41740:14:::2;41746:7;41740:5;:14::i;:::-;41670:90:::0;:::o;40608:99::-;29969:12;:10;:12::i;:::-;29959:22;;:6;;;;;;;;;;;:22;;;29951:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14849:7:::1;::::0;::::1;;;;;;;;14848:8;14840:37;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;40682:19:::2;40693:7;40682:10;:19::i;:::-;40608:99:::0;:::o;29751:85::-;29795:7;29818:12;;;;;;;;;;;29811:19;;29751:85;:::o;9350:167::-;9408:7;9424:9;9440:1;9436;:5;9424:17;;9461:1;9456;:6;;9448:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9510:1;9503:8;;;9350:167;;;;:::o;613:100::-;666:15;697:10;690:17;;613:100;:::o;32000:121::-;32076:5;32056:8;:17;32065:7;32056:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;32107:7;32093:22;;;;;;;;;;;;32000:121;:::o;27338:328::-;27453:1;27436:19;;:5;:19;;;;27428:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27530:1;27511:21;;:7;:21;;;;27503:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27610:6;27580:11;:18;27592:5;27580:18;;;;;;;;;;;;;;;:27;27599:7;27580:27;;;;;;;;;;;;;;;:36;;;;27644:7;27628:32;;27637:5;27628:32;;;27653:6;27628:32;;;;;;;;;;;;;;;;;;27338:328;;;:::o;34449:341::-;34550:1;34541:6;:10;34533:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34628:15;34616:9;:27;34608:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34700:10;:19;34711:7;34700:19;;;;;;;;;;;;;;;34725:27;;;;;;;;34734:6;34725:27;;;;34742:9;34725:27;;;34700:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34776:7;34765:19;;;;;;;;;;;;34449:341;;;:::o;36747:391::-;36859:1;36840:21;;:7;:21;;;;36832:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36931:1;36922:6;:10;36914:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36987:1;36978:6;:10;36970:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37052:45;;;;;;;;37065:6;37052:45;;;;37073:6;37052:45;;;;37081:15;37052:45;;;37026:14;:23;37041:7;37026:23;;;;;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;37124:7;37109:23;;;;;;;;;;;;36747:391;;;:::o;25178:513::-;25298:1;25280:20;;:6;:20;;;;25272:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25378:1;25357:23;;:9;:23;;;;25349:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25429:47;25450:6;25458:9;25469:6;25429:20;:47::i;:::-;25505:71;25527:6;25505:71;;;;;;;;;;;;;;;;;:9;:17;25515:6;25505:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;25485:9;:17;25495:6;25485:17;;;;;;;;;;;;;;;:91;;;;25606:32;25631:6;25606:9;:20;25616:9;25606:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;25583:9;:20;25593:9;25583:20;;;;;;;;;;;;;;;:55;;;;25667:9;25650:35;;25659:6;25650:35;;;25678:6;25650:35;;;;;;;;;;;;;;;;;;25178:513;;;:::o;10207:178::-;10293:7;10322:1;10317;:6;;10325:12;10309:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10345:9;10361:1;10357;:5;10345:17;;10378:1;10371:8;;;10207:178;;;;;:::o;34273:108::-;34341:5;34323:6;:15;34330:7;34323:15;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;34367:7;34358:17;;;;;;;;;;;;34273:108;:::o;15524:110::-;15105:7;;;;;;;;;;15097:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15589:5:::1;15579:7:::0;::::1;:15;;;;;;;;;;;;;;;;;;15606:22;15615:12;:10;:12::i;:::-;15606:22;;;;;;;;;;;;;;;;;;;;15524:110::o:0;26576:338::-;26675:1;26656:21;;:7;:21;;;;26648:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26745:68;26768:6;26745:68;;;;;;;;;;;;;;;;;:9;:18;26755:7;26745:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;26724:9;:18;26734:7;26724:18;;;;;;;;;;;;;;;:89;;;;26835:24;26852:6;26835:12;;:16;;:24;;;;:::i;:::-;26820:12;:39;;;;26897:1;26871:37;;26880:7;26871:37;;;26901:6;26871:37;;;;;;;;;;;;;;;;;;26576:338;;:::o;33548:115::-;33621:4;33601:8;:17;33610:7;33601:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;33649:7;33637:20;;;;;;;;;;;;33548:115;:::o;34959:416::-;35067:5;35038:34;;:10;:19;35049:7;35038:19;;;;;;;;;;;;;;;:26;;;;:34;:48;;;;;35085:1;35076:5;:10;;;;35038:48;35030:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35130:8;35141:10;:19;35152:7;35141:19;;;;;;;;;;;;;;;:26;;;;35130:37;;35189:5;35178:16;;35184:1;35178:3;:7;:16;35174:131;;35269:10;:19;35280:7;35269:19;;;;;;;;;;;;;;;35295:1;35289:3;:7;35269:28;;;;;;;;;;;;;;;;;;35240:10;:19;35251:7;35240:19;;;;;;;;;;;;;;;35260:5;35240:26;;;;;;;;;;;;;;;;;;;;:57;;;;;;;;;;;;;;;;;;;35174:131;35311:10;:19;35322:7;35311:19;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35361:7;35348:21;;;;;;;;;;;;34959:416;;;:::o;15285:108::-;14849:7;;;;;;;;;;14848:8;14840:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15351:4:::1;15341:7;::::0;:14:::1;;;;;;;;;;;;;;;;;;15367:20;15374:12;:10;:12::i;:::-;15367:20;;;;;;;;;;;;;;;;;;;;15285:108::o:0;37283:152::-;37371:21;;;;;;;;37384:1;37371:21;;;;37387:1;37371:21;;;;37390:1;37371:21;;;37345:14;:23;37360:7;37345:23;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;37421:7;37404:25;;;;;;;;;;;;37283:152;:::o;9787:130::-;9845:7;9868:43;9872:1;9875;9868:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;9861:50;;9787:130;;;;:::o;11525:126::-;11583:7;11606:39;11610:1;11613;11606:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;11599:46;;11525:126;;;;:::o;10631:433::-;10689:7;10923:1;10918;:6;10914:39;;;10944:1;10937:8;;;;10914:39;10961:9;10977:1;10973;:5;10961:17;;11002:1;10997;10993;:5;;;;;;:10;10985:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11057:1;11050:8;;;10631:433;;;;;:::o;33740:121::-;33816:5;33796:8;:17;33805:7;33796:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;33847:7;33833:22;;;;;;;;;;;;33740:121;:::o;30687:269::-;30800:1;30774:28;;:14;:28;;;;30766:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30899:14;30864:50;;30891:6;;;;;;;;;;;30864:50;;;;;;;;;;;;30936:14;30921:12;;:29;;;;;;;;;;;;;;;;;;30687:269;:::o;30354:220::-;30449:1;30429:22;;:8;:22;;;;30421:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30535:8;30506:38;;30527:6;;;;;;;;;;;30506:38;;;;;;;;;;;;30560:8;30551:6;;:17;;;;;;;;;;;;;;;;;;30354:220;:::o;34098:103::-;34164:4;34146:6;:15;34153:7;34146:15;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;34187:7;34180:15;;;;;;;;;;;;34098:103;:::o;31804:115::-;31877:4;31857:8;:17;31866:7;31857:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;31905:7;31893:20;;;;;;;;;;;;31804:115;:::o;39453:643::-;39557:44;39584:4;39590:2;39594:6;39557:26;:44::i;:::-;39619:14;39628:4;39619:8;:14::i;:::-;39618:15;39610:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39698:12;39707:2;39698:8;:12::i;:::-;39697:13;39689:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39773:22;39782:12;:10;:12::i;:::-;39773:8;:22::i;:::-;39772:23;39764:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39867:8;:6;:8::i;:::-;39866:9;39858:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40017:6;39932:81;39983:29;40007:4;39983:23;:29::i;:::-;39932:46;39952:25;39972:4;39952:19;:25::i;:::-;39932:15;39942:4;39932:9;:15::i;:::-;:19;;:46;;;;:::i;:::-;:50;;:81;;;;:::i;:::-;:91;;39924:166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39453:643;;;:::o;12132:260::-;12218:7;12246:1;12242;:5;12249:12;12234:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12269:9;12285:1;12281;:5;;;;;;12269:17;;12385:1;12378:8;;;12132:260;;;;;:::o;28252:92::-;;;;:::o

Swarm Source

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