ETH Price: $3,409.72 (-0.68%)

Contract

0x8696BDE5Cc30545b3b049f3529abBfB2B1e0C007
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Create U Token167580602023-03-04 22:31:59633 days ago1677969119IN
Jenny: Deployer
0 ETH0.1491023535.66246906
Create U Token143526852022-03-09 12:52:22993 days ago1646830342IN
Jenny: Deployer
0 ETH0.0742154717.75134904
Create U Token143446352022-03-08 6:36:24994 days ago1646721384IN
Jenny: Deployer
0 ETH0.0993350222.66331286
Transfer136060842021-11-13 6:22:421109 days ago1636784562IN
Jenny: Deployer
0.558324 ETH0.00218858103.99568446
Create U Token134635342021-10-21 21:55:541132 days ago1634853354IN
Jenny: Deployer
0 ETH0.2859909467.35154276
Create U Token132273352021-09-15 1:19:301169 days ago1631668770IN
Jenny: Deployer
0 ETH0.1854272543.43369472
Create U Token131855142021-09-08 13:57:221175 days ago1631109442IN
Jenny: Deployer
0 ETH0.3691641986.93938714
Create U Token131854522021-09-08 13:44:171175 days ago1631108657IN
Jenny: Deployer
0 ETH0.3821657490.95756111
Create U Token131008352021-08-26 11:56:321188 days ago1629978992IN
Jenny: Deployer
0 ETH0.2234913253.19232269
Create U Token130756842021-08-22 14:35:461192 days ago1629642946IN
Jenny: Deployer
0 ETH0.2760355566.02287303
Create U Token130417412021-08-17 8:48:511197 days ago1629190131IN
Jenny: Deployer
0 ETH0.1189035128
Create U Token129431312021-08-02 1:40:211213 days ago1627868421IN
Jenny: Deployer
0 ETH0.0882230321
Create U Token128788272021-07-22 22:19:031223 days ago1626992343IN
Jenny: Deployer
0 ETH0.107300825
Create U Token128786982021-07-22 21:48:351223 days ago1626990515IN
Jenny: Deployer
0 ETH0.090129921
Create U Token128346852021-07-16 0:10:361230 days ago1626394236IN
Jenny: Deployer
0 ETH0.1316355731
Create U Token128305732021-07-15 8:49:541230 days ago1626338994IN
Jenny: Deployer
0 ETH0.1149739827.5
Create U Token128211512021-07-13 21:18:231232 days ago1626211103IN
Jenny: Deployer
0 ETH0.0011228
Create U Token127483452021-07-02 13:00:321243 days ago1625230832IN
Jenny: Deployer
0 ETH0.0517777412
Create U Token127023512021-06-25 9:00:381250 days ago1624611638IN
Jenny: Deployer
0 ETH0.1067321725
Set Fee To126857152021-06-22 18:49:451253 days ago1624387785IN
Jenny: Deployer
0 ETH0.0023483951
Create U Token126468902021-06-16 17:32:391259 days ago1623864759IN
Jenny: Deployer
0 ETH0.0567148113.50000072
Create U Token126468052021-06-16 17:17:421259 days ago1623863862IN
Jenny: Deployer
0 ETH0.1134283227
Create U Token126467882021-06-16 17:14:391259 days ago1623863679IN
Jenny: Deployer
0 ETH0.1169165227.83
Create U Token126345492021-06-14 19:45:221261 days ago1623699922IN
Jenny: Deployer
0 ETH0.0819789219
Create U Token126234212021-06-13 2:16:021263 days ago1623550562IN
Jenny: Deployer
0 ETH0.000276826
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
167580602023-03-04 22:31:59633 days ago1677969119
Jenny: Deployer
 Contract Creation0 ETH
143526852022-03-09 12:52:22993 days ago1646830342
Jenny: Deployer
 Contract Creation0 ETH
143446352022-03-08 6:36:24994 days ago1646721384
Jenny: Deployer
 Contract Creation0 ETH
134635342021-10-21 21:55:541132 days ago1634853354
Jenny: Deployer
 Contract Creation0 ETH
132273352021-09-15 1:19:301169 days ago1631668770
Jenny: Deployer
 Contract Creation0 ETH
131855142021-09-08 13:57:221175 days ago1631109442
Jenny: Deployer
 Contract Creation0 ETH
131854522021-09-08 13:44:171175 days ago1631108657
Jenny: Deployer
 Contract Creation0 ETH
131008352021-08-26 11:56:321188 days ago1629978992
Jenny: Deployer
 Contract Creation0 ETH
130756842021-08-22 14:35:461192 days ago1629642946
Jenny: Deployer
 Contract Creation0 ETH
130417412021-08-17 8:48:511197 days ago1629190131
Jenny: Deployer
 Contract Creation0 ETH
129431312021-08-02 1:40:211213 days ago1627868421
Jenny: Deployer
 Contract Creation0 ETH
128788272021-07-22 22:19:031223 days ago1626992343
Jenny: Deployer
 Contract Creation0 ETH
128786982021-07-22 21:48:351223 days ago1626990515
Jenny: Deployer
 Contract Creation0 ETH
128346852021-07-16 0:10:361230 days ago1626394236
Jenny: Deployer
 Contract Creation0 ETH
128305732021-07-15 8:49:541230 days ago1626338994
Jenny: Deployer
 Contract Creation0 ETH
127483452021-07-02 13:00:321243 days ago1625230832
Jenny: Deployer
 Contract Creation0 ETH
127023512021-06-25 9:00:381250 days ago1624611638
Jenny: Deployer
 Contract Creation0 ETH
126468902021-06-16 17:32:391259 days ago1623864759
Jenny: Deployer
 Contract Creation0 ETH
126468052021-06-16 17:17:421259 days ago1623863862
Jenny: Deployer
 Contract Creation0 ETH
126467882021-06-16 17:14:391259 days ago1623863679
Jenny: Deployer
 Contract Creation0 ETH
126345492021-06-14 19:45:221261 days ago1623699922
Jenny: Deployer
 Contract Creation0 ETH
125753732021-06-05 15:58:351270 days ago1622908715
Jenny: Deployer
 Contract Creation0 ETH
125705212021-06-04 21:46:531271 days ago1622843213
Jenny: Deployer
 Contract Creation0 ETH
125641412021-06-03 22:15:201272 days ago1622758520
Jenny: Deployer
 Contract Creation0 ETH
125464302021-06-01 4:23:491275 days ago1622521429
Jenny: Deployer
 Contract Creation0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UnicFactory

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/introspection/ERC165Checker.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2 <0.8.0;

/**
 * @dev Library used to query support of an interface declared via {IERC165}.
 *
 * Note that these functions return the actual result of the query: they do not
 * `revert` if an interface is not supported. It is up to the caller to decide
 * what to do in these cases.
 */
library ERC165Checker {
    // As per the EIP-165 spec, no interface should ever match 0xffffffff
    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;

    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Returns true if `account` supports the {IERC165} interface,
     */
    function supportsERC165(address account) internal view returns (bool) {
        // Any contract that implements ERC165 must explicitly indicate support of
        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid
        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&
            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);
    }

    /**
     * @dev Returns true if `account` supports the interface defined by
     * `interfaceId`. Support for {IERC165} itself is queried automatically.
     *
     * See {IERC165-supportsInterface}.
     */
    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {
        // query support of both ERC165 as per the spec and support of _interfaceId
        return supportsERC165(account) &&
            _supportsERC165Interface(account, interfaceId);
    }

    /**
     * @dev Returns true if `account` supports all the interfaces defined in
     * `interfaceIds`. Support for {IERC165} itself is queried automatically.
     *
     * Batch-querying can lead to gas savings by skipping repeated checks for
     * {IERC165} support.
     *
     * See {IERC165-supportsInterface}.
     */
    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {
        // query support of ERC165 itself
        if (!supportsERC165(account)) {
            return false;
        }

        // query support of each interface in _interfaceIds
        for (uint256 i = 0; i < interfaceIds.length; i++) {
            if (!_supportsERC165Interface(account, interfaceIds[i])) {
                return false;
            }
        }

        // all interfaces supported
        return true;
    }

    /**
     * @notice Query if a contract implements an interface, does not check ERC165 support
     * @param account The address of the contract to query for support of an interface
     * @param interfaceId The interface identifier, as specified in ERC-165
     * @return true if the contract at account indicates support of the interface with
     * identifier interfaceId, false otherwise
     * @dev Assumes that account contains a contract that supports ERC165, otherwise
     * the behavior of this method is undefined. This precondition can be checked
     * with {supportsERC165}.
     * Interface identification is specified in ERC-165.
     */
    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {
        // success determines whether the staticcall succeeded and result determines
        // whether the contract at account indicates support of _interfaceId
        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);

        return (success && result);
    }

    /**
     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw
     * @param account The address of the contract to query for support of an interface
     * @param interfaceId The interface identifier, as specified in ERC-165
     * @return success true if the STATICCALL succeeded, false otherwise
     * @return result true if the STATICCALL succeeded and the contract at account
     * indicates support of the interface with identifier interfaceId, false otherwise
     */
    function _callERC165SupportsInterface(address account, bytes4 interfaceId)
        private
        view
        returns (bool, bool)
    {
        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);
        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);
        if (result.length < 32) return (false, false);
        return (success, abi.decode(result, (bool)));
    }
}

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



pragma solidity >=0.6.0 <0.8.0;

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

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

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



pragma solidity >=0.6.0 <0.8.0;

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

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

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

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

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

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

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

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

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



pragma solidity >=0.6.0 <0.8.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.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

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

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

        return c;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

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

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



