ETH Price: $3,387.55 (-1.32%)

Contract

0xBBC7f7A6AADAc103769C66CBC69AB720f7F9Eae3
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

TokenTracker

INX Token (INX) (@$0.20)
Transaction Hash
Method
Block
From
To
Transfer From212765522024-11-27 3:58:351 hr ago1732679915IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.000479866.83066058
Transfer From212757132024-11-27 1:09:234 hrs ago1732669763IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.00060428.60217761
Transfer From212755642024-11-27 0:39:354 hrs ago1732667975IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.0007851511.17830856
Transfer From212753342024-11-26 23:52:595 hrs ago1732665179IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.000553957.88672329
Approve212751002024-11-26 23:06:116 hrs ago1732662371IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.00036667.91639695
Transfer From212750762024-11-26 23:01:116 hrs ago1732662071IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.000504437.18049776
Transfer From212750742024-11-26 23:00:476 hrs ago1732662047IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.000636537.28706704
Set Whitelist212750292024-11-26 22:51:476 hrs ago1732661507IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.000369517.09964804
Transfer From212728092024-11-26 15:26:3513 hrs ago1732634795IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.0010270614.62243333
Approve212725762024-11-26 14:39:4714 hrs ago1732631987IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.0009286720.04861032
Approve212725622024-11-26 14:36:5914 hrs ago1732631819IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.0008479518.30610605
Transfer212719892024-11-26 12:41:4716 hrs ago1732624907IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.0005671510.54354996
Transfer From212719732024-11-26 12:38:3516 hrs ago1732624715IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.000706810.80093134
Transfer From212719712024-11-26 12:38:1116 hrs ago1732624691IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.0007669210.91695121
Transfer From212719702024-11-26 12:37:5916 hrs ago1732624679IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.0007921111.2793576
Transfer From212719512024-11-26 12:34:1116 hrs ago1732624451IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.0008244911.73642344
Transfer From212719492024-11-26 12:33:4716 hrs ago1732624427IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.000856112.18634134
Transfer From212718172024-11-26 12:07:1117 hrs ago1732622831IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.0010798517.80441198
Transfer From212717032024-11-26 11:44:2317 hrs ago1732621463IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.0010817915.3990279
Transfer212716292024-11-26 11:29:2317 hrs ago1732620563IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.0012439317.54990003
Revoke212715582024-11-26 11:14:5918 hrs ago1732619699IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.000768214.98671452
Transfer From212709092024-11-26 9:04:3520 hrs ago1732611875IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.000646039.19603725
Transfer From212709072024-11-26 9:04:1120 hrs ago1732611851IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.000657499.35920595
Transfer From212705352024-11-26 7:48:5921 hrs ago1732607339IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.000436146.20836095
Approve212705312024-11-26 7:48:1121 hrs ago1732607291IN
0xBBC7f7A6...0f7F9Eae3
0 ETH0.000410438.86063461
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
166734992023-02-21 1:04:11645 days ago1676941451
0xBBC7f7A6...0f7F9Eae3
0.64164409 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
InxToken

Compiler Version
v0.5.8+commit.23d335f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-02-03
*/

// File: contracts/1404/IERC1404.sol

pragma solidity 0.5.8;

interface IERC1404 {
    /// @notice Detects if a transfer will be reverted and if so returns an appropriate reference code
    /// @param from Sending address
    /// @param to Receiving address
    /// @param value Amount of tokens being transferred
    /// @return Code by which to reference message for rejection reasoning
    /// @dev Overwrite with your custom transfer restriction logic
    function detectTransferRestriction (address from, address to, uint256 value) external view returns (uint8);

    /// @notice Detects if a transferFrom will be reverted and if so returns an appropriate reference code
    /// @param sender Transaction sending address
    /// @param from Source of funds address
    /// @param to Receiving address
    /// @param value Amount of tokens being transferred
    /// @return Code by which to reference message for rejection reasoning
    /// @dev Overwrite with your custom transfer restriction logic
    function detectTransferFromRestriction (address sender, address from, address to, uint256 value) external view returns (uint8);

    /// @notice Returns a human-readable message for a given restriction code
    /// @param restrictionCode Identifier for looking up a message
    /// @return Text showing the restriction's reasoning
    /// @dev Overwrite with your custom message and restrictionCode handling
    function messageForTransferRestriction (uint8 restrictionCode) external view returns (string memory);
}

interface IERC1404getSuccessCode {
    /// @notice Return the uint256 that represents the SUCCESS_CODE
    /// @return uint256 SUCCESS_CODE
    function getSuccessCode () external view returns (uint256);
}

/**
 * @title IERC1404Success
 * @dev Combines IERC1404 and IERC1404getSuccessCode interfaces, to be implemented by the TransferRestrictions contract
 */
contract IERC1404Success is IERC1404getSuccessCode, IERC1404 {
}

// File: contracts/1404/IERC1404Validators.sol

pragma solidity 0.5.8;

/**
 * @title IERC1404Validators
 * @dev Interfaces implemented by the token contract to be called by the TransferRestrictions contract
 */
interface IERC1404Validators {
    /// @notice Returns the token balance for an account
    /// @param account The address to get the token balance of
    /// @return uint256 representing the token balance for the account
    function balanceOf (address account) external view returns (uint256);

    /// @notice Returns a boolean indicating the paused state of the contract
    /// @return true if contract is paused, false if unpaused
    function paused () external view returns (bool);

    /// @notice Determine if sender and receiver are whitelisted, return true if both accounts are whitelisted
    /// @param from The address sending tokens.
    /// @param to The address receiving tokens.
    /// @return true if both accounts are whitelisted, false if not
    function checkWhitelists (address from, address to) external view returns (bool);

    /// @notice Determine if a users tokens are locked preventing a transfer
    /// @param _address the address to retrieve the data from
    /// @param amount the amount to send
    /// @param balance the token balance of the sending account
    /// @return true if user has sufficient unlocked token to transfer the requested amount, false if not
    function checkTimelock (address _address, uint256 amount, uint256 balance) external view returns (bool);
}

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

pragma solidity ^0.5.0;

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev Give an account access to this role.
     */
    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    /**
     * @dev Check if an account has this role.
     * @return bool
     */
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}

// File: contracts/roles/OwnerRole.sol

pragma solidity 0.5.8;


contract OwnerRole {
    using Roles for Roles.Role;

    event OwnerAdded(address indexed addedOwner, address indexed addedBy);
    event OwnerRemoved(address indexed removedOwner, address indexed removedBy);

    Roles.Role private _owners;

    modifier onlyOwner() {
        require(isOwner(msg.sender), "OwnerRole: caller does not have the Owner role");
        _;
    }

    function isOwner(address account) public view returns (bool) {
        return _owners.has(account);
    }

    function addOwner(address account) public onlyOwner {
        _addOwner(account);
    }

    function removeOwner(address account) public onlyOwner {
        require(msg.sender != account, "Owners cannot remove themselves as owner");
        _removeOwner(account);
    }

    function _addOwner(address account) internal {
        _owners.add(account);
        emit OwnerAdded(account, msg.sender);
    }

    function _removeOwner(address account) internal {
        _owners.remove(account);
        emit OwnerRemoved(account, msg.sender);
    }
}

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

pragma solidity ^0.5.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.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol

pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @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.
     *
     * _Available since v2.4.0._
     */
    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.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        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.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol

pragma solidity ^0.5.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20Mintable}.
 *
 * 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;

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public 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 returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public 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 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 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 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 {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

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

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * 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 {
        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 {
        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 {
        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 Destroys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See {_burn} and {_approve}.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
    }
}

// File: contracts/roles/RevokerRole.sol

pragma solidity 0.5.8;


contract RevokerRole is OwnerRole {

    event RevokerAdded(address indexed addedRevoker, address indexed addedBy);
    event RevokerRemoved(address indexed removedRevoker, address indexed removedBy);

    Roles.Role private _revokers;

    modifier onlyRevoker() {
        require(isRevoker(msg.sender), "RevokerRole: caller does not have the Revoker role");
        _;
    }

    function isRevoker(address account) public view returns (bool) {
        return _revokers.has(account);
    }

    function addRevoker(address account) public onlyOwner {
        _addRevoker(account);
    }

    function removeRevoker(address account) public onlyOwner {
        _removeRevoker(account);
    }

    function _addRevoker(address account) internal {
        _revokers.add(account);
        emit RevokerAdded(account, msg.sender);
    }

    function _removeRevoker(address account) internal {
        _revokers.remove(account);
        emit RevokerRemoved(account, msg.sender);
    }
}

// File: contracts/capabilities/Revocable.sol

pragma solidity 0.5.8;



/**
 * Allows an administrator to move tokens from a target account to their own.
 */
contract Revocable is ERC20, RevokerRole {

  event Revoke(address indexed revoker, address indexed from, uint256 amount);

  function revoke(
    address _from,
    uint256 _amount
  )
    public
    onlyRevoker
    returns (bool)
  {
    ERC20._transfer(_from, msg.sender, _amount);
    emit Revoke(msg.sender, _from, _amount);
    return true;
  }
}

// File: contracts/roles/WhitelisterRole.sol

pragma solidity 0.5.8;


contract WhitelisterRole is OwnerRole {

    event WhitelisterAdded(address indexed addedWhitelister, address indexed addedBy);
    event WhitelisterRemoved(address indexed removedWhitelister, address indexed removedBy);

    Roles.Role private _whitelisters;

    modifier onlyWhitelister() {
        require(isWhitelister(msg.sender), "WhitelisterRole: caller does not have the Whitelister role");
        _;
    }

    function isWhitelister(address account) public view returns (bool) {
        return _whitelisters.has(account);
    }

    function addWhitelister(address account) public onlyOwner {
        _addWhitelister(account);
    }

    function removeWhitelister(address account) public onlyOwner {
        _removeWhitelister(account);
    }

    function _addWhitelister(address account) internal {
        _whitelisters.add(account);
        emit WhitelisterAdded(account, msg.sender);
    }

    function _removeWhitelister(address account) internal {
        _whitelisters.remove(account);
        emit WhitelisterRemoved(account, msg.sender);
    }
}

// File: contracts/capabilities/Whitelistable.sol

pragma solidity 0.5.8;


/**
 * @title Whitelistable
 * @dev Allows tracking whether addressess are allowed to hold tokens.
 */
contract Whitelistable is WhitelisterRole {

    event WhitelistUpdate(address _address, bool status, string data);

    // Tracks whether an address is whitelisted
    // data field can track any external field (like a hash of personal details)
    struct whiteListItem {
        bool status;
        string data;
    }

    // white list status
    mapping (address => whiteListItem) public whitelist;

    /**
    * @dev Set a white list address
    * @param to the address to be set
    * @param status the whitelisting status (true for yes, false for no)
    * @param data a string with data about the whitelisted address
    */
    function setWhitelist(address to, bool status, string memory data)  public onlyWhitelister returns(bool){
        whitelist[to] = whiteListItem(status, data);
        emit WhitelistUpdate(to, status, data);
        return true;
    }

    /**
    * @dev Get the status of the whitelist
    * @param _address the address to be check
    */
    function getWhitelistStatus(address _address) public view returns(bool){
        return whitelist[_address].status;
    }

    /**
    * @dev Get the data of and address in the whitelist
    * @param _address the address to retrieve the data from
    */
    function getWhitelistData(address _address) public view returns(string memory){
        return whitelist[_address].data;
    }

    /**
    * @dev Determine if sender and receiver are whitelisted, return true if both accounts are whitelisted
    * @param from The address sending tokens.
    * @param to The address receiving tokens.
    */
    function checkWhitelists(address from, address to) external view returns (bool) {
        return whitelist[from].status && whitelist[to].status;
    }
}

// File: contracts/roles/TimelockerRole.sol

pragma solidity 0.5.8;


contract TimelockerRole is OwnerRole {

    event TimelockerAdded(address indexed addedTimelocker, address indexed addedBy);
    event TimelockerRemoved(address indexed removedTimelocker, address indexed removedBy);

    Roles.Role private _timelockers;

    modifier onlyTimelocker() {
        require(isTimelocker(msg.sender), "TimelockerRole: caller does not have the Timelocker role");
        _;
    }

    function isTimelocker(address account) public view returns (bool) {
        return _timelockers.has(account);
    }

    function addTimelocker(address account) public onlyOwner {
        _addTimelocker(account);
    }

    function removeTimelocker(address account) public onlyOwner {
        _removeTimelocker(account);
    }

    function _addTimelocker(address account) internal {
        _timelockers.add(account);
        emit TimelockerAdded(account, msg.sender);
    }

    function _removeTimelocker(address account) internal {
        _timelockers.remove(account);
        emit TimelockerRemoved(account, msg.sender);
    }
}

// File: contracts/capabilities/Timelockable.sol

pragma solidity 0.5.8;



/**
 * @title INX Timelockable
 * @dev Lockup all or a portion of an accounts tokens until an expiration date
 */
contract Timelockable is TimelockerRole {

    using SafeMath for uint256;

    struct lockupItem {
        uint256 amount;
        uint256 releaseTime;
    }

    mapping (address => lockupItem) lockups;

    event AccountLock(address _address, uint256 amount, uint256 releaseTime);
    event AccountRelease(address _address, uint256 amount);


    /**
    * @dev lock address and amount and lock it, set the release time
    * @param _address the address to lock
    * @param amount the amount to lock
    * @param releaseTime of the locked amount (in seconds since the epoch)
    */
    function lock( address _address, uint256 amount, uint256 releaseTime) public onlyTimelocker returns (bool) {
        require(releaseTime > block.timestamp, "Release time needs to be in the future");
        require(_address != address(0), "Address must be valid for lockup");

        lockupItem memory _lockupItem = lockupItem(amount, releaseTime);
        lockups[_address] = _lockupItem;
        emit AccountLock(_address, amount, releaseTime);
        return true;
    }

    /**
    * @dev release locked amount
    * @param _address the address to retrieve the data from
    * @param amountToRelease the amount to check
    */
    function release( address _address, uint256 amountToRelease) public onlyTimelocker returns(bool) {
        require(_address != address(0), "Address must be valid for release");

        uint256 _lockedAmount = lockups[_address].amount;

        // nothing to release
        if(_lockedAmount == 0){
            emit AccountRelease(_address, 0);
            return true;
        }

        // extract release time for re-locking
        uint256 _releaseTime = lockups[_address].releaseTime;

        // delete the lock entry
        delete lockups[_address];

        if(_lockedAmount >= amountToRelease){
           uint256 newLockedAmount = _lockedAmount.sub(amountToRelease);

           // re-lock the new locked balance
           lock(_address, newLockedAmount, _releaseTime);
           emit AccountRelease(_address, amountToRelease);
           return true;
        } else {
            // if they requested to release more than the locked amount emit the event with the locked amount that has been released
            emit AccountRelease(_address, _lockedAmount);
            return true;
        }
    }

    /**
    * @dev return true if the given account has enough unlocked tokens to send the requested amount
    * @param _address the address to retrieve the data from
    * @param amount the amount to send
    * @param balance the token balance of the sending account
    */
    function checkTimelock(address _address, uint256 amount, uint256 balance) external view returns (bool) {
        // if the user does not have enough tokens to send regardless of lock return true here
        // the failure will still fail but this should make it explicit that the transfer failure is not
        // due to locked tokens but because of too low token balance
        if (balance < amount) {
            return true;
        }

        // get the sending addresses token balance that is not locked
        uint256 nonLockedAmount = balance.sub(lockups[_address].amount);

        // determine if the sending address has enough free tokens to send the entire amount
        bool notLocked = amount <= nonLockedAmount;

        // if the timelock is greater then the release time the time lock is expired
        bool timeLockExpired = block.timestamp > lockups[_address].releaseTime;

        // if the timelock is expired OR the requested amount is available the transfer is not locked
        if(timeLockExpired || notLocked){
            return true;

        // if the timelocked is not expired AND the requested amount is not available the tranfer is locked
        } else {
            return false;
        }
    }

    /**
    * @dev get address lockup info
    * @param _address the address to retrieve the data from
    * @return array of 2 uint256, release time (in seconds since the epoch) and amount (in INX)
    */
    function checkLockup(address _address) public view returns(uint256, uint256) {
        // copy lockup data into memory
        lockupItem memory _lockupItem = lockups[_address];

        return (_lockupItem.releaseTime, _lockupItem.amount);
    }
}

// File: contracts/roles/PauserRole.sol

pragma solidity 0.5.8;


contract PauserRole is OwnerRole {

    event PauserAdded(address indexed addedPauser, address indexed addedBy);
    event PauserRemoved(address indexed removedPauser, address indexed removedBy);

    Roles.Role private _pausers;

    modifier onlyPauser() {
        require(isPauser(msg.sender), "PauserRole: caller does not have the Pauser role");
        _;
    }

    function isPauser(address account) public view returns (bool) {
        return _pausers.has(account);
    }

    function addPauser(address account) public onlyOwner {
        _addPauser(account);
    }

    function removePauser(address account) public onlyOwner {
        _removePauser(account);
    }

    function _addPauser(address account) internal {
        _pausers.add(account);
        emit PauserAdded(account, msg.sender);
    }

    function _removePauser(address account) internal {
        _pausers.remove(account);
        emit PauserRemoved(account, msg.sender);
    }
}

// File: contracts/capabilities/Pausable.sol

pragma solidity 0.5.8;


/**
 * Allows transfers on a token contract to be paused by an administrator.
 */
contract Pausable is PauserRole {
    event Paused();
    event Unpaused();

    bool private _paused;

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

    /**
     * @dev internal function, triggers paused state
     */
    function _pause() internal {
        _paused = true;
        emit Paused();
    }

    /**
     * @dev internal function, returns to unpaused state
     */
    function _unpause() internal {
        _paused = false;
        emit Unpaused();
    }

     /**
     * @dev called by pauser role to pause, triggers stopped state
     */
    function pause() public onlyPauser {
        _pause();
    }

    /**
     * @dev called by pauer role to unpause, returns to normal state
     */
    function unpause() public onlyPauser {
        _unpause();
    }
}

// File: @openzeppelin/contracts/token/ERC20/ERC20Detailed.sol

pragma solidity ^0.5.0;


/**
 * @dev Optional functions from the ERC20 standard.
 */
contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of
     * these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

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

// File: contracts/InxToken.sol

pragma solidity 0.5.8;











contract InxToken is IERC1404, IERC1404Validators, IERC20, ERC20Detailed, OwnerRole, Revocable, Whitelistable, Timelockable, Pausable {

    // Token Details
    string constant TOKEN_NAME = "INX Token";
    string constant TOKEN_SYMBOL = "INX";
    uint8 constant TOKEN_DECIMALS = 18;

    // Token supply - 2 Hundred Million Tokens, with 18 decimal precision
    uint256 constant HUNDRED_MILLION = 100000000;
    uint256 constant TOKEN_SUPPLY = 2 * HUNDRED_MILLION * (10 ** uint256(TOKEN_DECIMALS));

    // This tracks the external contract where restriction logic is executed
    IERC1404Success private transferRestrictions;

    // Event tracking when restriction logic contract is updated
    event RestrictionsUpdated (address newRestrictionsAddress, address updatedBy);

    /**
    Constructor for the token to set readable details and mint all tokens
    to the specified owner.
    */
    constructor(address owner) public
        ERC20Detailed(TOKEN_NAME, TOKEN_SYMBOL, TOKEN_DECIMALS)
    {
        _mint(owner, TOKEN_SUPPLY);
        _addOwner(owner);
    }

    /**
    Function that can only be called by an owner that updates the address
    with the ERC1404 Transfer Restrictions defined
    */
    function updateTransferRestrictions(address _newRestrictionsAddress)
        public
        onlyOwner
        returns (bool)
    {
        transferRestrictions = IERC1404Success(_newRestrictionsAddress);
        emit RestrictionsUpdated(address(transferRestrictions), msg.sender);
        return true;
    }

    /**
    The address with the Transfer Restrictions contract
    */
    function getRestrictionsAddress () public view returns (address) {
        return address(transferRestrictions);
    }


    /**
    This function detects whether a transfer should be restricted and not allowed.
    If the function returns SUCCESS_CODE (0) then it should be allowed.
    */
    function detectTransferRestriction (address from, address to, uint256 amount)
        public
        view
        returns (uint8)
    {
        // Verify the external contract is valid
        require(address(transferRestrictions) != address(0), 'TransferRestrictions contract must be set');

        // call detectTransferRestriction on the current transferRestrictions contract
        return transferRestrictions.detectTransferRestriction(from, to, amount);
    }

    /**
    This function detects whether a transferFrom should be restricted and not allowed.
    If the function returns SUCCESS_CODE (0) then it should be allowed.
    */
    function detectTransferFromRestriction (address sender, address from, address to, uint256 amount)
        public
        view
        returns (uint8)
    {
        // Verify the external contract is valid
        require(address(transferRestrictions) != address(0), 'TransferRestrictions contract must be set');

        // call detectTransferFromRestriction on the current transferRestrictions contract
        return  transferRestrictions.detectTransferFromRestriction(sender, from, to, amount);
    }

    /**
    This function allows a wallet or other client to get a human readable string to show
    a user if a transfer was restricted.  It should return enough information for the user
    to know why it failed.
    */
    function messageForTransferRestriction (uint8 restrictionCode)
        external
        view
        returns (string memory)
    {
        // call messageForTransferRestriction on the current transferRestrictions contract
        return transferRestrictions.messageForTransferRestriction(restrictionCode);
    }

    /**
    Evaluates whether a transfer should be allowed or not.
    */
    modifier notRestricted (address from, address to, uint256 value) {
        uint8 restrictionCode = transferRestrictions.detectTransferRestriction(from, to, value);
        require(restrictionCode == transferRestrictions.getSuccessCode(), transferRestrictions.messageForTransferRestriction(restrictionCode));
        _;
    }

    /**
    Evaluates whether a transferFrom should be allowed or not.
    */
    modifier notRestrictedTransferFrom (address sender, address from, address to, uint256 value) {
        uint8 transferFromRestrictionCode = transferRestrictions.detectTransferFromRestriction(sender, from, to, value);
        require(transferFromRestrictionCode == transferRestrictions.getSuccessCode(), transferRestrictions.messageForTransferRestriction(transferFromRestrictionCode));
        _;
    }

    /**
    Overrides the parent class token transfer function to enforce restrictions.
    */
    function transfer (address to, uint256 value)
        public
        notRestricted(msg.sender, to, value)
        returns (bool success)
    {
        success = ERC20.transfer(to, value);
    }

    /**
    Overrides the parent class token transferFrom function to enforce restrictions.
    */
    function transferFrom (address from, address to, uint256 value)
        public
        notRestrictedTransferFrom(msg.sender, from, to, value)
        returns (bool success)
    {
        success = ERC20.transferFrom(from, to, value);
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addTimelocker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"amountToRelease","type":"uint256"}],"name":"release","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getRestrictionsAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"sender","type":"address"},{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"detectTransferFromRestriction","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"amount","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isTimelocker","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"status","type":"bool"},{"name":"data","type":"string"}],"name":"setWhitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isPauser","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getWhitelistData","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isWhitelister","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"restrictionCode","type":"uint8"}],"name":"messageForTransferRestriction","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeWhitelister","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeTimelocker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addRevoker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"}],"name":"checkWhitelists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"checkLockup","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"whitelist","outputs":[{"name":"status","type":"bool"},{"name":"data","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeRevoker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"},{"name":"amount","type":"uint256"},{"name":"balance","type":"uint256"}],"name":"checkTimelock","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"detectTransferRestriction","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getWhitelistStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newRestrictionsAddress","type":"address"}],"name":"updateTransferRestrictions","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"amount","type":"uint256"},{"name":"releaseTime","type":"uint256"}],"name":"lock","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_amount","type":"uint256"}],"name":"revoke","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addWhitelister","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isRevoker","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newRestrictionsAddress","type":"address"},{"indexed":false,"name":"updatedBy","type":"address"}],"name":"RestrictionsUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedPauser","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedPauser","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"releaseTime","type":"uint256"}],"name":"AccountLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"AccountRelease","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedTimelocker","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"TimelockerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedTimelocker","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"TimelockerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"},{"indexed":false,"name":"status","type":"bool"},{"indexed":false,"name":"data","type":"string"}],"name":"WhitelistUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedWhitelister","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"WhitelisterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedWhitelister","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"WhitelisterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"revoker","type":"address"},{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Revoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedRevoker","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"RevokerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedRevoker","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"RevokerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedOwner","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"OwnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedOwner","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"OwnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]