pragma solidity >=0.6.0 <0.8.0;




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

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

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

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name_, string memory symbol_) public {
        _name = name_;
        _symbol = symbol_;
        _decimals = 18;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

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

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

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

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

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

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

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

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

        _beforeTokenTransfer(sender, recipient, amount);

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

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

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

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

        _beforeTokenTransfer(account, address(0), amount);

        _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 internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

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

// File: @openzeppelin/contracts/introspection/IERC165.sol



pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol



pragma solidity >=0.6.2 <0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
      * @dev Safely transfers `tokenId` token from `from` to `to`.
      *
      * Requirements:
      *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
      * - `tokenId` token must exist and be owned by `from`.
      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
      *
      * Emits a {Transfer} event.
      */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol



pragma solidity >=0.6.2 <0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external;
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol



pragma solidity >=0.6.0 <0.8.0;


/**
 * _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {

    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    )
        external
        returns(bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    )
        external
        returns(bytes4);
}

// File: @openzeppelin/contracts/introspection/ERC165.sol



pragma solidity >=0.6.0 <0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/ERC1155Receiver.sol



pragma solidity >=0.6.0 <0.8.0;



/**
 * @dev _Available since v3.1._
 */
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
    constructor() internal {
        _registerInterface(
            ERC1155Receiver(0).onERC1155Received.selector ^
            ERC1155Receiver(0).onERC1155BatchReceived.selector
        );
    }
}

// File: contracts/interfaces/IUnicFactory.sol

pragma solidity >=0.5.0;

interface IUnicFactory {
    event TokenCreated(address indexed caller, address indexed uToken);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getUToken(address uToken) external view returns (uint);
    function uTokens(uint) external view returns (address);
    function uTokensLength() external view returns (uint);