60806040523480156200001157600080fd5b506040516020806200509a833981018060405260208110156200003357600080fd5b81019080805190602001909291905050506040518060400160405280600981526020017f494e5820546f6b656e00000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f494e58000000000000000000000000000000000000000000000000000000000081525060128260009080519060200190620000ca929190620005cd565b508160019080519060200190620000e3929190620005cd565b5080600260006101000a81548160ff021916908360ff1602179055505050506200012481601260ff16600a0a6305f5e100600202026200013c60201b60201c565b62000135816200030860201b60201c565b506200067c565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620001e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b620001fc816005546200038060201b62003c511790919060201c565b6005819055506200025b81600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200038060201b62003c511790919060201c565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b620003238160066200040960201b6200448b1790919060201c565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a60405160405180910390a350565b600080828401905083811015620003ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6200041b8282620004ed60201b60201c565b156200048f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000576576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180620050786022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200061057805160ff191683800117855562000641565b8280016001018555821562000641579182015b828111156200064057825182559160200191906001019062000623565b5b50905062000650919062000654565b5090565b6200067991905b80821115620006755760008160009055506001016200065b565b5090565b90565b6149ec806200068c6000396000f3fe608060405234801561001057600080fd5b50600436106102745760003560e01c80637f4ab1dd11610151578063a9059cbb116100c3578063db0cc92a11610087578063db0cc92a146110f6578063dd62ed3e14611152578063e2ab691d146111ca578063eac449d91461123a578063eaf9144a146112a0578063f6c4b01f146112e457610274565b8063a9059cbb14610ef8578063c06f8b9414610f5e578063c697e4a314610fa2578063d4ce141514611012578063d9ba32fc1461109a57610274565b806395d89b411161011557806395d89b4114610c28578063961a66f614610cab57806399da091d14610cef5780639a6e292f14610d6b5780639b19251a14610dca578063a457c2d714610e9257610274565b80637f4ab1dd14610aa857806382c3f79c14610b5257806382dc1ec414610b96578063841aca4414610bda5780638456cb5914610c1e57610274565b80632f54bf6e116101ea5780635c975abb116101ae5780635c975abb1461088d57806368aa9813146108af5780636b2c0f551461096c5780637065cb48146109b057806370a08231146109f45780637d0c269f14610a4c57610274565b80632f54bf6e14610741578063313ce5671461079d57806339509351146107c15780633f4ba83a1461082757806346fbf68e1461083157610274565b8063095ea7b31161023c578063095ea7b3146104985780630c57133f146104fe578063173825d91461055a57806318160ddd1461059e57806323b872dd146105bc57806327ac19751461064257610274565b8063031d4053146102795780630357371d146102bd57806305557bd41461032357806306fdde031461036d5780630754cede146103f0575b600080fd5b6102bb6004803603602081101561028f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611340565b005b610309600480360360408110156102d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113aa565b604051808215151515815260200191505060405180910390f35b61032b611708565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610375611732565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103b557808201518184015260208101905061039a565b50505050905090810190601f1680156103e25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61047c6004803603608081101561040657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117d4565b604051808260ff1660ff16815260200191505060405180910390f35b6104e4600480360360408110156104ae57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119d1565b604051808215151515815260200191505060405180910390f35b6105406004803603602081101561051457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119ef565b604051808215151515815260200191505060405180910390f35b61059c6004803603602081101561057057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a0c565b005b6105a6611afb565b6040518082815260200191505060405180910390f35b610628600480360360608110156105d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b05565b604051808215151515815260200191505060405180910390f35b6107276004803603606081101561065857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190803590602001906401000000008111156106a157600080fd5b8201836020820111156106b357600080fd5b803590602001918460018302840111640100000000831117156106d557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611ecb565b604051808215151515815260200191505060405180910390f35b6107836004803603602081101561075757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120a8565b604051808215151515815260200191505060405180910390f35b6107a56120c5565b604051808260ff1660ff16815260200191505060405180910390f35b61080d600480360360408110156107d757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506120dc565b604051808215151515815260200191505060405180910390f35b61082f61218f565b005b6108736004803603602081101561084757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121f7565b604051808215151515815260200191505060405180910390f35b610895612214565b604051808215151515815260200191505060405180910390f35b6108f1600480360360208110156108c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061222b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610931578082015181840152602081019050610916565b50505050905090810190601f16801561095e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6109ae6004803603602081101561098257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061230f565b005b6109f2600480360360208110156109c657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612379565b005b610a3660048036036020811015610a0a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123e3565b6040518082815260200191505060405180910390f35b610a8e60048036036020811015610a6257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061242c565b604051808215151515815260200191505060405180910390f35b610ad760048036036020811015610abe57600080fd5b81019080803560ff169060200190929190505050612449565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b17578082015181840152602081019050610afc565b50505050905090810190601f168015610b445780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610b9460048036036020811015610b6857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061255c565b005b610bd860048036036020811015610bac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125c6565b005b610c1c60048036036020811015610bf057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612630565b005b610c2661269a565b005b610c30612702565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c70578082015181840152602081019050610c55565b50505050905090810190601f168015610c9d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610ced60048036036020811015610cc157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127a4565b005b610d5160048036036040811015610d0557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061280e565b604051808215151515815260200191505060405180910390f35b610dad60048036036020811015610d8157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128c0565b604051808381526020018281526020019250505060405180910390f35b610e0c60048036036020811015610de057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061293f565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610e56578082015181840152602081019050610e3b565b50505050905090810190601f168015610e835780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b610ede60048036036040811015610ea857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612a08565b604051808215151515815260200191505060405180910390f35b610f4460048036036040811015610f0e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612ad5565b604051808215151515815260200191505060405180910390f35b610fa060048036036020811015610f7457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e63565b005b610ff860048036036060811015610fb857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612ecd565b604051808215151515815260200191505060405180910390f35b61107e6004803603606081101561102857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612fb3565b604051808260ff1660ff16815260200191505060405180910390f35b6110dc600480360360208110156110b057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061317b565b604051808215151515815260200191505060405180910390f35b6111386004803603602081101561110c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506131d4565b604051808215151515815260200191505060405180910390f35b6111b46004803603604081101561116857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613337565b6040518082815260200191505060405180910390f35b611220600480360360608110156111e057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506133be565b604051808215151515815260200191505060405180910390f35b6112866004803603604081101561125057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061360e565b604051808215151515815260200191505060405180910390f35b6112e2600480360360208110156112b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506136e8565b005b611326600480360360208110156112fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613752565b604051808215151515815260200191505060405180910390f35b611349336120a8565b61139e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b6113a78161376f565b50565b60006113b5336119ef565b61140a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061478a6038913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611490576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149526021913960400191505060405180910390fd5b6000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506000811415611556577f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e1846000604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a16001915050611702565b6000600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808201600090556001820160009055505083821061169057600061160b85846137e090919063ffffffff16565b90506116188682846133be565b507f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e18686604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a160019350505050611702565b7f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e18583604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a16001925050505b92915050565b6000600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117ca5780601f1061179f576101008083540402835291602001916117ca565b820191906000526020600020905b8154815290600101906020018083116117ad57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561187d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806149986029913960400191505060405180910390fd5b600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630754cede868686866040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200194505050505060206040518083038186803b15801561198c57600080fd5b505afa1580156119a0573d6000803e3d6000fd5b505050506040513d60208110156119b657600080fd5b81019080805190602001909291905050509050949350505050565b60006119e56119de61382a565b8484613832565b6001905092915050565b6000611a0582600a613a2990919063ffffffff16565b9050919050565b611a15336120a8565b611a6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611aef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806148816028913960400191505060405180910390fd5b611af881613b07565b50565b6000600554905090565b6000338484846000600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630754cede868686866040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200194505050505060206040518083038186803b158015611c1c57600080fd5b505afa158015611c30573d6000803e3d6000fd5b505050506040513d6020811015611c4657600080fd5b81019080805190602001909291905050509050600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635ec647596040518163ffffffff1660e01b815260040160206040518083038186803b158015611cc157600080fd5b505afa158015611cd5573d6000803e3d6000fd5b505050506040513d6020811015611ceb57600080fd5b81019080805190602001909291905050508160ff1614600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637f4ab1dd836040518263ffffffff1660e01b8152600401808260ff1660ff16815260200191505060006040518083038186803b158015611d7a57600080fd5b505afa158015611d8e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015611db857600080fd5b810190808051640100000000811115611dd057600080fd5b82810190506020810184811115611de657600080fd5b8151856001820283011164010000000082111715611e0357600080fd5b505092919050505090611eb1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611e76578082015181840152602081019050611e5b565b50505050905090810190601f168015611ea35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50611ebd898989613b78565b955050505050509392505050565b6000611ed63361242c565b611f2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a8152602001806148f4603a913960400191505060405180910390fd5b6040518060400160405280841515815260200183815250600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001019080519060200190611fbd929190614623565b509050507f461193ae6c23672174f7a3ea35649aacdc857bfcae58cd12d61ea432c05bcbd5848484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018315151515815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612061578082015181840152602081019050612046565b50505050905090810190601f16801561208e5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1600190509392505050565b60006120be826006613a2990919063ffffffff16565b9050919050565b6000600260009054906101000a900460ff16905090565b60006121856120e961382a565b8461218085600460006120fa61382a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c5190919063ffffffff16565b613832565b6001905092915050565b612198336121f7565b6121ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806147066030913960400191505060405180910390fd5b6121f5613cd9565b565b600061220d82600c613a2990919063ffffffff16565b9050919050565b6000600d60009054906101000a900460ff16905090565b6060600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123035780601f106122d857610100808354040283529160200191612303565b820191906000526020600020905b8154815290600101906020018083116122e657829003601f168201915b50505050509050919050565b612318336120a8565b61236d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b61237681613d22565b50565b612382336120a8565b6123d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b6123e081613d93565b50565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000612442826008613a2990919063ffffffff16565b9050919050565b6060600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637f4ab1dd836040518263ffffffff1660e01b8152600401808260ff1660ff16815260200191505060006040518083038186803b1580156124c457600080fd5b505afa1580156124d8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250602081101561250257600080fd5b81019080805164010000000081111561251a57600080fd5b8281019050602081018481111561253057600080fd5b815185600182028301116401000000008211171561254d57600080fd5b50509291905050509050919050565b612565336120a8565b6125ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b6125c381613e04565b50565b6125cf336120a8565b612624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b61262d81613e75565b50565b612639336120a8565b61268e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b61269781613ee6565b50565b6126a3336121f7565b6126f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806147066030913960400191505060405180910390fd5b612700613f57565b565b606060018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561279a5780601f1061276f5761010080835404028352916020019161279a565b820191906000526020600020905b81548152906001019060200180831161277d57829003601f168201915b5050505050905090565b6127ad336120a8565b612802576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b61280b81613fa0565b50565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1680156128b85750600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff165b905092915050565b6000806128cb6146a3565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806040016040529081600082015481526020016001820154815250509050806020015181600001519250925050915091565b60096020528060005260406000206000915090508060000160009054906101000a900460ff1690806001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129fe5780601f106129d3576101008083540402835291602001916129fe565b820191906000526020600020905b8154815290600101906020018083116129e157829003601f168201915b5050505050905082565b6000612acb612a1561382a565b84612ac6856040518060600160405280602581526020016149736025913960046000612a3f61382a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140119092919063ffffffff16565b613832565b6001905092915050565b60003383836000600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d4ce14158585856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060206040518083038186803b158015612bb757600080fd5b505afa158015612bcb573d6000803e3d6000fd5b505050506040513d6020811015612be157600080fd5b81019080805190602001909291905050509050600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635ec647596040518163ffffffff1660e01b815260040160206040518083038186803b158015612c5c57600080fd5b505afa158015612c70573d6000803e3d6000fd5b505050506040513d6020811015612c8657600080fd5b81019080805190602001909291905050508160ff1614600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637f4ab1dd836040518263ffffffff1660e01b8152600401808260ff1660ff16815260200191505060006040518083038186803b158015612d1557600080fd5b505afa158015612d29573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015612d5357600080fd5b810190808051640100000000811115612d6b57600080fd5b82810190506020810184811115612d8157600080fd5b8151856001820283011164010000000082111715612d9e57600080fd5b505092919050505090612e4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e11578082015181840152602081019050612df6565b50505050905090810190601f168015612e3e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50612e5787876140d1565b94505050505092915050565b612e6c336120a8565b612ec1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b612eca816140ef565b50565b600082821015612ee05760019050612fac565b6000612f37600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154846137e090919063ffffffff16565b905060008185111590506000600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154421190508080612f935750815b15612fa45760019350505050612fac565b600093505050505b9392505050565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561305c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806149986029913960400191505060405180910390fd5b600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d4ce14158585856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060206040518083038186803b15801561313757600080fd5b505afa15801561314b573d6000803e3d6000fd5b505050506040513d602081101561316157600080fd5b810190808051906020019092919050505090509392505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff169050919050565b60006131df336120a8565b613234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b81600d60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f6c0cb4cdcdbedb9d71fdb2e31e3ad5a42fc2cffc2642730034017c04192e3afe600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a160019050919050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006133c9336119ef565b61341e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061478a6038913960400191505060405180910390fd5b428211613476576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806148a96026913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613519576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f41646472657373206d7573742062652076616c696420666f72206c6f636b757081525060200191505060405180910390fd5b6135216146a3565b604051806040016040528085815260200184815250905080600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101559050507fd204e81d84b52b5a19d16a46f86c9a7d66d37c207b982c21d8d1810757b61bae858585604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a160019150509392505050565b600061361933613752565b61366e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806147586032913960400191505060405180910390fd5b613679833384614160565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb698e31a2abee5824d0d7bcfd2339aead7f9e9ae413fba50bf554ff3fa470b7b846040518082815260200191505060405180910390a36001905092915050565b6136f1336120a8565b613746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b61374f8161441a565b50565b6000613768826007613a2990919063ffffffff16565b9050919050565b61378381600a61448b90919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f28f069fa8730ef5d44b24faedbcabf2b254c53f4e02a953476a4015e3067714160405160405180910390a350565b600061382283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614011565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156138b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061492e6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561393e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806147366022913960400191505060405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ab0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061485f6022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b613b1b81600661456690919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f9300367960405160405180910390a350565b6000613b85848484614160565b613c4684613b9161382a565b613c418560405180606001604052806028815260200161483760289139600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000613bf761382a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140119092919063ffffffff16565b613832565b600190509392505050565b600080828401905083811015613ccf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000600d60006101000a81548160ff0219169083151502179055507fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693360405160405180910390a1565b613d3681600c61456690919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fb75903ade4a0fdb07d60c882c22c779e2e1c751883c37aecdcc92a8ec72b046e60405160405180910390a350565b613da781600661448b90919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a60405160405180910390a350565b613e1881600861456690919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f3ed21605dd544629fb45f2ccaedcc095ba1dbea540fb6eaf5493a7479856b0be60405160405180910390a350565b613e8981600c61448b90919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fe0953c403a52f9dc1fef4202a8d33975c958b727bee0d7b5b328965ddad98d8160405160405180910390a350565b613efa81600a61456690919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f1bac2ef39c5011bb7c20ecf6bc7cb986695b3f432a149d898c0ed368e55c780660405160405180910390a350565b6001600d60006101000a81548160ff0219169083151502179055507f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75260405160405180910390a1565b613fb481600761448b90919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f2b5f18afd9a7b21f41bf023b012b3d4c8a22a21b79fa425cd4494ecbe297019660405160405180910390a350565b60008383111582906140be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614083578082015181840152602081019050614068565b50505050905090810190601f1680156140b05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60006140e56140de61382a565b8484614160565b6001905092915050565b61410381600761456690919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fb6fe3ab11eb9ab1d9f1d41c8f42a5d72d10122099ba1548e4a6d1a4d8cefec4b60405160405180910390a350565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156141e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806148cf6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561426c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146e36023913960400191505060405180910390fd5b6142d8816040518060600160405280602681526020016147c260269139600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140119092919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061436d81600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c5190919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b61442e81600861448b90919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f5f36f4f5999f34947706fca376b955319b858573bf9d6bc59303c9a4cd80ced060405160405180910390a350565b6144958282613a29565b15614508576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6145708282613a29565b6145c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806148166021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061466457805160ff1916838001178555614692565b82800160010185558215614692579182015b82811115614691578251825591602001919060010190614676565b5b50905061469f91906146bd565b5090565b604051806040016040528060008152602001600081525090565b6146df91905b808211156146db5760008160009055506001016146c3565b5090565b9056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c6545524332303a20617070726f766520746f20746865207a65726f20616464726573735265766f6b6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865205265766f6b657220726f6c6554696d656c6f636b6572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652054696d656c6f636b657220726f6c6545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654f776e6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204f776e657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f20616464726573734f776e6572732063616e6e6f742072656d6f7665207468656d73656c766573206173206f776e657252656c656173652074696d65206e6565647320746f20626520696e207468652066757475726545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737357686974656c6973746572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652057686974656c697374657220726f6c6545524332303a20617070726f76652066726f6d20746865207a65726f206164647265737341646472657373206d7573742062652076616c696420666f722072656c6561736545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f5472616e736665725265737472696374696f6e7320636f6e7472616374206d75737420626520736574a165627a7a72305820fd2b7c0b63c2b263df6c412efa85ea764ada4d00a7fd7bffebfbf707855dd9f60029526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373000000000000000000000000e0f92fb0d2634a5f814158eaecbdd752ebdac282

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102745760003560e01c80637f4ab1dd11610151578063a9059cbb116100c3578063db0cc92a11610087578063db0cc92a146110f6578063dd62ed3e14611152578063e2ab691d146111ca578063eac449d91461123a578063eaf9144a146112a0578063f6c4b01f146112e457610274565b8063a9059cbb14610ef8578063c06f8b9414610f5e578063c697e4a314610fa2578063d4ce141514611012578063d9ba32fc1461109a57610274565b806395d89b411161011557806395d89b4114610c28578063961a66f614610cab57806399da091d14610cef5780639a6e292f14610d6b5780639b19251a14610dca578063a457c2d714610e9257610274565b80637f4ab1dd14610aa857806382c3f79c14610b5257806382dc1ec414610b96578063841aca4414610bda5780638456cb5914610c1e57610274565b80632f54bf6e116101ea5780635c975abb116101ae5780635c975abb1461088d57806368aa9813146108af5780636b2c0f551461096c5780637065cb48146109b057806370a08231146109f45780637d0c269f14610a4c57610274565b80632f54bf6e14610741578063313ce5671461079d57806339509351146107c15780633f4ba83a1461082757806346fbf68e1461083157610274565b8063095ea7b31161023c578063095ea7b3146104985780630c57133f146104fe578063173825d91461055a57806318160ddd1461059e57806323b872dd146105bc57806327ac19751461064257610274565b8063031d4053146102795780630357371d146102bd57806305557bd41461032357806306fdde031461036d5780630754cede146103f0575b600080fd5b6102bb6004803603602081101561028f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611340565b005b610309600480360360408110156102d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113aa565b604051808215151515815260200191505060405180910390f35b61032b611708565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610375611732565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103b557808201518184015260208101905061039a565b50505050905090810190601f1680156103e25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61047c6004803603608081101561040657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117d4565b604051808260ff1660ff16815260200191505060405180910390f35b6104e4600480360360408110156104ae57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119d1565b604051808215151515815260200191505060405180910390f35b6105406004803603602081101561051457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119ef565b604051808215151515815260200191505060405180910390f35b61059c6004803603602081101561057057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a0c565b005b6105a6611afb565b6040518082815260200191505060405180910390f35b610628600480360360608110156105d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b05565b604051808215151515815260200191505060405180910390f35b6107276004803603606081101561065857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190803590602001906401000000008111156106a157600080fd5b8201836020820111156106b357600080fd5b803590602001918460018302840111640100000000831117156106d557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611ecb565b604051808215151515815260200191505060405180910390f35b6107836004803603602081101561075757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120a8565b604051808215151515815260200191505060405180910390f35b6107a56120c5565b604051808260ff1660ff16815260200191505060405180910390f35b61080d600480360360408110156107d757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506120dc565b604051808215151515815260200191505060405180910390f35b61082f61218f565b005b6108736004803603602081101561084757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121f7565b604051808215151515815260200191505060405180910390f35b610895612214565b604051808215151515815260200191505060405180910390f35b6108f1600480360360208110156108c557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061222b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610931578082015181840152602081019050610916565b50505050905090810190601f16801561095e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6109ae6004803603602081101561098257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061230f565b005b6109f2600480360360208110156109c657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612379565b005b610a3660048036036020811015610a0a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123e3565b6040518082815260200191505060405180910390f35b610a8e60048036036020811015610a6257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061242c565b604051808215151515815260200191505060405180910390f35b610ad760048036036020811015610abe57600080fd5b81019080803560ff169060200190929190505050612449565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b17578082015181840152602081019050610afc565b50505050905090810190601f168015610b445780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610b9460048036036020811015610b6857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061255c565b005b610bd860048036036020811015610bac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125c6565b005b610c1c60048036036020811015610bf057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612630565b005b610c2661269a565b005b610c30612702565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c70578082015181840152602081019050610c55565b50505050905090810190601f168015610c9d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610ced60048036036020811015610cc157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127a4565b005b610d5160048036036040811015610d0557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061280e565b604051808215151515815260200191505060405180910390f35b610dad60048036036020811015610d8157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128c0565b604051808381526020018281526020019250505060405180910390f35b610e0c60048036036020811015610de057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061293f565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610e56578082015181840152602081019050610e3b565b50505050905090810190601f168015610e835780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b610ede60048036036040811015610ea857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612a08565b604051808215151515815260200191505060405180910390f35b610f4460048036036040811015610f0e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612ad5565b604051808215151515815260200191505060405180910390f35b610fa060048036036020811015610f7457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e63565b005b610ff860048036036060811015610fb857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612ecd565b604051808215151515815260200191505060405180910390f35b61107e6004803603606081101561102857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612fb3565b604051808260ff1660ff16815260200191505060405180910390f35b6110dc600480360360208110156110b057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061317b565b604051808215151515815260200191505060405180910390f35b6111386004803603602081101561110c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506131d4565b604051808215151515815260200191505060405180910390f35b6111b46004803603604081101561116857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613337565b6040518082815260200191505060405180910390f35b611220600480360360608110156111e057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506133be565b604051808215151515815260200191505060405180910390f35b6112866004803603604081101561125057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061360e565b604051808215151515815260200191505060405180910390f35b6112e2600480360360208110156112b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506136e8565b005b611326600480360360208110156112fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613752565b604051808215151515815260200191505060405180910390f35b611349336120a8565b61139e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b6113a78161376f565b50565b60006113b5336119ef565b61140a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061478a6038913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611490576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149526021913960400191505060405180910390fd5b6000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506000811415611556577f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e1846000604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a16001915050611702565b6000600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000808201600090556001820160009055505083821061169057600061160b85846137e090919063ffffffff16565b90506116188682846133be565b507f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e18686604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a160019350505050611702565b7f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e18583604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a16001925050505b92915050565b6000600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117ca5780601f1061179f576101008083540402835291602001916117ca565b820191906000526020600020905b8154815290600101906020018083116117ad57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561187d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806149986029913960400191505060405180910390fd5b600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630754cede868686866040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200194505050505060206040518083038186803b15801561198c57600080fd5b505afa1580156119a0573d6000803e3d6000fd5b505050506040513d60208110156119b657600080fd5b81019080805190602001909291905050509050949350505050565b60006119e56119de61382a565b8484613832565b6001905092915050565b6000611a0582600a613a2990919063ffffffff16565b9050919050565b611a15336120a8565b611a6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611aef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806148816028913960400191505060405180910390fd5b611af881613b07565b50565b6000600554905090565b6000338484846000600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630754cede868686866040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200194505050505060206040518083038186803b158015611c1c57600080fd5b505afa158015611c30573d6000803e3d6000fd5b505050506040513d6020811015611c4657600080fd5b81019080805190602001909291905050509050600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635ec647596040518163ffffffff1660e01b815260040160206040518083038186803b158015611cc157600080fd5b505afa158015611cd5573d6000803e3d6000fd5b505050506040513d6020811015611ceb57600080fd5b81019080805190602001909291905050508160ff1614600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637f4ab1dd836040518263ffffffff1660e01b8152600401808260ff1660ff16815260200191505060006040518083038186803b158015611d7a57600080fd5b505afa158015611d8e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015611db857600080fd5b810190808051640100000000811115611dd057600080fd5b82810190506020810184811115611de657600080fd5b8151856001820283011164010000000082111715611e0357600080fd5b505092919050505090611eb1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611e76578082015181840152602081019050611e5b565b50505050905090810190601f168015611ea35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50611ebd898989613b78565b955050505050509392505050565b6000611ed63361242c565b611f2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a8152602001806148f4603a913960400191505060405180910390fd5b6040518060400160405280841515815260200183815250600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001019080519060200190611fbd929190614623565b509050507f461193ae6c23672174f7a3ea35649aacdc857bfcae58cd12d61ea432c05bcbd5848484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018315151515815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612061578082015181840152602081019050612046565b50505050905090810190601f16801561208e5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1600190509392505050565b60006120be826006613a2990919063ffffffff16565b9050919050565b6000600260009054906101000a900460ff16905090565b60006121856120e961382a565b8461218085600460006120fa61382a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c5190919063ffffffff16565b613832565b6001905092915050565b612198336121f7565b6121ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806147066030913960400191505060405180910390fd5b6121f5613cd9565b565b600061220d82600c613a2990919063ffffffff16565b9050919050565b6000600d60009054906101000a900460ff16905090565b6060600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123035780601f106122d857610100808354040283529160200191612303565b820191906000526020600020905b8154815290600101906020018083116122e657829003601f168201915b50505050509050919050565b612318336120a8565b61236d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b61237681613d22565b50565b612382336120a8565b6123d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b6123e081613d93565b50565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000612442826008613a2990919063ffffffff16565b9050919050565b6060600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637f4ab1dd836040518263ffffffff1660e01b8152600401808260ff1660ff16815260200191505060006040518083038186803b1580156124c457600080fd5b505afa1580156124d8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250602081101561250257600080fd5b81019080805164010000000081111561251a57600080fd5b8281019050602081018481111561253057600080fd5b815185600182028301116401000000008211171561254d57600080fd5b50509291905050509050919050565b612565336120a8565b6125ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b6125c381613e04565b50565b6125cf336120a8565b612624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b61262d81613e75565b50565b612639336120a8565b61268e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b61269781613ee6565b50565b6126a3336121f7565b6126f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806147066030913960400191505060405180910390fd5b612700613f57565b565b606060018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561279a5780601f1061276f5761010080835404028352916020019161279a565b820191906000526020600020905b81548152906001019060200180831161277d57829003601f168201915b5050505050905090565b6127ad336120a8565b612802576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b61280b81613fa0565b50565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1680156128b85750600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff165b905092915050565b6000806128cb6146a3565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806040016040529081600082015481526020016001820154815250509050806020015181600001519250925050915091565b60096020528060005260406000206000915090508060000160009054906101000a900460ff1690806001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129fe5780601f106129d3576101008083540402835291602001916129fe565b820191906000526020600020905b8154815290600101906020018083116129e157829003601f168201915b5050505050905082565b6000612acb612a1561382a565b84612ac6856040518060600160405280602581526020016149736025913960046000612a3f61382a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140119092919063ffffffff16565b613832565b6001905092915050565b60003383836000600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d4ce14158585856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060206040518083038186803b158015612bb757600080fd5b505afa158015612bcb573d6000803e3d6000fd5b505050506040513d6020811015612be157600080fd5b81019080805190602001909291905050509050600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635ec647596040518163ffffffff1660e01b815260040160206040518083038186803b158015612c5c57600080fd5b505afa158015612c70573d6000803e3d6000fd5b505050506040513d6020811015612c8657600080fd5b81019080805190602001909291905050508160ff1614600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637f4ab1dd836040518263ffffffff1660e01b8152600401808260ff1660ff16815260200191505060006040518083038186803b158015612d1557600080fd5b505afa158015612d29573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015612d5357600080fd5b810190808051640100000000811115612d6b57600080fd5b82810190506020810184811115612d8157600080fd5b8151856001820283011164010000000082111715612d9e57600080fd5b505092919050505090612e4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e11578082015181840152602081019050612df6565b50505050905090810190601f168015612e3e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50612e5787876140d1565b94505050505092915050565b612e6c336120a8565b612ec1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b612eca816140ef565b50565b600082821015612ee05760019050612fac565b6000612f37600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154846137e090919063ffffffff16565b905060008185111590506000600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154421190508080612f935750815b15612fa45760019350505050612fac565b600093505050505b9392505050565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561305c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806149986029913960400191505060405180910390fd5b600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d4ce14158585856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060206040518083038186803b15801561313757600080fd5b505afa15801561314b573d6000803e3d6000fd5b505050506040513d602081101561316157600080fd5b810190808051906020019092919050505090509392505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff169050919050565b60006131df336120a8565b613234576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b81600d60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f6c0cb4cdcdbedb9d71fdb2e31e3ad5a42fc2cffc2642730034017c04192e3afe600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a160019050919050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006133c9336119ef565b61341e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061478a6038913960400191505060405180910390fd5b428211613476576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806148a96026913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613519576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f41646472657373206d7573742062652076616c696420666f72206c6f636b757081525060200191505060405180910390fd5b6135216146a3565b604051806040016040528085815260200184815250905080600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101559050507fd204e81d84b52b5a19d16a46f86c9a7d66d37c207b982c21d8d1810757b61bae858585604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a160019150509392505050565b600061361933613752565b61366e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806147586032913960400191505060405180910390fd5b613679833384614160565b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb698e31a2abee5824d0d7bcfd2339aead7f9e9ae413fba50bf554ff3fa470b7b846040518082815260200191505060405180910390a36001905092915050565b6136f1336120a8565b613746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806147e8602e913960400191505060405180910390fd5b61374f8161441a565b50565b6000613768826007613a2990919063ffffffff16565b9050919050565b61378381600a61448b90919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f28f069fa8730ef5d44b24faedbcabf2b254c53f4e02a953476a4015e3067714160405160405180910390a350565b600061382283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614011565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156138b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061492e6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561393e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806147366022913960400191505060405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ab0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061485f6022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b613b1b81600661456690919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f9300367960405160405180910390a350565b6000613b85848484614160565b613c4684613b9161382a565b613c418560405180606001604052806028815260200161483760289139600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000613bf761382a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140119092919063ffffffff16565b613832565b600190509392505050565b600080828401905083811015613ccf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000600d60006101000a81548160ff0219169083151502179055507fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693360405160405180910390a1565b613d3681600c61456690919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fb75903ade4a0fdb07d60c882c22c779e2e1c751883c37aecdcc92a8ec72b046e60405160405180910390a350565b613da781600661448b90919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a60405160405180910390a350565b613e1881600861456690919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f3ed21605dd544629fb45f2ccaedcc095ba1dbea540fb6eaf5493a7479856b0be60405160405180910390a350565b613e8981600c61448b90919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fe0953c403a52f9dc1fef4202a8d33975c958b727bee0d7b5b328965ddad98d8160405160405180910390a350565b613efa81600a61456690919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f1bac2ef39c5011bb7c20ecf6bc7cb986695b3f432a149d898c0ed368e55c780660405160405180910390a350565b6001600d60006101000a81548160ff0219169083151502179055507f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75260405160405180910390a1565b613fb481600761448b90919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f2b5f18afd9a7b21f41bf023b012b3d4c8a22a21b79fa425cd4494ecbe297019660405160405180910390a350565b60008383111582906140be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614083578082015181840152602081019050614068565b50505050905090810190601f1680156140b05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60006140e56140de61382a565b8484614160565b6001905092915050565b61410381600761456690919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fb6fe3ab11eb9ab1d9f1d41c8f42a5d72d10122099ba1548e4a6d1a4d8cefec4b60405160405180910390a350565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156141e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806148cf6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561426c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806146e36023913960400191505060405180910390fd5b6142d8816040518060600160405280602681526020016147c260269139600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140119092919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061436d81600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c5190919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b61442e81600861448b90919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f5f36f4f5999f34947706fca376b955319b858573bf9d6bc59303c9a4cd80ced060405160405180910390a350565b6144958282613a29565b15614508576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6145708282613a29565b6145c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806148166021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061466457805160ff1916838001178555614692565b82800160010185558215614692579182015b82811115614691578251825591602001919060010190614676565b5b50905061469f91906146bd565b5090565b604051806040016040528060008152602001600081525090565b6146df91905b808211156146db5760008160009055506001016146c3565b5090565b9056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c6545524332303a20617070726f766520746f20746865207a65726f20616464726573735265766f6b6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865205265766f6b657220726f6c6554696d656c6f636b6572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652054696d656c6f636b657220726f6c6545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654f776e6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204f776e657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f20616464726573734f776e6572732063616e6e6f742072656d6f7665207468656d73656c766573206173206f776e657252656c656173652074696d65206e6565647320746f20626520696e207468652066757475726545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737357686974656c6973746572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652057686974656c697374657220726f6c6545524332303a20617070726f76652066726f6d20746865207a65726f206164647265737341646472657373206d7573742062652076616c696420666f722072656c6561736545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f5472616e736665725265737472696374696f6e7320636f6e7472616374206d75737420626520736574a165627a7a72305820fd2b7c0b63c2b263df6c412efa85ea764ada4d00a7fd7bffebfbf707855dd9f60029

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

000000000000000000000000e0f92fb0d2634a5f814158eaecbdd752ebdac282

-----Decoded View---------------
Arg [0] : owner (address): 0xe0f92Fb0d2634a5f814158EaeCBDD752EbDAC282

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000e0f92fb0d2634a5f814158eaecbdd752ebdac282


Deployed Bytecode Sourcemap

38139:5248:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38139:5248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29070:99;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29070:99:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;31068:1142;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31068:1142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;39786:120;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37116:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;37116:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40752:513;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;40752:513:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17911:152;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17911:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;28945:117;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28945:117:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;5302:180;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5302:180:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;16932:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43139:245;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;43139:245:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27314:237;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27314:237:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;27314:237:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;27314:237:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;27314:237:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;27314:237:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;5090:107;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5090:107:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37968:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;19248:210;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19248:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36331:66;;;:::i;:::-;;34691:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34691:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35661:80;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27933:128;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27933:128:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;27933:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34907:97;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34907:97:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;5205:89;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5205:89:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;17086:110;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17086:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25796:119;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25796:119:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;41500:318;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41500:318:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;41500:318:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26032:107;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26032:107:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;34808:91;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34808:91:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;29177:105;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29177:105:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;36173:62;;;:::i;:::-;;37318:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;37318:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24241:93;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24241:93:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;28287:152;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28287:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33978:251;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33978:251:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;27019:51;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27019:51:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;27019:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19961:261;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19961:261:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;42830:199;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42830:199:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24342:99;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24342:99:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;32500:1259;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32500:1259:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;40090:476;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40090:476:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27667:123;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27667:123:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;39389:315;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39389:315:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17630:134;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17630:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30416:482;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30416:482:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25044:235;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25044:235:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25923:101;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25923:101:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;24122:111;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24122:111:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;29070:99;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29138:23;29153:7;29138:14;:23::i;:::-;29070:99;:::o;31068:1142::-;31159:4;28832:24;28845:10;28832:12;:24::i;:::-;28824:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31204:1;31184:22;;:8;:22;;;;31176:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31257:21;31281:7;:17;31289:8;31281:17;;;;;;;;;;;;;;;:24;;;31257:48;;31369:1;31352:13;:18;31349:107;;;31391:27;31406:8;31416:1;31391:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;31440:4;31433:11;;;;;31349:107;31516:20;31539:7;:17;31547:8;31539:17;;;;;;;;;;;;;;;:29;;;31516:52;;31622:7;:17;31630:8;31622:17;;;;;;;;;;;;;;;;31615:24;;;;;;;;;;;;;;31672:15;31655:13;:32;31652:551;;31702:23;31728:34;31746:15;31728:13;:17;;:34;;;;:::i;:::-;31702:60;;31824:45;31829:8;31839:15;31856:12;31824:4;:45::i;:::-;;31888:41;31903:8;31913:15;31888:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;31950:4;31943:11;;;;;;;31652:551;32126:39;32141:8;32151:13;32126:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;32187:4;32180:11;;;;28928:1;31068:1142;;;;:::o;39786:120::-;39842:7;39877:20;;;;;;;;;;;39862:36;;39786:120;:::o;37116:83::-;37153:13;37186:5;37179:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37116:83;:::o;40752:513::-;40898:5;41020:1;40979:43;;40987:20;;;;;;;;;;;40979:43;;;;40971:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41181:20;;;;;;;;;;;:50;;;41232:6;41240:4;41246:2;41250:6;41181:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41181:76:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41181:76:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41181:76:0;;;;;;;;;;;;;;;;41173:84;;40752:513;;;;;;:::o;17911:152::-;17977:4;17994:39;18003:12;:10;:12::i;:::-;18017:7;18026:6;17994:8;:39::i;:::-;18051:4;18044:11;;17911:152;;;;:::o;28945:117::-;29005:4;29029:25;29046:7;29029:12;:16;;:25;;;;:::i;:::-;29022:32;;28945:117;;;:::o;5302:180::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5390:7;5376:21;;:10;:21;;;;5368:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5453:21;5466:7;5453:12;:21::i;:::-;5302:180;:::o;16932:91::-;16976:7;17003:12;;16996:19;;16932:91;:::o;43139:245::-;43301:12;43254:10;43266:4;43272:2;43276:5;42424:33;42460:20;;;;;;;;;;;:50;;;42511:6;42519:4;42525:2;42529:5;42460:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42460:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42460:75:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42460:75:0;;;;;;;;;;;;;;;;42424:111;;42585:20;;;;;;;;;;;:35;;;:37;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42585:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42585:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42585:37:0;;;;;;;;;;;;;;;;42554:27;:68;;;42624:20;;;;;;;;;;;:50;;;42675:27;42624:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42624:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42624:79:0;;;;;;39:16:-1;36:1;17:17;2:54;42624:79:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42624:79:0;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;138:31;135:2;;;182:1;179;172:12;135:2;219:3;213:10;330:9;325:1;311:12;307:20;289:16;285:43;282:58;261:11;247:12;244:29;233:115;230:2;;;361:1;358;351:12;230:2;0:372;;42624:79:0;;;;;;42546:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;42546:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43341:35;43360:4;43366:2;43370:5;43341:18;:35::i;:::-;43331:45;;43139:245;;;;;;;;;;:::o;27314:237::-;27413:4;25680:25;25694:10;25680:13;:25::i;:::-;25672:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27445:27;;;;;;;;27459:6;27445:27;;;;;;27467:4;27445:27;;;27429:9;:13;27439:2;27429:13;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;27488:33;27504:2;27508:6;27516:4;27488:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;27488:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27539:4;27532:11;;27314:237;;;;;:::o;5090:107::-;5145:4;5169:20;5181:7;5169;:11;;:20;;;;:::i;:::-;5162:27;;5090:107;;;:::o;37968:83::-;38009:5;38034:9;;;;;;;;;;;38027:16;;37968:83;:::o;19248:210::-;19328:4;19345:83;19354:12;:10;:12::i;:::-;19368:7;19377:50;19416:10;19377:11;:25;19389:12;:10;:12::i;:::-;19377:25;;;;;;;;;;;;;;;:34;19403:7;19377:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;19345:8;:83::i;:::-;19446:4;19439:11;;19248:210;;;;:::o;36331:66::-;34590:20;34599:10;34590:8;:20::i;:::-;34582:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36379:10;:8;:10::i;:::-;36331:66::o;34691:109::-;34747:4;34771:21;34784:7;34771:8;:12;;:21;;;;:::i;:::-;34764:28;;34691:109;;;:::o;35661:80::-;35702:4;35726:7;;;;;;;;;;;35719:14;;35661:80;:::o;27933:128::-;27997:13;28029:9;:19;28039:8;28029:19;;;;;;;;;;;;;;;:24;;28022:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27933:128;;;:::o;34907:97::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34974:22;34988:7;34974:13;:22::i;:::-;34907:97;:::o;5205:89::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5268:18;5278:7;5268:9;:18::i;:::-;5205:89;:::o;17086:110::-;17143:7;17170:9;:18;17180:7;17170:18;;;;;;;;;;;;;;;;17163:25;;17086:110;;;:::o;25796:119::-;25857:4;25881:26;25899:7;25881:13;:17;;:26;;;;:::i;:::-;25874:33;;25796:119;;;:::o;41500:318::-;41613:13;41743:20;;;;;;;;;;;:50;;;41794:15;41743:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41743:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41743:67:0;;;;;;39:16:-1;36:1;17:17;2:54;41743:67:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41743:67:0;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;138:31;135:2;;;182:1;179;172:12;135:2;219:3;213:10;330:9;325:1;311:12;307:20;289:16;285:43;282:58;261:11;247:12;244:29;233:115;230:2;;;361:1;358;351:12;230:2;0:372;;41743:67:0;;;;;;41736:74;;41500:318;;;:::o;26032:107::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26104:27;26123:7;26104:18;:27::i;:::-;26032:107;:::o;34808:91::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34872:19;34883:7;34872:10;:19::i;:::-;34808:91;:::o;29177:105::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29248:26;29266:7;29248:17;:26::i;:::-;29177:105;:::o;36173:62::-;34590:20;34599:10;34590:8;:20::i;:::-;34582:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36219:8;:6;:8::i;:::-;36173:62::o;37318:87::-;37357:13;37390:7;37383:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37318:87;:::o;24241:93::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24306:20;24318:7;24306:11;:20::i;:::-;24241:93;:::o;28287:152::-;28361:4;28385:9;:15;28395:4;28385:15;;;;;;;;;;;;;;;:22;;;;;;;;;;;;:46;;;;;28411:9;:13;28421:2;28411:13;;;;;;;;;;;;;;;:20;;;;;;;;;;;;28385:46;28378:53;;28287:152;;;;:::o;33978:251::-;34037:7;34046;34107:29;;:::i;:::-;34139:7;:17;34147:8;34139:17;;;;;;;;;;;;;;;34107:49;;;;;;;;;;;;;;;;;;;;;;;;;;;34177:11;:23;;;34202:11;:18;;;34169:52;;;;;33978:251;;;:::o;27019:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19961:261::-;20046:4;20063:129;20072:12;:10;:12::i;:::-;20086:7;20095:96;20134:15;20095:96;;;;;;;;;;;;;;;;;:11;:25;20107:12;:10;:12::i;:::-;20095:25;;;;;;;;;;;;;;;:34;20121:7;20095:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;20063:8;:129::i;:::-;20210:4;20203:11;;19961:261;;;;:::o;42830:199::-;42956:12;42915:10;42927:2;42931:5;41979:21;42003:20;;;;;;;;;;;:46;;;42050:4;42056:2;42060:5;42003:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42003:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42003:63:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42003:63:0;;;;;;;;;;;;;;;;41979:87;;42104:20;;;;;;;;;;;:35;;;:37;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42104:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42104:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42104:37:0;;;;;;;;;;;;;;;;42085:15;:56;;;42143:20;;;;;;;;;;;:50;;;42194:15;42143:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42143:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42143:67:0;;;;;;39:16:-1;36:1;17:17;2:54;42143:67:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42143:67:0;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;138:31;135:2;;;182:1;179;172:12;135:2;219:3;213:10;330:9;325:1;311:12;307:20;289:16;285:43;282:58;261:11;247:12;244:29;233:115;230:2;;;361:1;358;351:12;230:2;0:372;;42143:67:0;;;;;;42077:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;42077:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42996:25;43011:2;43015:5;42996:14;:25::i;:::-;42986:35;;42830:199;;;;;;;;:::o;24342:99::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24410:23;24425:7;24410:14;:23::i;:::-;24342:99;:::o;32500:1259::-;32597:4;32900:6;32890:7;:16;32886:60;;;32930:4;32923:11;;;;32886:60;33029:23;33055:37;33067:7;:17;33075:8;33067:17;;;;;;;;;;;;;;;:24;;;33055:7;:11;;:37;;;;:::i;:::-;33029:63;;33199:14;33226:15;33216:6;:25;;33199:42;;33340:20;33381:7;:17;33389:8;33381:17;;;;;;;;;;;;;;;:29;;;33363:15;:47;33340:70;;33529:15;:28;;;;33548:9;33529:28;33526:226;;;33580:4;33573:11;;;;;;;33526:226;33735:5;33728:12;;;;;32500:1259;;;;;;:::o;40090:476::-;40216:5;40338:1;40297:43;;40305:20;;;;;;;;;;;40297:43;;;;40289:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40494:20;;;;;;;;;;;:46;;;40541:4;40547:2;40551:6;40494:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40494:64:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40494:64:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40494:64:0;;;;;;;;;;;;;;;;40487:71;;40090:476;;;;;:::o;27667:123::-;27733:4;27756:9;:19;27766:8;27756:19;;;;;;;;;;;;;;;:26;;;;;;;;;;;;27749:33;;27667:123;;;:::o;39389:315::-;39511:4;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39572:23;39533:20;;:63;;;;;;;;;;;;;;;;;;39612:62;39640:20;;;;;;;;;;;39663:10;39612:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39692:4;39685:11;;39389:315;;;:::o;17630:134::-;17702:7;17729:11;:18;17741:5;17729:18;;;;;;;;;;;;;;;:27;17748:7;17729:27;;;;;;;;;;;;;;;;17722:34;;17630:134;;;;:::o;30416:482::-;30517:4;28832:24;28845:10;28832:12;:24::i;:::-;28824:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30556:15;30542:11;:29;30534:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30653:1;30633:22;;:8;:22;;;;30625:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30705:29;;:::i;:::-;30737:31;;;;;;;;30748:6;30737:31;;;;30756:11;30737:31;;;30705:63;;30799:11;30779:7;:17;30787:8;30779:17;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;;30826:42;30838:8;30848:6;30856:11;30826:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30886:4;30879:11;;;30416:482;;;;;:::o;25044:235::-;25150:4;24018:21;24028:10;24018:9;:21::i;:::-;24010:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25166:43;25182:5;25189:10;25201:7;25166:15;:43::i;:::-;25240:5;25221:34;;25228:10;25221:34;;;25247:7;25221:34;;;;;;;;;;;;;;;;;;25269:4;25262:11;;25044:235;;;;:::o;25923:101::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25992:24;26008:7;25992:15;:24::i;:::-;25923:101;:::o;24122:111::-;24179:4;24203:22;24217:7;24203:9;:13;;:22;;;;:::i;:::-;24196:29;;24122:111;;;:::o;29290:146::-;29351:25;29368:7;29351:12;:16;;:25;;;;:::i;:::-;29417:10;29392:36;;29408:7;29392:36;;;;;;;;;;;;29290:146;:::o;11220:136::-;11278:7;11305:43;11309:1;11312;11305:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;11298:50;;11220:136;;;;:::o;6633:98::-;6678:15;6713:10;6706:17;;6633:98;:::o;22893:338::-;23004:1;22987:19;;:5;:19;;;;22979:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23085:1;23066:21;;:7;:21;;;;23058:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23169:6;23139:11;:18;23151:5;23139:18;;;;;;;;;;;;;;;:27;23158:7;23139:27;;;;;;;;;;;;;;;:36;;;;23207:7;23191:32;;23200:5;23191:32;;;23216:6;23191:32;;;;;;;;;;;;;;;;;;22893:338;;;:::o;4416:203::-;4488:4;4532:1;4513:21;;:7;:21;;;;4505:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4591:4;:11;;:20;4603:7;4591:20;;;;;;;;;;;;;;;;;;;;;;;;;4584:27;;4416:203;;;;:::o;5629:139::-;5688:23;5703:7;5688;:14;;:23;;;;:::i;:::-;5749:10;5727:33;;5740:7;5727:33;;;;;;;;;;;;5629:139;:::o;18535:304::-;18624:4;18641:36;18651:6;18659:9;18670:6;18641:9;:36::i;:::-;18688:121;18697:6;18705:12;:10;:12::i;:::-;18719:89;18757:6;18719:89;;;;;;;;;;;;;;;;;:11;:19;18731:6;18719:19;;;;;;;;;;;;;;;:33;18739:12;:10;:12::i;:::-;18719:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;18688:8;:121::i;:::-;18827:4;18820:11;;18535:304;;;;;:::o;10764:181::-;10822:7;10842:9;10858:1;10854;:5;10842:17;;10883:1;10878;:6;;10870:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10936:1;10929:8;;;10764:181;;;;:::o;35989:89::-;36039:5;36029:7;;:15;;;;;;;;;;;;;;;;;;36060:10;;;;;;;;;;35989:89::o;35154:142::-;35214:24;35230:7;35214:8;:15;;:24;;;;:::i;:::-;35277:10;35254:34;;35268:7;35254:34;;;;;;;;;;;;35154:142;:::o;5490:131::-;5546:20;5558:7;5546;:11;;:20;;;;:::i;:::-;5602:10;5582:31;;5593:7;5582:31;;;;;;;;;;;;5490:131;:::o;26304:157::-;26369:29;26390:7;26369:13;:20;;:29;;;;:::i;:::-;26442:10;26414:39;;26433:7;26414:39;;;;;;;;;;;;26304:157;:::o;35012:134::-;35069:21;35082:7;35069:8;:12;;:21;;;;:::i;:::-;35127:10;35106:32;;35118:7;35106:32;;;;;;;;;;;;35012:134;:::o;29444:154::-;29508:28;29528:7;29508:12;:19;;:28;;;;:::i;:::-;29579:10;29552:38;;29570:7;29552:38;;;;;;;;;;;;29444:154;:::o;35821:84::-;35869:4;35859:7;;:14;;;;;;;;;;;;;;;;;;35889:8;;;;;;;;;;35821:84::o;24449:137::-;24507:22;24521:7;24507:9;:13;;:22;;;;:::i;:::-;24567:10;24545:33;;24558:7;24545:33;;;;;;;;;;;;24449:137;:::o;11693:192::-;11779:7;11812:1;11807;:6;;11815:12;11799:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;11799:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11839:9;11855:1;11851;:5;11839:17;;11876:1;11869:8;;;11693:192;;;;;:::o;17409:158::-;17478:4;17495:42;17505:12;:10;:12::i;:::-;17519:9;17530:6;17495:9;:42::i;:::-;17555:4;17548:11;;17409:158;;;;:::o;24594:145::-;24655:25;24672:7;24655:9;:16;;:25;;;;:::i;:::-;24720:10;24696:35;;24711:7;24696:35;;;;;;;;;;;;24594:145;:::o;20712:471::-;20828:1;20810:20;;:6;:20;;;;20802:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20912:1;20891:23;;:9;:23;;;;20883:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20987;21009:6;20987:71;;;;;;;;;;;;;;;;;:9;:17;20997:6;20987:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;20967:9;:17;20977:6;20967:17;;;;;;;;;;;;;;;:91;;;;21092:32;21117:6;21092:9;:20;21102:9;21092:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;21069:9;:20;21079:9;21069:20;;;;;;;;;;;;;;;:55;;;;21157:9;21140:35;;21149:6;21140:35;;;21168:6;21140:35;;;;;;;;;;;;;;;;;;20712:471;;;:::o;26147:149::-;26209:26;26227:7;26209:13;:17;;:26;;;;:::i;:::-;26277:10;26251:37;;26268:7;26251:37;;;;;;;;;;;;26147:149;:::o;3880:178::-;3958:18;3962:4;3968:7;3958:3;:18::i;:::-;3957:19;3949:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4046:4;4023;:11;;:20;4035:7;4023:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;3880:178;;:::o;4138:183::-;4218:18;4222:4;4228:7;4218:3;:18::i;:::-;4210:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4308:5;4285:4;:11;;:20;4297:7;4285:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;4138:183;;:::o;38139:5248::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://fd2b7c0b63c2b263df6c412efa85ea764ada4d00a7fd7bffebfbf707855dd9f6

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.