    function createUToken(uint256 totalSupply, uint8 decimals, string calldata name, string calldata symbol, uint256 threshold, string calldata description) external returns (address);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

// File: contracts/Converter.sol

pragma solidity 0.6.12;








contract Converter is ERC20, ERC1155Receiver {
    using SafeMath for uint;

    // List of NFTs that have been deposited
    struct NFT {
        address contractAddr;
        uint256 tokenId;
        uint256 amount;
        bool claimed;
    }

    struct Bid {
        address bidder;
        uint256 amount;
        uint time;
    }

    mapping(uint256 => NFT) public nfts;
    // Current index and length of nfts
    uint256 public currentNFTIndex = 0;

    // If active, NFTs can’t be withdrawn
    bool public active = false;
    uint256 public totalBidAmount = 0;
    uint256 public unlockVotes = 0;
    uint256 public _threshold;
    address public issuer;
    string public _description;
    uint256 public cap;

    // Amount of uTokens each user has voted to unlock collection
    mapping(address => uint256) public unlockApproved;

    IUnicFactory public factory;

    // NFT index to Bid
    mapping(uint256 => Bid) public bids;
    // NFT index to address to amount
    mapping(uint256 => mapping(address => uint256)) public bidRefunds;
    uint public constant TOP_BID_LOCK_TIME = 3 days;

    event Deposited(uint256[] tokenIDs, uint256[] amounts, address contractAddr);
    event Refunded();
    event Issued();
    event BidCreated(address sender, uint256 nftIndex, uint256 bidAmount);
    event BidRemoved(address sender, uint256 nftIndex);
    event ClaimedNFT(address winner, uint256 nftIndex, uint256 tokenId);

    bytes private constant VALIDATOR = bytes('JCMY');

    constructor (uint256 totalSupply, uint8 decimals, string memory name, string memory symbol, uint256 threshold, string memory description, address _issuer, IUnicFactory _factory)
        public
        ERC20(name, symbol)
    {
        _setupDecimals(decimals);
        issuer = _issuer;
        _description = description;
        _threshold = threshold;
        factory = _factory;
        cap = totalSupply;
    }

    // deposits an nft using the transferFrom action of the NFT contractAddr
    function deposit(uint256[] calldata tokenIDs, uint256[] calldata amounts, address contractAddr) external {
        require(msg.sender == issuer, "Converter: Only issuer can deposit");
        require(tokenIDs.length <= 50, "Converter: A maximum of 50 tokens can be deposited in one go");
        require(tokenIDs.length > 0, "Converter: You must specify at least one token ID");

        if (ERC165Checker.supportsInterface(contractAddr, 0xd9b67a26)){
            IERC1155(contractAddr).safeBatchTransferFrom(msg.sender, address(this), tokenIDs, amounts, VALIDATOR);

            for (uint8 i = 0; i < 50; i++){
                if (tokenIDs.length == i){
                    break;
                }
                nfts[currentNFTIndex++] = NFT(contractAddr, tokenIDs[i], amounts[i], false);
            }
        }
        else if (ERC165Checker.supportsInterface(contractAddr, 0x80ac58cd)){
            for (uint8 i = 0; i < 50; i++){
                if (tokenIDs.length == i){
                    break;
                }
                IERC721(contractAddr).transferFrom(msg.sender, address(this), tokenIDs[i]);
                nfts[currentNFTIndex++] = NFT(contractAddr, tokenIDs[i], 1, false);
            }
        }

        emit Deposited(tokenIDs, amounts, contractAddr);
    }

    // Function that locks NFT collateral and issues the uTokens to the issuer
    function issue() external {
        require(msg.sender == issuer, "Converter: Only issuer can issue the tokens");
        require(active == false, "Converter: Token is already active");

        active = true;
        address feeTo = factory.feeTo();
        uint256 feeAmount = 0;
        if (feeTo != address(0)) {
            // 0.5% of uToken supply is sent to feeToAddress if fee is on
            feeAmount = cap.div(200);
            _mint(feeTo, feeAmount);
        }

        _mint(issuer, cap - feeAmount);

        emit Issued();
    }

    // Function that allows NFTs to be refunded (prior to issue being called)
    function refund(address _to) external {
        require(!active, "Converter: Contract is already active - cannot refund");
        require(msg.sender == issuer, "Converter: Only issuer can refund");

        // Only transfer maximum of 50 at a time to limit gas per call
        uint8 _i = 0;
        uint256 _index = currentNFTIndex;
        bytes memory data;

        while (_index > 0 && _i < 50){
            NFT memory nft = nfts[_index - 1];

            if (ERC165Checker.supportsInterface(nft.contractAddr, 0xd9b67a26)){
                IERC1155(nft.contractAddr).safeTransferFrom(address(this), _to, nft.tokenId, nft.amount, data);
            }
            else if (ERC165Checker.supportsInterface(nft.contractAddr, 0x80ac58cd)){
                IERC721(nft.contractAddr).safeTransferFrom(address(this), _to, nft.tokenId);
            }

            delete nfts[_index - 1];

            _index--;
            _i++;
        }

        currentNFTIndex = _index;

        emit Refunded();
    }

    function bid(uint256 nftIndex) external payable {
        require(unlockVotes < _threshold, "Converter: Release threshold has been met, no more bids allowed");
        Bid memory topBid = bids[nftIndex];
        require(topBid.bidder != msg.sender, "Converter: You have an active bid");
        require(topBid.amount < msg.value, "Converter: Bid too low");
        require(bidRefunds[nftIndex][msg.sender] == 0, "Converter: Collect bid refund");

        bids[nftIndex] = Bid(msg.sender, msg.value, getBlockTimestamp());
        bidRefunds[nftIndex][topBid.bidder] = topBid.amount;
        totalBidAmount += msg.value - topBid.amount;

        emit BidCreated(msg.sender, nftIndex, msg.value);
    }

    function unbid(uint256 nftIndex) external {
        Bid memory topBid = bids[nftIndex];
        bool isTopBidder = topBid.bidder == msg.sender;
        if (unlockVotes >= _threshold) {
            require(!isTopBidder, "Converter: Release threshold has been met, winner can't unbid");
        }

        if (isTopBidder) {
            require(topBid.time + TOP_BID_LOCK_TIME < getBlockTimestamp(), "Converter: Top bid locked");
            totalBidAmount -= topBid.amount;
            bids[nftIndex] = Bid(address(0), 0, getBlockTimestamp());
            (bool sent, bytes memory data) = msg.sender.call{value: topBid.amount}("");
            require(sent, "Converter: Failed to send Ether");

            emit BidRemoved(msg.sender, nftIndex);
        }
        else { 
            uint256 refundAmount = bidRefunds[nftIndex][msg.sender];
            require(refundAmount > 0, "Converter: no bid found");
            bidRefunds[nftIndex][msg.sender] = 0;
            (bool sent, bytes memory data) = msg.sender.call{value: refundAmount}("");
            require(sent, "Converter: Failed to send Ether");
        }
    }

    // Claim NFT if address is winning bidder
    function claim(uint256 nftIndex) external {
        require(unlockVotes >= _threshold, "Converter: Threshold not met");
        require(!nfts[nftIndex].claimed, "Converter: Already claimed");
        Bid memory topBid = bids[nftIndex];
        require(msg.sender == topBid.bidder, "Converter: Only winner can claim");

        nfts[nftIndex].claimed = true;
        NFT memory winningNFT = nfts[nftIndex];

        if (ERC165Checker.supportsInterface(winningNFT.contractAddr, 0xd9b67a26)){
            bytes memory data;
            IERC1155(winningNFT.contractAddr).safeTransferFrom(address(this), topBid.bidder, winningNFT.tokenId, winningNFT.amount, data);
        }
        else if (ERC165Checker.supportsInterface(winningNFT.contractAddr, 0x80ac58cd)){
            IERC721(winningNFT.contractAddr).safeTransferFrom(address(this), topBid.bidder, winningNFT.tokenId);
        }

        emit ClaimedNFT(topBid.bidder, nftIndex, winningNFT.tokenId);
    }

    // Approve collection unlock
    function approveUnlock(uint256 amount) external {
        require(unlockVotes < _threshold, "Converter: Threshold reached");
        _transfer(msg.sender, address(this), amount);

        unlockApproved[msg.sender] += amount;
        unlockVotes += amount;
    }

    // Unapprove collection unlock
    function unapproveUnlock(uint256 amount) external {
        require(unlockVotes < _threshold, "Converter: Threshold reached");
        require(unlockApproved[msg.sender] >= amount, "Converter: Not enough uTokens locked by user");
        unlockVotes -= amount;
        unlockApproved[msg.sender] -= amount;

        _transfer(address(this), msg.sender, amount);
    }

    // Claim ETH function
    function redeemETH(uint256 amount) external {
        require(unlockVotes >= _threshold, "Converter: Threshold not met");
        // Deposit uTokens
        if (amount > 0) {
            _transfer(msg.sender, address(this), amount);
        }
        // Combine approved balance + newly deposited balance
        uint256 finalBalance = amount + unlockApproved[msg.sender];
        // Remove locked uTokens tracked for user
        unlockApproved[msg.sender] = 0;

        // Redeem ETH corresponding to uToken amount
        (bool sent, bytes memory data) = msg.sender.call{value: totalBidAmount.mul(finalBalance).div(this.totalSupply())}("");
        require(sent, "Converter: Failed to send Ether");
    }

    function getBlockTimestamp() internal view returns (uint) {
        // solium-disable-next-line security/no-block-members
        return block.timestamp;
    }

    /**
     * ERC1155 Token ERC1155Receiver
     */
    function onERC1155Received(address _operator, address _from, uint256 _id, uint256 _value, bytes calldata _data) override external returns(bytes4) {
        if(keccak256(_data) == keccak256(VALIDATOR)){
            return 0xf23a6e61;
        }
    }

    function onERC1155BatchReceived(address _operator, address _from, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data) override external returns(bytes4) {
        if(keccak256(_data) == keccak256(VALIDATOR)){
            return 0xbc197c81;
        }
    }

}

// File: contracts/UnicFactory.sol

pragma solidity 0.6.12;




contract UnicFactory is IUnicFactory {
    using SafeMath for uint;
    
    // Address that receives fees
    address public override feeTo;
    
    // Address that gets to set the feeTo address
    address public override feeToSetter;
    
    // List of uToken addresses
    address[] public override uTokens;
    
    mapping(address => uint) public override getUToken;
    
    event TokenCreated(address indexed caller, address indexed uToken);
    
    function uTokensLength() external override view returns (uint) {
        return uTokens.length;
    }
    
    // Constructor just needs to know who gets to set feeTo address and default fee amount`
    constructor(address _feeToSetter) public {
        feeToSetter = _feeToSetter;
    }
    
    function createUToken(uint256 totalSupply, uint8 decimals, string calldata name, string calldata symbol, uint256 threshold, string calldata description) external override returns (address) {
        require(totalSupply > 0, 'Unic: MIN SUPPLY');
        require(decimals >= 4, 'Unic: MIN PRECISION');
        require(bytes(name).length < 32, 'Unic: MAX NAME');
        require(bytes(symbol).length < 16, 'Unic: MAX TICKER');
        require(threshold > 0 && threshold <= totalSupply, 'Unic: THRESHOLD GREATER THAN SUPPLY');
        require(bytes(description).length < 256, 'Unic: MAX DESCRIPTION');
                
        address issuer = msg.sender;
        Converter converter = new Converter(totalSupply, decimals, name, symbol, threshold, description, issuer, this);
        // Populate mapping
        getUToken[address(converter)] = uTokens.length;
        // Add to list
        uTokens.push(address(converter));
        emit TokenCreated(msg.sender, address(converter));
        
        return address(converter);
    }
    
    function setFeeTo(address _feeTo) external override {
        require(msg.sender == feeToSetter, 'Unic: FORBIDDEN');
        feeTo = _feeTo;
    }
    
    function setFeeToSetter(address _feeToSetter) external override {
        require(msg.sender == feeToSetter, 'Unic: FORBIDDEN');
        feeToSetter = _feeToSetter;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_feeToSetter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"uToken","type":"address"}],"name":"TokenCreated","type":"event"},{"inputs":[{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"threshold","type":"uint256"},{"internalType":"string","name":"description","type":"string"}],"name":"createUToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeToSetter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"getUToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTo","type":"address"}],"name":"setFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeToSetter","type":"address"}],"name":"setFeeToSetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uTokensLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b50604051615ddd380380615ddd8339818101604052602081101561003357600080fd5b810190808051906020019092919050505080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050615d48806100956000396000f3fe60806040523480156200001157600080fd5b5060043610620000945760003560e01c8063404b291c1162000063578063404b291c14620001bb578063a2e74af614620001db578063f46901ed1462000222578063fa6dfd4d14620002695762000094565b8063017e7e581462000099578063094b741514620000cf57806325b26df614620001055780633c402de91462000160575b600080fd5b620000a3620003e3565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b620000d962000407565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6200014a600480360360208110156200011d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200042d565b6040518082815260200191505060405180910390f35b6200018f600480360360208110156200017857600080fd5b810190808035906020019092919050505062000445565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b620001c562000482565b6040518082815260200191505060405180910390f35b6200022060048036036020811015620001f357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200048f565b005b62000267600480360360208110156200023a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062000597565b005b620003b7600480360360c08110156200028157600080fd5b8101908080359060200190929190803560ff16906020019092919080359060200190640100000000811115620002b657600080fd5b820183602082011115620002c957600080fd5b80359060200191846001830284011164010000000083111715620002ec57600080fd5b9091929391929390803590602001906401000000008111156200030e57600080fd5b8201836020820111156200032157600080fd5b803590602001918460018302840111640100000000831117156200034457600080fd5b909192939192939080359060200190929190803590602001906401000000008111156200037057600080fd5b8201836020820111156200038357600080fd5b80359060200191846001830284011164010000000083111715620003a657600080fd5b90919293919293905050506200069e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60036020528060005260406000206000915090505481565b600281815481106200045357fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600280549050905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f556e69633a20464f5242494444454e000000000000000000000000000000000081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200065b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f556e69633a20464f5242494444454e000000000000000000000000000000000081525060200191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000808a1162000716576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f556e69633a204d494e20535550504c590000000000000000000000000000000081525060200191505060405180910390fd5b60048960ff16101562000791576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f556e69633a204d494e20505245434953494f4e0000000000000000000000000081525060200191505060405180910390fd5b602088889050106200080b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f556e69633a204d4158204e414d4500000000000000000000000000000000000081525060200191505060405180910390fd5b6010868690501062000885576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f556e69633a204d4158205449434b45520000000000000000000000000000000081525060200191505060405180910390fd5b600084118015620008965750898411155b620008ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018062005cf06023913960400191505060405180910390fd5b610100838390501062000968576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f556e69633a204d4158204445534352495054494f4e000000000000000000000081525060200191505060405180910390fd5b600033905060008b8b8b8b8b8b8b8b8b8a30604051620009889062000bab565b808c81526020018b60ff1681526020018060200180602001888152602001806020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184810384528d8d82818152602001925080828437600081840152601f19601f82011690508083019250505084810383528b8b82818152602001925080828437600081840152601f19601f8201169050808301925050508481038252888882818152602001925080828437600081840152601f19601f8201169050808301925050509e505050505050505050505050505050604051809103906000f08015801562000a90573d6000803e3d6000fd5b509050600280549050600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506002819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd5f9bdf12adf29dab0248c349842c3822d53ae2bb4f36352f301630d018c813960405160405180910390a380925050509998505050505050505050565b6151368062000bba8339019056fe608060405260006008556000600960006101000a81548160ff0219169083151502179055506000600a556000600b553480156200003b57600080fd5b50604051620051363803806200513683398181016040526101008110156200006257600080fd5b810190808051906020019092919080519060200190929190805160405193929190846401000000008211156200009757600080fd5b83820191506020820185811115620000ae57600080fd5b8251866001820283011164010000000082111715620000cc57600080fd5b8083526020830192505050908051906020019080838360005b8381101562000102578082015181840152602081019050620000e5565b50505050905090810190601f168015620001305780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200015457600080fd5b838201915060208201858111156200016b57600080fd5b82518660018202830111640100000000821117156200018957600080fd5b8083526020830192505050908051906020019080838360005b83811015620001bf578082015181840152602081019050620001a2565b50505050905090810190601f168015620001ed5780820380516001836020036101000a031916815260200191505b5060405260200180519060200190929190805160405193929190846401000000008211156200021b57600080fd5b838201915060208201858111156200023257600080fd5b82518660018202830111640100000000821117156200025057600080fd5b8083526020830192505050908051906020019080838360005b838110156200028657808201518184015260208101905062000269565b50505050905090810190601f168015620002b45780820380516001836020036101000a031916815260200191505b50604052602001805190602001909291908051906020019092919050505085858160039080519060200190620002ec9291906200054d565b508060049080519060200190620003059291906200054d565b506012600560006101000a81548160ff021916908360ff16021790555050506200033c6301ffc9a760e01b6200042560201b60201c565b6200035d63bc197c8160e01b63f23a6e6160e01b186200042560201b60201c565b6200036e876200052f60201b60201c565b81600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600e9080519060200190620003c79291906200054d565b5083600c8190555080601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555087600f819055505050505050505050620005f3565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620004c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433136353a20696e76616c696420696e746572666163652069640000000081525060200191505060405180910390fd5b600160066000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b80600560006101000a81548160ff021916908360ff16021790555050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200059057805160ff1916838001178555620005c1565b82800160010185558215620005c1579182015b82811115620005c0578251825591602001919060010190620005a3565b5b509050620005d09190620005d4565b5090565b5b80821115620005ef576000816000905550600101620005d5565b5090565b614b3380620006036000396000f3fe60806040526004361061021a5760003560e01c806370a0823111610123578063bc197c81116100ab578063dd62ed3e1161006f578063dd62ed3e14610e7a578063e3a7c90314610eff578063ee7a116314610f2a578063f23a6e6114610f55578063fa89401a146110625761021a565b8063bc197c8114610bc4578063c45a015514610d67578063c79045cb14610da8578063cfa84dfe14610dd3578063d383f64614610e635761021a565b806395d89b41116100f257806395d89b41146109c25780639d13fb2414610a52578063a457c2d714610ab7578063a9059cbb14610b28578063af58e6f014610b995761021a565b806370a08231146107fc5780637e067a60146108615780637f3c81601461095c5780637fc6bb3d146109875761021a565b8063265aa621116101a6578063379607f511610175578063379607f51461067457806339509351146106af5780634423c5f114610720578063454a2ab314610793578063525d02b8146107c15761021a565b8063265aa621146105305780632788aeb2146105ac578063313ce5671461061b578063355274ea146106495761021a565b80630e4cfe97116101ed5780630e4cfe97146103bd57806318160ddd146103f85780631d1438481461042357806322a250821461046457806323b872dd1461049f5761021a565b806301ffc9a71461021f57806302fb0c5e1461028f57806306fdde03146102bc578063095ea7b31461034c575b600080fd5b34801561022b57600080fd5b506102776004803603602081101561024257600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690602001909291905050506110b3565b60405180821515815260200191505060405180910390f35b34801561029b57600080fd5b506102a461111b565b60405180821515815260200191505060405180910390f35b3480156102c857600080fd5b506102d161112e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103115780820151818401526020810190506102f6565b50505050905090810190601f16801561033e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561035857600080fd5b506103a56004803603604081101561036f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506111d0565b60405180821515815260200191505060405180910390f35b3480156103c957600080fd5b506103f6600480360360208110156103e057600080fd5b81019080803590602001909291905050506111ee565b005b34801561040457600080fd5b5061040d6117ac565b6040518082815260200191505060405180910390f35b34801561042f57600080fd5b506104386117b6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561047057600080fd5b5061049d6004803603602081101561048757600080fd5b81019080803590602001909291905050506117dc565b005b3480156104ab57600080fd5b50610518600480360360608110156104c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506118c0565b60405180821515815260200191505060405180910390f35b34801561053c57600080fd5b506105696004803603602081101561055357600080fd5b8101908080359060200190929190505050611999565b604051808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838152602001821515815260200194505050505060405180910390f35b3480156105b857600080fd5b50610605600480360360408110156105cf57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119f6565b6040518082815260200191505060405180910390f35b34801561062757600080fd5b50610630611a1b565b604051808260ff16815260200191505060405180910390f35b34801561065557600080fd5b5061065e611a32565b6040518082815260200191505060405180910390f35b34801561068057600080fd5b506106ad6004803603602081101561069757600080fd5b8101908080359060200190929190505050611a38565b005b3480156106bb57600080fd5b50610708600480360360408110156106d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611fe3565b60405180821515815260200191505060405180910390f35b34801561072c57600080fd5b506107596004803603602081101561074357600080fd5b8101908080359060200190929190505050612096565b604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390f35b6107bf600480360360208110156107a957600080fd5b81019080803590602001909291905050506120e0565b005b3480156107cd57600080fd5b506107fa600480360360208110156107e457600080fd5b8101908080359060200190929190505050612513565b005b34801561080857600080fd5b5061084b6004803603602081101561081f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127b8565b6040518082815260200191505060405180910390f35b34801561086d57600080fd5b5061095a6004803603606081101561088457600080fd5b81019080803590602001906401000000008111156108a157600080fd5b8201836020820111156108b357600080fd5b803590602001918460208302840111640100000000831117156108d557600080fd5b9091929391929390803590602001906401000000008111156108f657600080fd5b82018360208201111561090857600080fd5b8035906020019184602083028401116401000000008311171561092a57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612800565b005b34801561096857600080fd5b50610971612f15565b6040518082815260200191505060405180910390f35b34801561099357600080fd5b506109c0600480360360208110156109aa57600080fd5b8101908080359060200190929190505050612f1b565b005b3480156109ce57600080fd5b506109d7613097565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a175780820151818401526020810190506109fc565b50505050905090810190601f168015610a445780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610a5e57600080fd5b50610aa160048036036020811015610a7557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613139565b6040518082815260200191505060405180910390f35b348015610ac357600080fd5b50610b1060048036036040811015610ada57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613151565b60405180821515815260200191505060405180910390f35b348015610b3457600080fd5b50610b8160048036036040811015610b4b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061321e565b60405180821515815260200191505060405180910390f35b348015610ba557600080fd5b50610bae61323c565b6040518082815260200191505060405180910390f35b348015610bd057600080fd5b50610d32600480360360a0811015610be757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610c4457600080fd5b820183602082011115610c5657600080fd5b80359060200191846020830284011164010000000083111715610c7857600080fd5b909192939192939080359060200190640100000000811115610c9957600080fd5b820183602082011115610cab57600080fd5b80359060200191846020830284011164010000000083111715610ccd57600080fd5b909192939192939080359060200190640100000000811115610cee57600080fd5b820183602082011115610d0057600080fd5b80359060200191846001830284011164010000000083111715610d2257600080fd5b9091929391929390505050613242565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b348015610d7357600080fd5b50610d7c6132c2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610db457600080fd5b50610dbd6132e8565b6040518082815260200191505060405180910390f35b348015610ddf57600080fd5b50610de86132ef565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e28578082015181840152602081019050610e0d565b50505050905090810190601f168015610e555780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e6f57600080fd5b50610e7861338d565b005b348015610e8657600080fd5b50610ee960048036036040811015610e9d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613619565b6040518082815260200191505060405180910390f35b348015610f0b57600080fd5b50610f146136a0565b6040518082815260200191505060405180910390f35b348015610f3657600080fd5b50610f3f6136a6565b6040518082815260200191505060405180910390f35b348015610f6157600080fd5b5061102d600480360360a0811015610f7857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190640100000000811115610fe957600080fd5b820183602082011115610ffb57600080fd5b8035906020019184600183028401116401000000008311171561101d57600080fd5b90919293919293905050506136ac565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b34801561106e57600080fd5b506110b16004803603602081101561108557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061372a565b005b600060066000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b600960009054906101000a900460ff1681565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111c65780601f1061119b576101008083540402835291602001916111c6565b820191906000526020600020905b8154815290600101906020018083116111a957829003601f168201915b5050505050905090565b60006111e46111dd613bcf565b8484613bd7565b6001905092915050565b6111f6614769565b601260008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481525050905060003373ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16149050600c54600b541061131a578015611319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180614958603d913960400191505060405180910390fd5b5b80156115a357611328613dce565b6203f480836040015101106113a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f436f6e7665727465723a20546f7020626964206c6f636b65640000000000000081525060200191505060405180910390fd5b8160200151600a600082825403925050819055506040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016113f0613dce565b8152506012600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155905050600060603373ffffffffffffffffffffffffffffffffffffffff16846020015160405180600001905060006040518083038185875af1925050503d80600081146114ca576040519150601f19603f3d011682016040523d82523d6000602084013e6114cf565b606091505b509150915081611547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f436f6e7665727465723a204661696c656420746f2073656e642045746865720081525060200191505060405180910390fd5b7f7fd2c6472e4a5cf47dd45d6e616062bb6b2a25c19206eaa78f5ac8ea80cd5f973386604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a150506117a7565b60006013600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811161166e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f436f6e7665727465723a206e6f2062696420666f756e6400000000000000000081525060200191505060405180910390fd5b60006013600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060603373ffffffffffffffffffffffffffffffffffffffff168360405180600001905060006040518083038185875af1925050503d8060008114611726576040519150601f19603f3d011682016040523d82523d6000602084013e61172b565b606091505b5091509150816117a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f436f6e7665727465723a204661696c656420746f2073656e642045746865720081525060200191505060405180910390fd5b5050505b505050565b6000600254905090565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c54600b5410611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f436f6e7665727465723a205468726573686f6c6420726561636865640000000081525060200191505060405180910390fd5b611860333083613dd6565b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555080600b6000828254019250508190555050565b60006118cd848484613dd6565b61198e846118d9613bcf565b611989856040518060600160405280602881526020016149d760289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061193f613bcf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140979092919063ffffffff16565b613bd7565b600190509392505050565b60076020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16905084565b6013602052816000526040600020602052806000526040600020600091509150505481565b6000600560009054906101000a900460ff16905090565b600f5481565b600c54600b541015611ab2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f436f6e7665727465723a205468726573686f6c64206e6f74206d65740000000081525060200191505060405180910390fd5b6007600082815260200190815260200160002060030160009054906101000a900460ff1615611b49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f436f6e7665727465723a20416c726561647920636c61696d656400000000000081525060200191505060405180910390fd5b611b51614769565b601260008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815250509050806000015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c80576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f436f6e7665727465723a204f6e6c792077696e6e65722063616e20636c61696d81525060200191505060405180910390fd5b60016007600084815260200190815260200160002060030160006101000a81548160ff021916908315150217905550611cb76147a0565b600760008481526020019081526020016000206040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff1615151515815250509050611d71816000015163d9b67a2660e01b614157565b15611eaa576060816000015173ffffffffffffffffffffffffffffffffffffffff1663f242432a30856000015185602001518660400151866040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611e3c578082015181840152602081019050611e21565b50505050905090810190601f168015611e695780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b158015611e8c57600080fd5b505af1158015611ea0573d6000803e3d6000fd5b5050505050611f79565b611ebf81600001516380ac58cd60e01b614157565b15611f7857806000015173ffffffffffffffffffffffffffffffffffffffff166342842e0e30846000015184602001516040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015611f5f57600080fd5b505af1158015611f73573d6000803e3d6000fd5b505050505b5b7feeca06d3fb2f51c15539b63d32d639ef54c363f311045a0cbec5971f7fd355328260000151848360200151604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1505050565b600061208c611ff0613bcf565b846120878560016000612001613bcf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461417c90919063ffffffff16565b613bd7565b6001905092915050565b60126020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905083565b600c54600b541061213c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180614890603f913960400191505060405180910390fd5b612144614769565b601260008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415612257576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806148cf6021913960400191505060405180910390fd5b348160200151106122d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f436f6e7665727465723a2042696420746f6f206c6f770000000000000000000081525060200191505060405180910390fd5b60006013600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f436f6e7665727465723a20436f6c6c6563742062696420726566756e6400000081525060200191505060405180910390fd5b60405180606001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020013481526020016123cb613dce565b8152506012600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201559050508060200151601360008481526020019081526020016000206000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080602001513403600a600082825401925050819055507fbc13236afe4f10fc8d44c86b16e9e6695b2758938a2bedf6ceef72157259447b338334604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a15050565b600c54600b54101561258d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f436f6e7665727465723a205468726573686f6c64206e6f74206d65740000000081525060200191505060405180910390fd5b60008111156125a2576125a1333083613dd6565b5b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054820190506000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060603373ffffffffffffffffffffffffffffffffffffffff166126ef3073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561269157600080fd5b505afa1580156126a5573d6000803e3d6000fd5b505050506040513d60208110156126bb57600080fd5b81019080805190602001909291905050506126e186600a5461420490919063ffffffff16565b61428a90919063ffffffff16565b60405180600001905060006040518083038185875af1925050503d8060008114612735576040519150601f19603f3d011682016040523d82523d6000602084013e61273a565b606091505b5091509150816127b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f436f6e7665727465723a204661696c656420746f2073656e642045746865720081525060200191505060405180910390fd5b50505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146128a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806148486022913960400191505060405180910390fd5b6032858590501115612903576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c81526020018061491c603c913960400191505060405180910390fd5b6000858590501161295f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180614a246031913960400191505060405180910390fd5b6129708163d9b67a2660e01b614157565b15612c5e578073ffffffffffffffffffffffffffffffffffffffff16632eb2c2d63330888888886040518060400160405280600481526020017f4a434d59000000000000000000000000000000000000000000000000000000008152506040518863ffffffff1660e01b8152600401808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001806020018481038452898982818152602001925060200280828437600081840152601f19601f8201169050808301925050508481038352878782818152602001925060200280828437600081840152601f19601f820116905080830192505050848103825285818151815260200191508051906020019080838360005b83811015612ab8578082015181840152602081019050612a9d565b50505050905090810190601f168015612ae55780820380516001836020036101000a031916815260200191505b509a5050505050505050505050600060405180830381600087803b158015612b0c57600080fd5b505af1158015612b20573d6000803e3d6000fd5b5050505060005b60328160ff161015612c58578060ff16868690501415612b4657612c58565b60405180608001604052808373ffffffffffffffffffffffffffffffffffffffff16815260200187878460ff16818110612b7c57fe5b90506020020135815260200185858460ff16818110612b9757fe5b90506020020135815260200160001515815250600760006008600081548092919060010191905055815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055509050508080600101915050612b27565b50612e53565b612c6f816380ac58cd60e01b614157565b15612e525760005b60328160ff161015612e50578060ff16868690501415612c9657612e50565b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd333089898660ff16818110612cc357fe5b905060200201356040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015612d3a57600080fd5b505af1158015612d4e573d6000803e3d6000fd5b5050505060405180608001604052808373ffffffffffffffffffffffffffffffffffffffff16815260200187878460ff16818110612d8857fe5b9050602002013581526020016001815260200160001515815250600760006008600081548092919060010191905055815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055509050508080600101915050612c77565b505b5b7fa483e688f75a9865537d84843ea1c4d1c5f25f6f00565268e91430c4d75cc01b85858585856040518080602001806020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381038352888882818152602001925060200280828437600081840152601f19601f8201169050808301925050508381038252868682818152602001925060200280828437600081840152601f19601f82011690508083019250505097505050505050505060405180910390a15050505050565b600c5481565b600c54600b5410612f94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f436f6e7665727465723a205468726573686f6c6420726561636865640000000081525060200191505060405180910390fd5b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561302c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806148f0602c913960400191505060405180910390fd5b80600b6000828254039250508190555080601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550613094303383613dd6565b50565b606060048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561312f5780601f106131045761010080835404028352916020019161312f565b820191906000526020600020905b81548152906001019060200180831161311257829003601f168201915b5050505050905090565b60106020528060005260406000206000915090505481565b600061321461315e613bcf565b8461320f85604051806060016040528060258152602001614ad96025913960016000613188613bcf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140979092919063ffffffff16565b613bd7565b6001905092915050565b600061323261322b613bcf565b8484613dd6565b6001905092915050565b60085481565b60006040518060400160405280600481526020017f4a434d5900000000000000000000000000000000000000000000000000000000815250805190602001208383604051808383808284378083019250505092505050604051809103902014156132b55763bc197c8160e01b90506132b6565b5b98975050505050505050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6203f48081565b600e8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156133855780601f1061335a57610100808354040283529160200191613385565b820191906000526020600020905b81548152906001019060200180831161336857829003601f168201915b505050505081565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614aae602b913960400191505060405180910390fd5b60001515600960009054906101000a900460ff1615151461349f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806148046022913960400191505060405180910390fd5b6001600960006101000a81548160ff0219169083151502179055506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b15801561352457600080fd5b505afa158015613538573d6000803e3d6000fd5b505050506040513d602081101561354e57600080fd5b8101908080519060200190929190505050905060008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146135b9576135ac60c8600f5461428a90919063ffffffff16565b90506135b882826142d4565b5b6135e9600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600f54036142d4565b7fee1d8c0a784b4733dc46e6e61233f85c6b4e41244a61fe29f41a84d3f8a3d01c60405160405180910390a15050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600b5481565b600a5481565b60006040518060400160405280600481526020017f4a434d59000000000000000000000000000000000000000000000000000000008152508051906020012083836040518083838082843780830192505050925050506040518091039020141561371f5763f23a6e6160e01b9050613720565b5b9695505050505050565b600960009054906101000a900460ff1615613790576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526035815260200180614a556035913960400191505060405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613836576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149b66021913960400191505060405180910390fd5b600080600854905060605b600082118015613854575060328360ff16105b15613b96576138616147a0565b600760006001850381526020019081526020016000206040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff161515151581525050905061391e816000015163d9b67a2660e01b614157565b15613a5057806000015173ffffffffffffffffffffffffffffffffffffffff1663f242432a308784602001518560400151876040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156139e35780820151818401526020810190506139c8565b50505050905090810190601f168015613a105780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b158015613a3357600080fd5b505af1158015613a47573d6000803e3d6000fd5b50505050613b1b565b613a6581600001516380ac58cd60e01b614157565b15613b1a57806000015173ffffffffffffffffffffffffffffffffffffffff166342842e0e308784602001516040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015613b0157600080fd5b505af1158015613b15573d6000803e3d6000fd5b505050505b5b60076000600185038152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182016000905560028201600090556003820160006101000a81549060ff02191690555050828060019003935050838060010194505050613841565b816008819055507f8616bbbbad963e4e65b1366f1d75dfb63f9e9704bbbf91fb01bec70849906cf760405160405180910390a150505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614a8a6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ce3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806148266022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600042905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613e5c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149ff6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ee2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806147e16023913960400191505060405180910390fd5b613eed83838361449b565b613f588160405180606001604052806026815260200161486a602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140979092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613feb816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461417c90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290614144576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156141095780820151818401526020810190506140ee565b50505050905090810190601f1680156141365780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000614162836144a0565b8015614174575061417383836144d4565b5b905092915050565b6000808284019050838110156141fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000808314156142175760009050614284565b600082840290508284828161422857fe5b041461427f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149956021913960400191505060405180910390fd5b809150505b92915050565b60006142cc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506144fb565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6143836000838361449b565b6143988160025461417c90919063ffffffff16565b6002819055506143ef816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461417c90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b505050565b60006144b3826301ffc9a760e01b6144d4565b80156144cd57506144cb8263ffffffff60e01b6144d4565b155b9050919050565b60008060006144e385856145c1565b915091508180156144f15750805b9250505092915050565b600080831182906145a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561456c578082015181840152602081019050614551565b50505050905090810190601f1680156145995780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816145b357fe5b049050809150509392505050565b60008060606301ffc9a760e01b8460405160240180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001915050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff16617530846040518082805190602001908083835b602083106146af578051825260208201915060208101905060208303925061468c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114614710576040519150601f19603f3d011682016040523d82523d6000602084013e614715565b606091505b50915091506020815110156147335760008094509450505050614762565b8181806020019051602081101561474957600080fd5b8101908080519060200190929190505050945094505050505b9250929050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600015158152509056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373436f6e7665727465723a20546f6b656e20697320616c72656164792061637469766545524332303a20617070726f766520746f20746865207a65726f2061646472657373436f6e7665727465723a204f6e6c79206973737565722063616e206465706f73697445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365436f6e7665727465723a2052656c65617365207468726573686f6c6420686173206265656e206d65742c206e6f206d6f7265206269647320616c6c6f776564436f6e7665727465723a20596f75206861766520616e2061637469766520626964436f6e7665727465723a204e6f7420656e6f7567682075546f6b656e73206c6f636b65642062792075736572436f6e7665727465723a2041206d6178696d756d206f6620353020746f6b656e732063616e206265206465706f736974656420696e206f6e6520676f436f6e7665727465723a2052656c65617365207468726573686f6c6420686173206265656e206d65742c2077696e6e65722063616e277420756e626964536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436f6e7665727465723a204f6e6c79206973737565722063616e20726566756e6445524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373436f6e7665727465723a20596f75206d7573742073706563696679206174206c65617374206f6e6520746f6b656e204944436f6e7665727465723a20436f6e747261637420697320616c726561647920616374697665202d2063616e6e6f7420726566756e6445524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373436f6e7665727465723a204f6e6c79206973737565722063616e2069737375652074686520746f6b656e7345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220162a98375b9a0d32bad20ab3a262d9d279ef87b720c6b243dbb155c10a8de98564736f6c634300060c0033556e69633a205448524553484f4c442047524541544552205448414e20535550504c59a2646970667358221220c7bccc2e320441ffe0b51106f4d02a14297ba4436b423172171adeaad85080df64736f6c634300060c003300000000000000000000000092b22149fec19094650f3f99dc141c8f77b03c15

Deployed Bytecode

0x60806040523480156200001157600080fd5b5060043610620000945760003560e01c8063404b291c1162000063578063404b291c14620001bb578063a2e74af614620001db578063f46901ed1462000222578063fa6dfd4d14620002695762000094565b8063017e7e581462000099578063094b741514620000cf57806325b26df614620001055780633c402de91462000160575b600080fd5b620000a3620003e3565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b620000d962000407565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6200014a600480360360208110156200011d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200042d565b6040518082815260200191505060405180910390f35b6200018f600480360360208110156200017857600080fd5b810190808035906020019092919050505062000445565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b620001c562000482565b6040518082815260200191505060405180910390f35b6200022060048036036020811015620001f357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200048f565b005b62000267600480360360208110156200023a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062000597565b005b620003b7600480360360c08110156200028157600080fd5b8101908080359060200190929190803560ff16906020019092919080359060200190640100000000811115620002b657600080fd5b820183602082011115620002c957600080fd5b80359060200191846001830284011164010000000083111715620002ec57600080fd5b9091929391929390803590602001906401000000008111156200030e57600080fd5b8201836020820111156200032157600080fd5b803590602001918460018302840111640100000000831117156200034457600080fd5b909192939192939080359060200190929190803590602001906401000000008111156200037057600080fd5b8201836020820111156200038357600080fd5b80359060200191846001830284011164010000000083111715620003a657600080fd5b90919293919293905050506200069e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60036020528060005260406000206000915090505481565b600281815481106200045357fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600280549050905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f556e69633a20464f5242494444454e000000000000000000000000000000000081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200065b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f556e69633a20464f5242494444454e000000000000000000000000000000000081525060200191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000808a1162000716576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f556e69633a204d494e20535550504c590000000000000000000000000000000081525060200191505060405180910390fd5b60048960ff16101562000791576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f556e69633a204d494e20505245434953494f4e0000000000000000000000000081525060200191505060405180910390fd5b602088889050106200080b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f556e69633a204d4158204e414d4500000000000000000000000000000000000081525060200191505060405180910390fd5b6010868690501062000885576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f556e69633a204d4158205449434b45520000000000000000000000000000000081525060200191505060405180910390fd5b600084118015620008965750898411155b620008ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018062005cf06023913960400191505060405180910390fd5b610100838390501062000968576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f556e69633a204d4158204445534352495054494f4e000000000000000000000081525060200191505060405180910390fd5b600033905060008b8b8b8b8b8b8b8b8b8a30604051620009889062000bab565b808c81526020018b60ff1681526020018060200180602001888152602001806020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184810384528d8d82818152602001925080828437600081840152601f19601f82011690508083019250505084810383528b8b82818152602001925080828437600081840152601f19601f8201169050808301925050508481038252888882818152602001925080828437600081840152601f19601f8201169050808301925050509e505050505050505050505050505050604051809103906000f08015801562000a90573d6000803e3d6000fd5b509050600280549050600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506002819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd5f9bdf12adf29dab0248c349842c3822d53ae2bb4f36352f301630d018c813960405160405180910390a380925050509998505050505050505050565b6151368062000bba8339019056fe608060405260006008556000600960006101000a81548160ff0219169083151502179055506000600a556000600b553480156200003b57600080fd5b50604051620051363803806200513683398181016040526101008110156200006257600080fd5b810190808051906020019092919080519060200190929190805160405193929190846401000000008211156200009757600080fd5b83820191506020820185811115620000ae57600080fd5b8251866001820283011164010000000082111715620000cc57600080fd5b8083526020830192505050908051906020019080838360005b8381101562000102578082015181840152602081019050620000e5565b50505050905090810190601f168015620001305780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200015457600080fd5b838201915060208201858111156200016b57600080fd5b82518660018202830111640100000000821117156200018957600080fd5b8083526020830192505050908051906020019080838360005b83811015620001bf578082015181840152602081019050620001a2565b50505050905090810190601f168015620001ed5780820380516001836020036101000a031916815260200191505b5060405260200180519060200190929190805160405193929190846401000000008211156200021b57600080fd5b838201915060208201858111156200023257600080fd5b82518660018202830111640100000000821117156200025057600080fd5b8083526020830192505050908051906020019080838360005b838110156200028657808201518184015260208101905062000269565b50505050905090810190601f168015620002b45780820380516001836020036101000a031916815260200191505b50604052602001805190602001909291908051906020019092919050505085858160039080519060200190620002ec9291906200054d565b508060049080519060200190620003059291906200054d565b506012600560006101000a81548160ff021916908360ff16021790555050506200033c6301ffc9a760e01b6200042560201b60201c565b6200035d63bc197c8160e01b63f23a6e6160e01b186200042560201b60201c565b6200036e876200052f60201b60201c565b81600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600e9080519060200190620003c79291906200054d565b5083600c8190555080601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555087600f819055505050505050505050620005f3565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620004c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433136353a20696e76616c696420696e746572666163652069640000000081525060200191505060405180910390fd5b600160066000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b80600560006101000a81548160ff021916908360ff16021790555050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200059057805160ff1916838001178555620005c1565b82800160010185558215620005c1579182015b82811115620005c0578251825591602001919060010190620005a3565b5b509050620005d09190620005d4565b5090565b5b80821115620005ef576000816000905550600101620005d5565b5090565b614b3380620006036000396000f3fe60806040526004361061021a5760003560e01c806370a0823111610123578063bc197c81116100ab578063dd62ed3e1161006f578063dd62ed3e14610e7a578063e3a7c90314610eff578063ee7a116314610f2a578063f23a6e6114610f55578063fa89401a146110625761021a565b8063bc197c8114610bc4578063c45a015514610d67578063c79045cb14610da8578063cfa84dfe14610dd3578063d383f64614610e635761021a565b806395d89b41116100f257806395d89b41146109c25780639d13fb2414610a52578063a457c2d714610ab7578063a9059cbb14610b28578063af58e6f014610b995761021a565b806370a08231146107fc5780637e067a60146108615780637f3c81601461095c5780637fc6bb3d146109875761021a565b8063265aa621116101a6578063379607f511610175578063379607f51461067457806339509351146106af5780634423c5f114610720578063454a2ab314610793578063525d02b8146107c15761021a565b8063265aa621146105305780632788aeb2146105ac578063313ce5671461061b578063355274ea146106495761021a565b80630e4cfe97116101ed5780630e4cfe97146103bd57806318160ddd146103f85780631d1438481461042357806322a250821461046457806323b872dd1461049f5761021a565b806301ffc9a71461021f57806302fb0c5e1461028f57806306fdde03146102bc578063095ea7b31461034c575b600080fd5b34801561022b57600080fd5b506102776004803603602081101561024257600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690602001909291905050506110b3565b60405180821515815260200191505060405180910390f35b34801561029b57600080fd5b506102a461111b565b60405180821515815260200191505060405180910390f35b3480156102c857600080fd5b506102d161112e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103115780820151818401526020810190506102f6565b50505050905090810190601f16801561033e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561035857600080fd5b506103a56004803603604081101561036f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506111d0565b60405180821515815260200191505060405180910390f35b3480156103c957600080fd5b506103f6600480360360208110156103e057600080fd5b81019080803590602001909291905050506111ee565b005b34801561040457600080fd5b5061040d6117ac565b6040518082815260200191505060405180910390f35b34801561042f57600080fd5b506104386117b6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561047057600080fd5b5061049d6004803603602081101561048757600080fd5b81019080803590602001909291905050506117dc565b005b3480156104ab57600080fd5b50610518600480360360608110156104c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506118c0565b60405180821515815260200191505060405180910390f35b34801561053c57600080fd5b506105696004803603602081101561055357600080fd5b8101908080359060200190929190505050611999565b604051808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838152602001821515815260200194505050505060405180910390f35b3480156105b857600080fd5b50610605600480360360408110156105cf57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119f6565b6040518082815260200191505060405180910390f35b34801561062757600080fd5b50610630611a1b565b604051808260ff16815260200191505060405180910390f35b34801561065557600080fd5b5061065e611a32565b6040518082815260200191505060405180910390f35b34801561068057600080fd5b506106ad6004803603602081101561069757600080fd5b8101908080359060200190929190505050611a38565b005b3480156106bb57600080fd5b50610708600480360360408110156106d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611fe3565b60405180821515815260200191505060405180910390f35b34801561072c57600080fd5b506107596004803603602081101561074357600080fd5b8101908080359060200190929190505050612096565b604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390f35b6107bf600480360360208110156107a957600080fd5b81019080803590602001909291905050506120e0565b005b3480156107cd57600080fd5b506107fa600480360360208110156107e457600080fd5b8101908080359060200190929190505050612513565b005b34801561080857600080fd5b5061084b6004803603602081101561081f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127b8565b6040518082815260200191505060405180910390f35b34801561086d57600080fd5b5061095a6004803603606081101561088457600080fd5b81019080803590602001906401000000008111156108a157600080fd5b8201836020820111156108b357600080fd5b803590602001918460208302840111640100000000831117156108d557600080fd5b9091929391929390803590602001906401000000008111156108f657600080fd5b82018360208201111561090857600080fd5b8035906020019184602083028401116401000000008311171561092a57600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612800565b005b34801561096857600080fd5b50610971612f15565b6040518082815260200191505060405180910390f35b34801561099357600080fd5b506109c0600480360360208110156109aa57600080fd5b8101908080359060200190929190505050612f1b565b005b3480156109ce57600080fd5b506109d7613097565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a175780820151818401526020810190506109fc565b50505050905090810190601f168015610a445780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610a5e57600080fd5b50610aa160048036036020811015610a7557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613139565b6040518082815260200191505060405180910390f35b348015610ac357600080fd5b50610b1060048036036040811015610ada57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613151565b60405180821515815260200191505060405180910390f35b348015610b3457600080fd5b50610b8160048036036040811015610b4b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061321e565b60405180821515815260200191505060405180910390f35b348015610ba557600080fd5b50610bae61323c565b6040518082815260200191505060405180910390f35b348015610bd057600080fd5b50610d32600480360360a0811015610be757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610c4457600080fd5b820183602082011115610c5657600080fd5b80359060200191846020830284011164010000000083111715610c7857600080fd5b909192939192939080359060200190640100000000811115610c9957600080fd5b820183602082011115610cab57600080fd5b80359060200191846020830284011164010000000083111715610ccd57600080fd5b909192939192939080359060200190640100000000811115610cee57600080fd5b820183602082011115610d0057600080fd5b80359060200191846001830284011164010000000083111715610d2257600080fd5b9091929391929390505050613242565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b348015610d7357600080fd5b50610d7c6132c2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610db457600080fd5b50610dbd6132e8565b6040518082815260200191505060405180910390f35b348015610ddf57600080fd5b50610de86132ef565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e28578082015181840152602081019050610e0d565b50505050905090810190601f168015610e555780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e6f57600080fd5b50610e7861338d565b005b348015610e8657600080fd5b50610ee960048036036040811015610e9d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613619565b6040518082815260200191505060405180910390f35b348015610f0b57600080fd5b50610f146136a0565b6040518082815260200191505060405180910390f35b348015610f3657600080fd5b50610f3f6136a6565b6040518082815260200191505060405180910390f35b348015610f6157600080fd5b5061102d600480360360a0811015610f7857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190640100000000811115610fe957600080fd5b820183602082011115610ffb57600080fd5b8035906020019184600183028401116401000000008311171561101d57600080fd5b90919293919293905050506136ac565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b34801561106e57600080fd5b506110b16004803603602081101561108557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061372a565b005b600060066000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b600960009054906101000a900460ff1681565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111c65780601f1061119b576101008083540402835291602001916111c6565b820191906000526020600020905b8154815290600101906020018083116111a957829003601f168201915b5050505050905090565b60006111e46111dd613bcf565b8484613bd7565b6001905092915050565b6111f6614769565b601260008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481525050905060003373ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16149050600c54600b541061131a578015611319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180614958603d913960400191505060405180910390fd5b5b80156115a357611328613dce565b6203f480836040015101106113a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f436f6e7665727465723a20546f7020626964206c6f636b65640000000000000081525060200191505060405180910390fd5b8160200151600a600082825403925050819055506040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016113f0613dce565b8152506012600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155905050600060603373ffffffffffffffffffffffffffffffffffffffff16846020015160405180600001905060006040518083038185875af1925050503d80600081146114ca576040519150601f19603f3d011682016040523d82523d6000602084013e6114cf565b606091505b509150915081611547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f436f6e7665727465723a204661696c656420746f2073656e642045746865720081525060200191505060405180910390fd5b7f7fd2c6472e4a5cf47dd45d6e616062bb6b2a25c19206eaa78f5ac8ea80cd5f973386604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a150506117a7565b60006013600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811161166e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f436f6e7665727465723a206e6f2062696420666f756e6400000000000000000081525060200191505060405180910390fd5b60006013600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060603373ffffffffffffffffffffffffffffffffffffffff168360405180600001905060006040518083038185875af1925050503d8060008114611726576040519150601f19603f3d011682016040523d82523d6000602084013e61172b565b606091505b5091509150816117a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f436f6e7665727465723a204661696c656420746f2073656e642045746865720081525060200191505060405180910390fd5b5050505b505050565b6000600254905090565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c54600b5410611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f436f6e7665727465723a205468726573686f6c6420726561636865640000000081525060200191505060405180910390fd5b611860333083613dd6565b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555080600b6000828254019250508190555050565b60006118cd848484613dd6565b61198e846118d9613bcf565b611989856040518060600160405280602881526020016149d760289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061193f613bcf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140979092919063ffffffff16565b613bd7565b600190509392505050565b60076020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16905084565b6013602052816000526040600020602052806000526040600020600091509150505481565b6000600560009054906101000a900460ff16905090565b600f5481565b600c54600b541015611ab2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f436f6e7665727465723a205468726573686f6c64206e6f74206d65740000000081525060200191505060405180910390fd5b6007600082815260200190815260200160002060030160009054906101000a900460ff1615611b49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f436f6e7665727465723a20416c726561647920636c61696d656400000000000081525060200191505060405180910390fd5b611b51614769565b601260008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815250509050806000015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c80576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f436f6e7665727465723a204f6e6c792077696e6e65722063616e20636c61696d81525060200191505060405180910390fd5b60016007600084815260200190815260200160002060030160006101000a81548160ff021916908315150217905550611cb76147a0565b600760008481526020019081526020016000206040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff1615151515815250509050611d71816000015163d9b67a2660e01b614157565b15611eaa576060816000015173ffffffffffffffffffffffffffffffffffffffff1663f242432a30856000015185602001518660400151866040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611e3c578082015181840152602081019050611e21565b50505050905090810190601f168015611e695780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b158015611e8c57600080fd5b505af1158015611ea0573d6000803e3d6000fd5b5050505050611f79565b611ebf81600001516380ac58cd60e01b614157565b15611f7857806000015173ffffffffffffffffffffffffffffffffffffffff166342842e0e30846000015184602001516040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015611f5f57600080fd5b505af1158015611f73573d6000803e3d6000fd5b505050505b5b7feeca06d3fb2f51c15539b63d32d639ef54c363f311045a0cbec5971f7fd355328260000151848360200151604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1505050565b600061208c611ff0613bcf565b846120878560016000612001613bcf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461417c90919063ffffffff16565b613bd7565b6001905092915050565b60126020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905083565b600c54600b541061213c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180614890603f913960400191505060405180910390fd5b612144614769565b601260008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415612257576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806148cf6021913960400191505060405180910390fd5b348160200151106122d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f436f6e7665727465723a2042696420746f6f206c6f770000000000000000000081525060200191505060405180910390fd5b60006013600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f436f6e7665727465723a20436f6c6c6563742062696420726566756e6400000081525060200191505060405180910390fd5b60405180606001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020013481526020016123cb613dce565b8152506012600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201559050508060200151601360008481526020019081526020016000206000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080602001513403600a600082825401925050819055507fbc13236afe4f10fc8d44c86b16e9e6695b2758938a2bedf6ceef72157259447b338334604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a15050565b600c54600b54101561258d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f436f6e7665727465723a205468726573686f6c64206e6f74206d65740000000081525060200191505060405180910390fd5b60008111156125a2576125a1333083613dd6565b5b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054820190506000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600060603373ffffffffffffffffffffffffffffffffffffffff166126ef3073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561269157600080fd5b505afa1580156126a5573d6000803e3d6000fd5b505050506040513d60208110156126bb57600080fd5b81019080805190602001909291905050506126e186600a5461420490919063ffffffff16565b61428a90919063ffffffff16565b60405180600001905060006040518083038185875af1925050503d8060008114612735576040519150601f19603f3d011682016040523d82523d6000602084013e61273a565b606091505b5091509150816127b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f436f6e7665727465723a204661696c656420746f2073656e642045746865720081525060200191505060405180910390fd5b50505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146128a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806148486022913960400191505060405180910390fd5b6032858590501115612903576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c81526020018061491c603c913960400191505060405180910390fd5b6000858590501161295f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180614a246031913960400191505060405180910390fd5b6129708163d9b67a2660e01b614157565b15612c5e578073ffffffffffffffffffffffffffffffffffffffff16632eb2c2d63330888888886040518060400160405280600481526020017f4a434d59000000000000000000000000000000000000000000000000000000008152506040518863ffffffff1660e01b8152600401808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001806020018481038452898982818152602001925060200280828437600081840152601f19601f8201169050808301925050508481038352878782818152602001925060200280828437600081840152601f19601f820116905080830192505050848103825285818151815260200191508051906020019080838360005b83811015612ab8578082015181840152602081019050612a9d565b50505050905090810190601f168015612ae55780820380516001836020036101000a031916815260200191505b509a5050505050505050505050600060405180830381600087803b158015612b0c57600080fd5b505af1158015612b20573d6000803e3d6000fd5b5050505060005b60328160ff161015612c58578060ff16868690501415612b4657612c58565b60405180608001604052808373ffffffffffffffffffffffffffffffffffffffff16815260200187878460ff16818110612b7c57fe5b90506020020135815260200185858460ff16818110612b9757fe5b90506020020135815260200160001515815250600760006008600081548092919060010191905055815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055509050508080600101915050612b27565b50612e53565b612c6f816380ac58cd60e01b614157565b15612e525760005b60328160ff161015612e50578060ff16868690501415612c9657612e50565b8173ffffffffffffffffffffffffffffffffffffffff166323b872dd333089898660ff16818110612cc357fe5b905060200201356040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015612d3a57600080fd5b505af1158015612d4e573d6000803e3d6000fd5b5050505060405180608001604052808373ffffffffffffffffffffffffffffffffffffffff16815260200187878460ff16818110612d8857fe5b9050602002013581526020016001815260200160001515815250600760006008600081548092919060010191905055815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055509050508080600101915050612c77565b505b5b7fa483e688f75a9865537d84843ea1c4d1c5f25f6f00565268e91430c4d75cc01b85858585856040518080602001806020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381038352888882818152602001925060200280828437600081840152601f19601f8201169050808301925050508381038252868682818152602001925060200280828437600081840152601f19601f82011690508083019250505097505050505050505060405180910390a15050505050565b600c5481565b600c54600b5410612f94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f436f6e7665727465723a205468726573686f6c6420726561636865640000000081525060200191505060405180910390fd5b80601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561302c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806148f0602c913960400191505060405180910390fd5b80600b6000828254039250508190555080601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550613094303383613dd6565b50565b606060048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561312f5780601f106131045761010080835404028352916020019161312f565b820191906000526020600020905b81548152906001019060200180831161311257829003601f168201915b5050505050905090565b60106020528060005260406000206000915090505481565b600061321461315e613bcf565b8461320f85604051806060016040528060258152602001614ad96025913960016000613188613bcf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140979092919063ffffffff16565b613bd7565b6001905092915050565b600061323261322b613bcf565b8484613dd6565b6001905092915050565b60085481565b60006040518060400160405280600481526020017f4a434d5900000000000000000000000000000000000000000000000000000000815250805190602001208383604051808383808284378083019250505092505050604051809103902014156132b55763bc197c8160e01b90506132b6565b5b98975050505050505050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6203f48081565b600e8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156133855780601f1061335a57610100808354040283529160200191613385565b820191906000526020600020905b81548152906001019060200180831161336857829003601f168201915b505050505081565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614aae602b913960400191505060405180910390fd5b60001515600960009054906101000a900460ff1615151461349f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806148046022913960400191505060405180910390fd5b6001600960006101000a81548160ff0219169083151502179055506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b15801561352457600080fd5b505afa158015613538573d6000803e3d6000fd5b505050506040513d602081101561354e57600080fd5b8101908080519060200190929190505050905060008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146135b9576135ac60c8600f5461428a90919063ffffffff16565b90506135b882826142d4565b5b6135e9600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600f54036142d4565b7fee1d8c0a784b4733dc46e6e61233f85c6b4e41244a61fe29f41a84d3f8a3d01c60405160405180910390a15050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600b5481565b600a5481565b60006040518060400160405280600481526020017f4a434d59000000000000000000000000000000000000000000000000000000008152508051906020012083836040518083838082843780830192505050925050506040518091039020141561371f5763f23a6e6160e01b9050613720565b5b9695505050505050565b600960009054906101000a900460ff1615613790576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526035815260200180614a556035913960400191505060405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613836576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149b66021913960400191505060405180910390fd5b600080600854905060605b600082118015613854575060328360ff16105b15613b96576138616147a0565b600760006001850381526020019081526020016000206040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff161515151581525050905061391e816000015163d9b67a2660e01b614157565b15613a5057806000015173ffffffffffffffffffffffffffffffffffffffff1663f242432a308784602001518560400151876040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156139e35780820151818401526020810190506139c8565b50505050905090810190601f168015613a105780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b158015613a3357600080fd5b505af1158015613a47573d6000803e3d6000fd5b50505050613b1b565b613a6581600001516380ac58cd60e01b614157565b15613b1a57806000015173ffffffffffffffffffffffffffffffffffffffff166342842e0e308784602001516040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015613b0157600080fd5b505af1158015613b15573d6000803e3d6000fd5b505050505b5b60076000600185038152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182016000905560028201600090556003820160006101000a81549060ff02191690555050828060019003935050838060010194505050613841565b816008819055507f8616bbbbad963e4e65b1366f1d75dfb63f9e9704bbbf91fb01bec70849906cf760405160405180910390a150505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614a8a6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ce3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806148266022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600042905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613e5c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806149ff6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ee2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806147e16023913960400191505060405180910390fd5b613eed83838361449b565b613f588160405180606001604052806026815260200161486a602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140979092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613feb816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461417c90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290614144576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156141095780820151818401526020810190506140ee565b50505050905090810190601f1680156141365780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000614162836144a0565b8015614174575061417383836144d4565b5b905092915050565b6000808284019050838110156141fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000808314156142175760009050614284565b600082840290508284828161422857fe5b041461427f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149956021913960400191505060405180910390fd5b809150505b92915050565b60006142cc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506144fb565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6143836000838361449b565b6143988160025461417c90919063ffffffff16565b6002819055506143ef816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461417c90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b505050565b60006144b3826301ffc9a760e01b6144d4565b80156144cd57506144cb8263ffffffff60e01b6144d4565b155b9050919050565b60008060006144e385856145c1565b915091508180156144f15750805b9250505092915050565b600080831182906145a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561456c578082015181840152602081019050614551565b50505050905090810190601f1680156145995780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816145b357fe5b049050809150509392505050565b60008060606301ffc9a760e01b8460405160240180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001915050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060608673ffffffffffffffffffffffffffffffffffffffff16617530846040518082805190602001908083835b602083106146af578051825260208201915060208101905060208303925061468c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114614710576040519150601f19603f3d011682016040523d82523d6000602084013e614715565b606091505b50915091506020815110156147335760008094509450505050614762565b8181806020019051602081101561474957600080fd5b8101908080519060200190929190505050945094505050505b9250929050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600015158152509056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373436f6e7665727465723a20546f6b656e20697320616c72656164792061637469766545524332303a20617070726f766520746f20746865207a65726f2061646472657373436f6e7665727465723a204f6e6c79206973737565722063616e206465706f73697445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365436f6e7665727465723a2052656c65617365207468726573686f6c6420686173206265656e206d65742c206e6f206d6f7265206269647320616c6c6f776564436f6e7665727465723a20596f75206861766520616e2061637469766520626964436f6e7665727465723a204e6f7420656e6f7567682075546f6b656e73206c6f636b65642062792075736572436f6e7665727465723a2041206d6178696d756d206f6620353020746f6b656e732063616e206265206465706f736974656420696e206f6e6520676f436f6e7665727465723a2052656c65617365207468726573686f6c6420686173206265656e206d65742c2077696e6e65722063616e277420756e626964536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436f6e7665727465723a204f6e6c79206973737565722063616e20726566756e6445524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373436f6e7665727465723a20596f75206d7573742073706563696679206174206c65617374206f6e6520746f6b656e204944436f6e7665727465723a20436f6e747261637420697320616c726561647920616374697665202d2063616e6e6f7420726566756e6445524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373436f6e7665727465723a204f6e6c79206973737565722063616e2069737375652074686520746f6b656e7345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220162a98375b9a0d32bad20ab3a262d9d279ef87b720c6b243dbb155c10a8de98564736f6c634300060c0033556e69633a205448524553484f4c442047524541544552205448414e20535550504c59a2646970667358221220c7bccc2e320441ffe0b51106f4d02a14297ba4436b423172171adeaad85080df64736f6c634300060c0033

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

00000000000000000000000092b22149fec19094650f3f99dc141c8f77b03c15

-----Decoded View---------------
Arg [0] : _feeToSetter (address): 0x92b22149fec19094650f3f99dC141c8f77b03c15

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000092b22149fec19094650f3f99dc141c8f77b03c15


Deployed Bytecode Sourcemap

50286:2178:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50401:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50494:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50621:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50575:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50763:103;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52288:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;52127:149;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;51069:1046;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50401:29;;;;;;;;;;;;:::o;50494:35::-;;;;;;;;;;;;;:::o;50621:50::-;;;;;;;;;;;;;;;;;:::o;50575:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50763:103::-;50820:4;50844:7;:14;;;;50837:21;;50763:103;:::o;52288:173::-;52385:11;;;;;;;;;;;52371:25;;:10;:25;;;52363:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52441:12;52427:11;;:26;;;;;;;;;;;;;;;;;;52288:173;:::o;52127:149::-;52212:11;;;;;;;;;;;52198:25;;:10;:25;;;52190:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52262:6;52254:5;;:14;;;;;;;;;;;;;;;;;;52127:149;:::o;51069:1046::-;51249:7;51291:1;51277:11;:15;51269:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51344:1;51332:8;:13;;;;51324:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51409:2;51394:4;;51388:18;;:23;51380:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51472:2;51455:6;;51449:20;;:25;51441:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51526:1;51514:9;:13;:41;;;;;51544:11;51531:9;:24;;51514:41;51506:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51642:3;51620:11;;51614:25;;:31;51606:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51700:14;51717:10;51700:27;;51738:19;51774:11;51787:8;51797:4;;51803:6;;51811:9;51822:11;;51835:6;51843:4;51760:88;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51738:110;;51920:7;:14;;;;51888:9;:29;51906:9;51888:29;;;;;;;;;;;;;;;:46;;;;51969:7;51990:9;51969:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52050:9;52017:44;;52030:10;52017:44;;;;;;;;;;;;52097:9;52082:25;;;;51069:1046;;;;;;;;;;;:::o;-1:-1:-1:-;;;;;;;;:::o

Swarm Source

ipfs://c7bccc2e320441ffe0b51106f4d02a14297ba4436b423172171adeaad85080df

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

Jenny is the first Metaverse DAO to be built on Unicly. It is building one of the most amazing 1-of-1, collectively owned NFT collections in the world.

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.