ETH Price: $2,685.13 (-3.11%)

Token

Newspaper.finance (N3WS)
 

Overview

Max Total Supply

242,829.5311 N3WS

Holders

43

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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

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

Contract Source Code Verified (Exact Match)

Contract Name:
N3WS

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-12-04
*/

pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;


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

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

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

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

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

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

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

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

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

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

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

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

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

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

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

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

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

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

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

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

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

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

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

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

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

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

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

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

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

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

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

// 
/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance");

        _approve(account, _msgSender(), decreasedAllowance);
        _burn(account, amount);
    }
}

interface IRewardDistributionRecipient {
    function notifyRewardAmount(uint256 reward) external;
}

interface IUniswapV2Router02 {
    function WETH() external pure returns (address);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
    function addLiquidityETH(address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

abstract contract ERC20TransferLiquidityLock is ERC20 {
    using SafeMath for uint256;

    event LockLiquidity(uint256 tokenAmount, uint256 ethAmount);
    event RewardLiquidityProviders(uint256 tokenAmount);

    address internal constant uniswapV2Router = address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address internal constant uniswapFactory = address(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f);
    address public uniswapV2Pair;

    address public liquidityLoop;

    // the amount of tokens to lock for liquidity during every transfer, i.e. 100 = 1%, 50 = 2%, 40 = 2.5%
    uint256 public liquidityLockDivisor;

    // receive eth from uniswap swap
    receive() payable external {}

    function rewardLiquidityProviders() external {
        // lock everything that is lockable
        _lockLiquidity(balanceOf(address(this)));
    }

    function _lockLiquidity(uint256 _lockableSupply) internal {
        // lockable supply is the token balance of this contract
        require(_lockableSupply <= balanceOf(address(this)), "ERC20TransferLiquidityLock::lockLiquidity: lock amount higher than lockable balance");
        require(_lockableSupply != 0, "ERC20TransferLiquidityLock::lockLiquidity: lock amount cannot be 0");

        uint256 amountToSwapForEth = _lockableSupply.div(2);
        uint256 amountToAddLiquidity = _lockableSupply.sub(amountToSwapForEth);

        // needed in case contract already owns eth
        uint256 ethBalanceBeforeSwap = address(this).balance;
        _swapTokensForEth(amountToSwapForEth);
        uint256 ethReceived = address(this).balance.sub(ethBalanceBeforeSwap);

        _addLiquidity(amountToAddLiquidity, ethReceived);
        emit LockLiquidity(amountToAddLiquidity, ethReceived);

        uint256 liquidityLoopRewardsAmount = ERC20(uniswapV2Pair).balanceOf(address(this));
        ERC20(uniswapV2Pair).transfer(address(liquidityLoop), liquidityLoopRewardsAmount);
        IRewardDistributionRecipient(liquidityLoop).notifyRewardAmount(liquidityLoopRewardsAmount);
    }    

    function _swapTokensForEth(uint256 tokenAmount) internal {
        address[] memory uniswapPairPath = new address[](2);
        uniswapPairPath[0] = address(this);
        uniswapPairPath[1] = IUniswapV2Router02(uniswapV2Router).WETH();

        _approve(address(this), uniswapV2Router, tokenAmount);

        IUniswapV2Router02(uniswapV2Router)
            .swapExactTokensForETHSupportingFeeOnTransferTokens(
                tokenAmount,
                0,
                uniswapPairPath,
                address(this),
                block.timestamp
            );
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) internal {
        _approve(address(this), uniswapV2Router, tokenAmount);

        IUniswapV2Router02(uniswapV2Router)
            .addLiquidityETH{ value: ethAmount }
            (
                address(this),
                tokenAmount,
                0,
                0,
                address(this),
                block.timestamp
            );
    }

    function lockableSupply() external view returns (uint256) {
        return balanceOf(address(this));
    }
}

// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWWNNWMWXKNMMMMNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWXXNXKNWkdKN0xKWkl0MMMWkdXMMMMMWKKNNNNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNOKWWxoKXXWMOl0MWdlXOl0MMWXOlxWMMMNxoKWWK0WNKKNNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMX0KWMXllXMKld0KWMKlkMWkdXOlOWXXXNkl0MMMOcOMMMWW0oxXWKkKMWNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXdlxXN0odKKolkkOOOloKKOKNOdO0kOXNKdxXNXkldOOkOOloXWMKlkM0oOXXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWMMMMMMMN0xdxkdcllcccccccccodkO0KKKKKK0K0OxdolccclllllcloxkooX0ldXkoKMNXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXxxNMMMMMMMX0xccccccccccccccccccldO0KKKK0Odl:clodddddddddddoccdxlx0xx0WNxdKXNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWNMMWKodXMMNXWNOocccc:;;;;;;;;;::cccccldO0KOdc:coddolllcccllllodddl:lKkoKMKooKKokMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXxxOXWNdo0XOk0dlc:;,'''.''.....'',;:ccccoxxo::lddlcccccccccccccclodocldxKklxXXOkOkOKXNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMWXNMMWKkxdxxOxx00Odc:;''............,''.',;:cc::::ldoccccc::;;::::::c:clddclk0kkNWMNklxXWN00WMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMWWXXNWMNKNWKxk0KK0xc;'.',c,..,.     .cOko:,',;c::;:odloxOOo;cc,',,,,;loccldo:o0KKKXN0o0MMW0lkWWNWMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMW0xxkkxdkXK0KKKKKKK0o,'';d0K: 'o,.cxc. ;XMWXx:'';;;,:dxOKNN0c;od:cxxl,,dK0dldo;lOKKK0K0OKX0xokX0dxKNMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMWWWNK000OkxO00KKKKKKKOl'.,dXWWo. ,'.lOo. lXXOo:'..'''':dooxOK0o,:l:lkOl,;kXXKxdo,ckK00KKK00OO0KOdokKkkNMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMWNKOkxOXNXKXXKKK0KKKK0Oxl;,',:lxd;.    .. .cc;''..'',,,';odcccldo:;;,,;;,;okkdloxdclkOOO0KKKKKK0dd0OxOx0WMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMK0WWN0ddXX00K0KKKKK0Odlccc:;,'..''.............''',,,,,,,cdoccccccc::::::cccccldkkxxkxxk0KKKKKK00KOoOWMWWNXXWMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMM0dkNMMWOOKKKKKKKK0Odlcccccccc:;,''.........'''',,,,,,,,,,,codlcccccccccccccclodocccccc:cdO0KKKKKKKkx0XNXKdoKWMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMKxOXKxdkO000KKKKKKK0xlccccccccccccc:;;,,,,,,,;;;;,,,,,,,,,,,,,;lodollccccccclodddl:::::::;::lx0KKKKKK000NW0odXWNKXMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMWXKOxxxk0K00KKKKKKKKOdlcccccccccccccccccccccccc:;;,,,,,,,,,,,,,,,,;clodddddddddooc::::;::;:::::cd0KKKKKKKKKkokNMWXkxKMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMWKOKWMWKkdk0KKKKKKKKOdcccccccccccccccccccccccc:;;,,,,,,,,,,,,,,,,,,,,,,;:clllcc::;:::;:::;::;::;::d0KKKKKKKKO0XXOxxxkOXMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMWXkxxkKNWWX0KKKKKKKK0xlcccccccccccccccccccccc:;;,,,,,,,,,,,,,,,,,,,,,,,,,,,;;:::::::::::::;::;::::;cx0KKKKKKKK0xdx0NWWKKNMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMN0KNKkxdxOKKKKKKKKKKkoccccccccccccccc:::::cc:;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;;::::::::::::::::::::::lkKKKKKKKKK0KWMWXOkdkNMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMWWNWWWNKO0KKKKKKKKK0xlcccccccccc::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::::::::::::::::::x00KK0KK0KKKOxxxkOKNWMMMMMMMMMMMMMM
// MMMMMMMMMMMMMNOxkxxkxk0KKKKKKKKKK0dcccccccccc::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;:d0KKKKKKKKKKO0X0xxxO0XWMMMMMMMMMMMM
// MMMMMMMMMMMMMWNXKKXWX0KKKKKKKKKKK0dcccccccccc::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::d0KKKKK0KKKKKKOxOXWWNKXMMMMMMMMMMMM
// MMMMMMMMMMMNXNWMWNX00KKKKKKKKKKKK0xlccccccccc:::::::;;,,,,;;;;;;;;::::::::::::::::::;;;;;;;;,,,,;:::::::::::::::::cx0KKKKKKKKKKK00KNWNKkxKMMMMMMMMMMMM
// MMMMMMMMMMMNXNXKkkOO0KKKKKKKKKKKKKOoccccccccc::::::::;;;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;;;;:::::::::::::::::lOKKKKKKKKKKKKK00OkxxkXWWMMMMMMMMMMM
// MMMMMMMMMMW0kxxxxO0KKKKKKKKKKKKKKK0xlcccccccccc:::::::::::::;;;;;;;,,,,,,,,,,,,,,,,,;;;;;;;::::::::::::::::::::::cx0KKKKKKKKKKKKKKKXXNNNKxOWMMMMMMMMMM
// MMMMMMMMMMXkxOKNNXKKKKKKKKKKKKKKKKK0xlccccccccccc:::::::::::::::::::::::::::::::::::::::::::::::::::::::::;:::::cd0KKKKKKKKKKKKKKK00NNKxoxXMMMMMMMMMMM
// MMMMMMMMMMWNNWWWN0O0KKKKKKKKKKKKKKKK0xlccccccccccccc:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::cx0KKKKKKKKKKKKKKKKKXKxldKNKXMMMMMMMMMM
// MMMMMMMMMWKkxkOkxkOKKKKKKKKKKKKKKKKKK0koccccccccccccccccc:::::::::::::::::::::::::::::::::::::::::::::::::;:::lk0KKKKKKKKKKKKKKKKKKKOkKNNNNNMMMMMMMMMM
// MMMMMMMMMXkk0xdkO00KKKKKKKKKKKKKKKKKKK00xlccccccccccccccccccccccccccccccc::::::::::::::::::;::::::::::::::::lxOKKKKKKKKKKKKKKKKKK0K0OXMMMMMMMMMMMMMMMM
// MMMMMMMMMNOkkxxkxx0KKKKKKKKKKKKKKKKKKKKK0Oxolccccccccccccccccccccccccccccc::::::::::::::;;:::::;;;:::::;::lxO0KKKKKKKKKKKKKKKKKKKKKKXWMMMMMMMMMMMMMMMM
// MMMMMMMMMNXNMMMN0O0KKKKKKKKKKKKKKKKKKKKKKK0Okdlccccccccccccccccccccccccccc:::::::::::::::::::::;;::::::coxO0KKKKKKKKKKKKKKKKKKKKKKKKNMMMMMMMMMMMMMMMMM
// MMMMMMMMMXKNNKKWKO0KKKKKKKKKKKKKKKKKKKKKKKKK0kl,,;cccccccccccccccccccccccc:::::::::::::::::::::;;;;;,',oO0K0KKKKKKKKKKKKKKKKKKKKKKKKKOxxxk0NMMMMMMMMMM
// MMMMMMMMMXkxxddkxx0KKKKKKKKKKKKKKKKKKKKKK0Od:.    .lxolccccccccccccccccccc:::::::::::::::::::;:clo:.    .:dO0KKKKKKKKKKKKKKKKKKKKKK0O0KXX0OKWMMMMMMMMM
// MMMMMMMMMNK0KXNNNKKKKKKKKKKKKKKKKKKKKK0Odl:.       'ONKOdlcccccccccccccccc:::;:::::;;::;:;;:cdOKXx.       .,cdk0KKKKKKKKKKKKKKKKKK00KXWMMWNXWMMMMMMMMM
// MMMMMMMMMWKKNNNXKOOKKKKKKKKKKKKKKKK0kdc;,,'.        'OWMWKkl:::::::ccccccc:::;::::;;;:;;;:lkKWMWx.         ...,:ok00KK0KKKKKKKKKKK0OkKNMMNKXMMMMMMMMMM
// MMMMMMMMMW0xkkkkxxOKKKKKKKKKKKK0Oxoc;,,,,,'          'OWMMWXOdc;;;;;::::::;;;;;;;;;;;;;cd0NWMMWx.          ......';lxO0KKKKKKK0KKKK0KXXNWMMMMMMMMMMMMM
// MMMMMMMMMMKOKNMMMWNKKKKKKKKK0kdl:,,,,,,,,,.           'OWMMMMWKxl:;;;;;;;;;;;;;;;;;;:okKWMMMMWx.           .........',cdk0KKKKKKKK0KX0kxxkXMMMMMMMMMMM
// MMMMMMMMMMWKKNNN0kOKK0KK00kdc;,,,,,,,,,,,,.            'kWMMMMMWNOdc;;;;;;;;;;;;;;cd0NWMMMMMWx.            .............,:ok0KKKKKkxxxkkO0NMMMMMMMMMMM
// MMMMMMMMMMMXKNKxlkXNK0Oxoc;,,,,,,,,,,,,,,'.             'kWMMMMMMMWKkl:;;;;;;;;:okKWMMMMMMMWx.             ................';lxO0OddO0XWMMMMMMMMMMMMMM
// MMMMMMMMMMMMNOodKNN0xl:,,,,,,,,,,,,,,,,,,,'...           .kWMMMMMMMMWN0dc;;;:lx0NMMMMMMMMMWx.             ....................';lk0Oxdxxx0WMMMMMMMMMMM
// MMMMMMMMMMMMKdONNNNXo,,,,,,,,,,,,,,,,,,,,,,,,''...        .kWMMMMMMMMMMWKxookXWMMMMMMMMMMWd.         ...........................'lkkkkO0OXMMMMMMMMMMMM
// MMMMMMMMMMMMWNNXOkxxdc;,,,,,,,,,,,,,,,,,,,,,,'...          .kWMMMMMMMMMN0occo0NMMMMMMMMMWd.           .........................'dNWWW0xOXMMMMMMMMMMMMM
// MMMMMMMMMMMMMNkdkOKNMNd;,,,,,,,,,,,,,,,,,,,,'.              .kWMMMMMWXOo:;,'';lONMMMMMMNd.              .......................,oOKNMNKXMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMWWMMMMMWx;,,,,,,,,,,,,,,,,,,,,,'..             .kWMMMWXxc;;;,'''':xXWMMMNd.              ......................'o00kxxxkOXMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMWKK0xdko,,,,,,,,,,,,,,,,,,,,,,'..            .xWWXKK0ko:;,',:ok0KKNWNd.             ........................,kWMMWXkxKMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMWOdkOkkxl:;,,,,,,,,,,,,,,,,,,,,,,''.           .d0KKKKKOo;,',oOKKKKK0l.           .........................'lxxdxOXXKXMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMX0kxdxOKOl,,,,,,,,,,,,,,,,,,,,,,,,,'.          .l0KK0Oo:;,'';oOKKKOc.          ....,,....................,l0WXkxxdkNMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMKk0NWMNXKx;',,,,,,,,,,,,,,,,,,,,,,,,'..        .l00kl;;;,''',lkKOc.         ...'ckXKd;.................'cOXWWXXXKXWMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMXKNNOkxdoo:,,,,,,,,,,,,,,,,,,,,,,,,,'..       .lkdlllllccc:,cdc.        ...,lONMMMWXxokOo,.........'lOkdokXWNKNMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMNXKkddkKKOxc,,,,,,,,,,,,,,,,,,,,,,,,,,''.      .cxxxxxxxxdl,'.       ....,o0NWWWWWWWWWWMWKd;.....,ldxkkO0xdkNMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMWKkKN0odOXKd,',,,,,,,,,,,,,,,,,,,,,,,,,,'.      ';:::;,,,,'.      ......;loooooooooooooool:'...:OWMMWKxx0KXWMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMKdOWMXkodxl;,,,,,,,,,,,,,,,,,,,,,,,,,,'..    .,;;,,'''.     .........'''''''''''''''''..,cllkNMMMMNKXWMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMNKXKxoxXWKodd:,,,,,,,,,,,,,,,,,,,',,,,,,'..   .,;,'''.    ............................,cok00xokNMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMWXkxXWNXxc0WOl;,,,,,,,,,,,,,,,,,,,,,,,,,,,'.  .,,''.  ............................',cONXkodXKddXMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNKXNdoXNXXd:lc;,,,,,,,,,,,,,,,,,,,,,,,,,'...'.. ...........................';ck0ddXMMXdkWWNWMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWNWNooKNWXldNNxc;,,,,,,,,,,,,,,,,,,,,,,,,,''............................';ckXNXNNXXNWNKXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMW0OWMMOlkXXNXd:dd:,,,,,,,,,,,,,,,,,,,,,,,'.......................,cook0xdxkO0XWNKKNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWkxXWWMMOlOXOkdll:,,,,,,,,,,,,,,,,,,'...................,ll;lKWKXWWK0Okdd0WMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWMMWNN0cxWMWXXXd:doll:,,,,,,,,,,,,'..........,;;';dkkclXMXxodOXWMWKKWWNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXKNXodWMWX0klkNNNWxckd:d0Oooxkocclocoxdxkol0NdlXMMKlxWMWXkokWMMWNWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMW00WXKNKodNMMMNodWXldXXXWMMOllxNXXWXNMXoxWKlkWWWOlOK0WMNXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNN0xKMMMMOlOMMklOXWMMMN0xdoxXWXNMWdoXWdlKX0KO0XXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMW0kNMMXxOWMMMMNKKXKdOWKKWMOdKWXOXWWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWMMMMMWNXNNXWMNNWMWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
// https://Newspaper.finance
contract N3WS is ERC20Burnable, ERC20TransferLiquidityLock, Ownable {

    mapping (address => bool) internal whitelistedSenders;

    enum ArticleType {
        Cover,
        Column,
        Ad
    }

    struct ArticleInfo {
        uint256 id;
        string title;
        string subTitle;
        string body;
        ArticleType articleType;
        string imageUrl;
        uint256 publicationDate;
        uint256 price;
        address owner;
    }

    uint256 public constant MIN_ARTICLE_PRICE = 1 ether; // 1 $N3WS

    uint256 internal maxColumnArticles = 5;

    uint256 internal maxAdArticles = 4;

    mapping (uint256 => ArticleInfo) public articles;

    uint256 public totalArticles;

    uint256 public lastCoverArticle;

    uint256[] public lastColumnArticles;

    uint256[] public lastAdArticles;

    event ArticlePosted(
        uint256 id,
        string title,
        string subTitle,
        string body,
        ArticleType articleType,
        string imageUrl,
        uint256 publicationDate,
        uint256 price,
        address owner
    );

    constructor() 
    public
    Ownable()
    ERC20("Newspaper.finance", "N3WS")
    {
        liquidityLockDivisor = 10;
        _mint(msg.sender, 1_000_000 ether);
    }

    function setUniswapV2Pair() external onlyOwner returns (address) {
        require(uniswapV2Pair == address(0), "N3WS: pair already set");
        uniswapV2Pair = IUniswapV2Factory(address(uniswapFactory)).createPair(
            IUniswapV2Router02(address(uniswapV2Router)).WETH(),
            address(this)
        );        
        setWhitelistedSender(uniswapV2Pair, true);
        return uniswapV2Pair;
    }

    function setLiquidityLoop(address _liquidityLooop) external onlyOwner {
        // require(liquidityLoop == address(0), "N3WS: liquidity loop already set");
        liquidityLoop = _liquidityLooop;
    }

    function setLiquidityLockDivisor(uint256 _liquidityLockDivisor) external onlyOwner {
        if (_liquidityLockDivisor != 0) {
            require(_liquidityLockDivisor >= 10, "N3WS: liquidity lock divisor too small");
        }
        liquidityLockDivisor = _liquidityLockDivisor;
    }

    function setWhitelistedSender(address _address, bool _whitelisted) public onlyOwner {
        whitelistedSenders[_address] = _whitelisted;
    }    

    function postArticle(string calldata _title, string calldata _body, string calldata _subTitle, ArticleType _articleType, string calldata _imageUrl) 
    external 
    {
        uint256 newArticleId = ++totalArticles;

        ArticleInfo memory oldArticle;
        if (_articleType == ArticleType.Cover) {
            oldArticle = articles[lastCoverArticle];
            lastCoverArticle = newArticleId;
        } else if (_articleType == ArticleType.Column) {
            if (lastColumnArticles.length > 0) {
                if (lastColumnArticles.length == maxColumnArticles) {
                    oldArticle = articles[lastColumnArticles[0]];
                    _shiftLeft(lastColumnArticles);
                }
            }
            lastColumnArticles.push(newArticleId);
        } else if (_articleType == ArticleType.Ad) {
            if (lastAdArticles.length > 0) {
                if (lastAdArticles.length == maxAdArticles) {
                    oldArticle = articles[lastAdArticles[0]];
                    _shiftLeft(lastAdArticles);
                }
            }
            lastAdArticles.push(newArticleId);
        } else {
            revert("N3WS: invalid article type");
        }

        uint256 articlePrice = MIN_ARTICLE_PRICE;
        if (oldArticle.price > 0) {
            articlePrice = oldArticle.price;
            if (oldArticle.publicationDate < block.timestamp + 1 weeks) {
                articlePrice *= 2;
            }
        }

        super._burn(msg.sender, articlePrice);
        
        ArticleInfo memory newArticle = ArticleInfo({
            id: totalArticles,
            title: _title,
            body: _body,
            subTitle: _subTitle,
            articleType: _articleType,
            imageUrl: _imageUrl,
            publicationDate: block.timestamp,
            price: articlePrice,
            owner: msg.sender
        });
        articles[newArticle.id] = newArticle;

        emit ArticlePosted(newArticle.id, newArticle.title, newArticle.body, newArticle.subTitle, 
            newArticle.articleType, newArticle.imageUrl, newArticle.publicationDate, newArticle.price, newArticle.owner);
    }

    function setMaxColumnArticles(uint256 _maxColumnArticles) external onlyOwner {
        maxColumnArticles = _maxColumnArticles;
    }

    function setMaxAdArticles(uint256 _maxAdArticles) external onlyOwner {
        maxAdArticles = _maxAdArticles;
    }

    function getCoverArticle() external view returns(ArticleInfo memory) {
        return articles[lastCoverArticle];
    }

    function getColumnArticles() external view returns(ArticleInfo[] memory) {
        ArticleInfo[] memory columnArticles = new ArticleInfo[](lastColumnArticles.length);
        for (uint256 i = 0; i < lastColumnArticles.length; i++) {
            columnArticles[i] = articles[lastColumnArticles[i]];
        }
        return columnArticles;
    }

    function getAdArticles() external view returns(ArticleInfo[] memory) {
        ArticleInfo[] memory adArticles = new ArticleInfo[](lastAdArticles.length);
        for (uint256 i = 0; i < lastAdArticles.length; i++) {
            adArticles[i] = articles[lastAdArticles[i]];
        }
        return adArticles;
    }

    function _transfer(address from, address to, uint256 amount) internal override {
        if (liquidityLockDivisor != 0 && from != address(this) && !whitelistedSenders[from]) {
            uint256 liquidityLockAmount = amount.div(liquidityLockDivisor);
            super._transfer(from, address(this), liquidityLockAmount);
            super._transfer(from, to, amount.sub(liquidityLockAmount));
        }
        else {
            super._transfer(from, to, amount);
        }
    }

    // function _initializePair() internal {
    //     (address token0, address token1) = UniswapV2Library.sortTokens(address(this), address(WETH));
    //     isThisToken0 = (token0 == address(this));
    //     uniswapPair = UniswapV2Library.pairFor(uniswapV2Factory, token0, token1);
    //     setWhitelistedSender(uniswapPair, true);
    // }

    function _shiftLeft(uint256[] storage arr) internal {
        for (uint256 i = 0; i < arr.length - 1; i++) {
            arr[i] = arr[i + 1];
        }
        // delete arr[arr.length - 1];
        // arr.length--;
        arr.pop();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"string","name":"title","type":"string"},{"indexed":false,"internalType":"string","name":"subTitle","type":"string"},{"indexed":false,"internalType":"string","name":"body","type":"string"},{"indexed":false,"internalType":"enum N3WS.ArticleType","name":"articleType","type":"uint8"},{"indexed":false,"internalType":"string","name":"imageUrl","type":"string"},{"indexed":false,"internalType":"uint256","name":"publicationDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"ArticlePosted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"LockLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"RewardLiquidityProviders","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MIN_ARTICLE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"articles","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"subTitle","type":"string"},{"internalType":"string","name":"body","type":"string"},{"internalType":"enum N3WS.ArticleType","name":"articleType","type":"uint8"},{"internalType":"string","name":"imageUrl","type":"string"},{"internalType":"uint256","name":"publicationDate","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdArticles","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"subTitle","type":"string"},{"internalType":"string","name":"body","type":"string"},{"internalType":"enum N3WS.ArticleType","name":"articleType","type":"uint8"},{"internalType":"string","name":"imageUrl","type":"string"},{"internalType":"uint256","name":"publicationDate","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"internalType":"struct N3WS.ArticleInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getColumnArticles","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"subTitle","type":"string"},{"internalType":"string","name":"body","type":"string"},{"internalType":"enum N3WS.ArticleType","name":"articleType","type":"uint8"},{"internalType":"string","name":"imageUrl","type":"string"},{"internalType":"uint256","name":"publicationDate","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"internalType":"struct N3WS.ArticleInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCoverArticle","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"subTitle","type":"string"},{"internalType":"string","name":"body","type":"string"},{"internalType":"enum N3WS.ArticleType","name":"articleType","type":"uint8"},{"internalType":"string","name":"imageUrl","type":"string"},{"internalType":"uint256","name":"publicationDate","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"internalType":"struct N3WS.ArticleInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lastAdArticles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lastColumnArticles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastCoverArticle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityLockDivisor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityLoop","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockableSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_title","type":"string"},{"internalType":"string","name":"_body","type":"string"},{"internalType":"string","name":"_subTitle","type":"string"},{"internalType":"enum N3WS.ArticleType","name":"_articleType","type":"uint8"},{"internalType":"string","name":"_imageUrl","type":"string"}],"name":"postArticle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardLiquidityProviders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityLockDivisor","type":"uint256"}],"name":"setLiquidityLockDivisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityLooop","type":"address"}],"name":"setLiquidityLoop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxAdArticles","type":"uint256"}],"name":"setMaxAdArticles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxColumnArticles","type":"uint256"}],"name":"setMaxColumnArticles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setUniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_whitelisted","type":"bool"}],"name":"setWhitelistedSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalArticles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526005600a556004600b553480156200001b57600080fd5b506040518060400160405280601181526020017f4e65777370617065722e66696e616e63650000000000000000000000000000008152506040518060400160405280600481526020017f4e335753000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000a0929190620003c7565b508060049080519060200190620000b9929190620003c7565b506012600560006101000a81548160ff021916908360ff16021790555050506000620000ea620001b360201b60201c565b905080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600a600781905550620001ad3369d3c21bcecceda1000000620001bb60201b60201c565b62000587565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200022e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000225906200052d565b60405180910390fd5b62000242600083836200036a60201b60201c565b6200025e816002546200036f60201b620039461790919060201c565b600281905550620002bc816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200036f60201b620039461790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200035e91906200054f565b60405180910390a35050565b505050565b600080828401905083811015620003bd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003b4906200050b565b60405180910390fd5b8091505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200040a57805160ff19168380011785556200043b565b828001600101855582156200043b579182015b828111156200043a5782518255916020019190600101906200041d565b5b5090506200044a91906200044e565b5090565b6200047391905b808211156200046f57600081600090555060010162000455565b5090565b90565b600062000485601b836200056c565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000620004c7601f836200056c565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b62000505816200057d565b82525050565b60006020820190508181036000830152620005268162000476565b9050919050565b600060208201905081810360008301526200054881620004b8565b9050919050565b6000602082019050620005666000830184620004fa565b92915050565b600082825260208201905092915050565b6000819050919050565b615a6c80620005976000396000f3fe60806040526004361061021e5760003560e01c806379cc679011610123578063bef2e1ee116100ab578063dc654a731161006f578063dc654a73146107e2578063dd62ed3e1461080d578063edcfafe61461084a578063f2fde38b1461088f578063fd24edca146108b857610225565b8063bef2e1ee1461070f578063d1786d4e1461073a578063d500d2fb14610777578063da0791fc146107a0578063db647b76146107cb57610225565b806395d89b41116100f257806395d89b4114610614578063a457c2d71461063f578063a6a738f11461067c578063a8a5550e146106a7578063a9059cbb146106d257610225565b806379cc67901461056c578063811afd6d146105955780638353fb30146105c05780638da5cb5b146105e957610225565b806339509351116101a657806350a66a3d1161017557806350a66a3d1461049b578063643d56f7146104c457806367a9fca6146104ef57806370a0823114610518578063715018a61461055557610225565b806339509351146103df5780633fb5b7111461041c57806342966c681461044757806349bd5a5e1461047057610225565b806329923838116101ed57806329923838146102fa5780632f8331df14610323578063313ce5671461036057806331b525b21461038b57806337517ce9146103b457610225565b806306fdde031461022a578063095ea7b31461025557806318160ddd1461029257806323b872dd146102bd57610225565b3661022557005b600080fd5b34801561023657600080fd5b5061023f6108e3565b60405161024c9190615430565b60405180910390f35b34801561026157600080fd5b5061027c6004803603810190610277919061487f565b610985565b6040516102899190615415565b60405180910390f35b34801561029e57600080fd5b506102a76109a3565b6040516102b49190615614565b60405180910390f35b3480156102c957600080fd5b506102e460048036038101906102df91906147f4565b6109ad565b6040516102f19190615415565b60405180910390f35b34801561030657600080fd5b50610321600480360381019061031c9190614843565b610a86565b005b34801561032f57600080fd5b5061034a600480360381019061034591906149cc565b610b78565b6040516103579190615614565b60405180910390f35b34801561036c57600080fd5b50610375610b99565b604051610382919061575b565b60405180910390f35b34801561039757600080fd5b506103b260048036038101906103ad91906149cc565b610bb0565b005b3480156103c057600080fd5b506103c9610c51565b6040516103d69190615614565b60405180910390f35b3480156103eb57600080fd5b506104066004803603810190610401919061487f565b610c5d565b6040516104139190615415565b60405180910390f35b34801561042857600080fd5b50610431610d10565b60405161043e9190615614565b60405180910390f35b34801561045357600080fd5b5061046e600480360381019061046991906149cc565b610d16565b005b34801561047c57600080fd5b50610485610d2a565b604051610492919061530a565b60405180910390f35b3480156104a757600080fd5b506104c260048036038101906104bd9190614766565b610d50565b005b3480156104d057600080fd5b506104d9610e2b565b6040516104e6919061530a565b60405180910390f35b3480156104fb57600080fd5b50610516600480360381019061051191906149cc565b610e51565b005b34801561052457600080fd5b5061053f600480360381019061053a9190614766565b610f3f565b60405161054c9190615614565b60405180910390f35b34801561056157600080fd5b5061056a610f87565b005b34801561057857600080fd5b50610593600480360381019061058e919061487f565b6110df565b005b3480156105a157600080fd5b506105aa611141565b6040516105b791906153f3565b60405180910390f35b3480156105cc57600080fd5b506105e760048036038101906105e291906148e4565b61153b565b005b3480156105f557600080fd5b506105fe612413565b60405161060b919061530a565b60405180910390f35b34801561062057600080fd5b5061062961243d565b6040516106369190615430565b60405180910390f35b34801561064b57600080fd5b506106666004803603810190610661919061487f565b6124df565b6040516106739190615415565b60405180910390f35b34801561068857600080fd5b506106916125ac565b60405161069e919061530a565b60405180910390f35b3480156106b357600080fd5b506106bc61289d565b6040516106c99190615614565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f4919061487f565b6128ad565b6040516107069190615415565b60405180910390f35b34801561071b57600080fd5b506107246128cb565b6040516107319190615614565b60405180910390f35b34801561074657600080fd5b50610761600480360381019061075c91906149cc565b6128d1565b60405161076e9190615614565b60405180910390f35b34801561078357600080fd5b5061079e600480360381019061079991906149cc565b6128f2565b005b3480156107ac57600080fd5b506107b5612993565b6040516107c291906155f2565b60405180910390f35b3480156107d757600080fd5b506107e0612cea565b005b3480156107ee57600080fd5b506107f7612cfd565b6040516108049190615614565b60405180910390f35b34801561081957600080fd5b50610834600480360381019061082f91906147b8565b612d03565b6040516108419190615614565b60405180910390f35b34801561085657600080fd5b50610871600480360381019061086c91906149cc565b612d8a565b60405161088699989796959493929190615689565b60405180910390f35b34801561089b57600080fd5b506108b660048036038101906108b19190614766565b613065565b005b3480156108c457600080fd5b506108cd61322c565b6040516108da91906153f3565b60405180910390f35b606060038054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561097b5780601f106109505761010080835404028352916020019161097b565b820191906000526020600020905b81548152906001019060200180831161095e57829003601f168201915b5050505050905090565b6000610999610992613626565b848461362e565b6001905092915050565b6000600254905090565b60006109ba8484846137f9565b610a7b846109c6613626565b610a76856040518060600160405280602881526020016159c660289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610a2c613626565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138eb9092919063ffffffff16565b61362e565b600190509392505050565b610a8e613626565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1490615572565b60405180910390fd5b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60108181548110610b8557fe5b906000526020600020016000915090505481565b6000600560009054906101000a900460ff16905090565b610bb8613626565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90615572565b60405180910390fd5b80600a8190555050565b670de0b6b3a764000081565b6000610d06610c6a613626565b84610d018560016000610c7b613626565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461394690919063ffffffff16565b61362e565b6001905092915050565b600e5481565b610d27610d21613626565b8261399b565b50565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d58613626565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde90615572565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e59613626565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edf90615572565b60405180910390fd5b60008114610f3557600a811015610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b90615512565b60405180910390fd5b5b8060078190555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f8f613626565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590615572565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600061111e826040518060600160405280602481526020016159ee6024913961110f8661110a613626565b612d03565b6138eb9092919063ffffffff16565b90506111328361112c613626565b8361362e565b61113c838361399b565b505050565b606080600f8054905067ffffffffffffffff8111801561116057600080fd5b5060405190808252806020026020018201604052801561119a57816020015b611187614577565b81526020019060019003908161117f5790505b50905060008090505b600f8054905081101561153357600c6000600f83815481106111c157fe5b906000526020600020015481526020019081526020016000206040518061012001604052908160008201548152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112895780601f1061125e57610100808354040283529160200191611289565b820191906000526020600020905b81548152906001019060200180831161126c57829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561132b5780601f106113005761010080835404028352916020019161132b565b820191906000526020600020905b81548152906001019060200180831161130e57829003601f168201915b50505050508152602001600382018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113cd5780601f106113a2576101008083540402835291602001916113cd565b820191906000526020600020905b8154815290600101906020018083116113b057829003601f168201915b505050505081526020016004820160009054906101000a900460ff1660028111156113f457fe5b60028111156113ff57fe5b8152602001600582018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561149c5780601f106114715761010080835404028352916020019161149c565b820191906000526020600020905b81548152906001019060200180831161147f57829003601f168201915b5050505050815260200160068201548152602001600782015481526020016008820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505082828151811061151b57fe5b602002602001018190525080806001019150506111a3565b508091505090565b6000600d600081546001019190508190559050611556614577565b6000600281111561156357fe5b85600281111561156f57fe5b14156118cd57600c6000600e5481526020019081526020016000206040518061012001604052908160008201548152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116395780601f1061160e57610100808354040283529160200191611639565b820191906000526020600020905b81548152906001019060200180831161161c57829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116db5780601f106116b0576101008083540402835291602001916116db565b820191906000526020600020905b8154815290600101906020018083116116be57829003601f168201915b50505050508152602001600382018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561177d5780601f106117525761010080835404028352916020019161177d565b820191906000526020600020905b81548152906001019060200180831161176057829003601f168201915b505050505081526020016004820160009054906101000a900460ff1660028111156117a457fe5b60028111156117af57fe5b8152602001600582018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561184c5780601f106118215761010080835404028352916020019161184c565b820191906000526020600020905b81548152906001019060200180831161182f57829003601f168201915b5050505050815260200160068201548152602001600782015481526020016008820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050905081600e819055506120b9565b600160028111156118da57fe5b8560028111156118e657fe5b1415611ca5576000600f805490501115611c7757600a54600f805490501415611c7657600c6000600f60008154811061191b57fe5b906000526020600020015481526020019081526020016000206040518061012001604052908160008201548152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119e35780601f106119b8576101008083540402835291602001916119e3565b820191906000526020600020905b8154815290600101906020018083116119c657829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a855780601f10611a5a57610100808354040283529160200191611a85565b820191906000526020600020905b815481529060010190602001808311611a6857829003601f168201915b50505050508152602001600382018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b275780601f10611afc57610100808354040283529160200191611b27565b820191906000526020600020905b815481529060010190602001808311611b0a57829003601f168201915b505050505081526020016004820160009054906101000a900460ff166002811115611b4e57fe5b6002811115611b5957fe5b8152602001600582018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611bf65780601f10611bcb57610100808354040283529160200191611bf6565b820191906000526020600020905b815481529060010190602001808311611bd957829003601f168201915b5050505050815260200160068201548152602001600782015481526020016008820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050611c75600f613b49565b5b5b600f8290806001815401808255809150506001900390600052602060002001600090919091909150556120b8565b600280811115611cb157fe5b856002811115611cbd57fe5b141561207c576000601080549050111561204e57600b54601080549050141561204d57600c60006010600081548110611cf257fe5b906000526020600020015481526020019081526020016000206040518061012001604052908160008201548152602001600182018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611dba5780601f10611d8f57610100808354040283529160200191611dba565b820191906000526020600020905b815481529060010190602001808311611d9d57829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e5c5780601f10611e3157610100808354040283529160200191611e5c565b820191906000526020600020905b815481529060010190602001808311611e3f57829003601f168201915b50505050508152602001600382018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611efe5780601f10611ed357610100808354040283529160200191611efe565b820191906000526020600020905b815481529060010190602001808311611ee157829003601f168201915b505050505081526020016004820160009054906101000a900460ff166002811115611f2557fe5b6002811115611f3057fe5b8152602001600582018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611fcd5780601f10611fa257610100808354040283529160200191611fcd565b820191906000526020600020905b815481529060010190602001808311611fb057829003601f168201915b5050505050815260200160068201548152602001600782015481526020016008820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050905061204c6010613b49565b5b5b60108290806001815401808255809150506001900390600052602060002001600090919091909150556120b7565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ae90615532565b60405180910390fd5b5b5b6000670de0b6b3a7640000905060008260e0015111156120f3578160e00151905062093a8042018260c0015110156120f2576002810290505b5b6120fd338261399b565b612105614577565b604051806101200160405280600d5481526020018e8e8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020018a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020018c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200188600281111561220357fe5b815260200187878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020014281526020018381526020013373ffffffffffffffffffffffffffffffffffffffff16815250905080600c6000836000015181526020019081526020016000206000820151816000015560208201518160010190805190602001906122b89291906145e4565b5060408201518160020190805190602001906122d59291906145e4565b5060608201518160030190805190602001906122f29291906145e4565b5060808201518160040160006101000a81548160ff0219169083600281111561231757fe5b021790555060a08201518160050190805190602001906123389291906145e4565b5060c0820151816006015560e082015181600701556101008201518160080160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507feb12470937fad21fd1a370b583eed49055babef791c2a62c0c3bdc0afe7fdc7f816000015182602001518360600151846040015185608001518660a001518760c001518860e001518961010001516040516123fc99989796959493929190615689565b60405180910390a150505050505050505050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124d55780601f106124aa576101008083540402835291602001916124d5565b820191906000526020600020905b8154815290600101906020018083116124b857829003601f168201915b5050505050905090565b60006125a26124ec613626565b8461259d85604051806060016040528060258152602001615a126025913960016000612516613626565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138eb9092919063ffffffff16565b61362e565b6001905092915050565b60006125b6613626565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263c90615572565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146126d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cd90615472565b60405180910390fd5b735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f73ffffffffffffffffffffffffffffffffffffffff1663c9c65396737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561276057600080fd5b505afa158015612774573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612798919061478f565b306040518363ffffffff1660e01b81526004016127b69291906153a1565b602060405180830381600087803b1580156127d057600080fd5b505af11580156127e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612808919061478f565b600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612875600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001610a86565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006128a830610f3f565b905090565b60006128c16128ba613626565b84846137f9565b6001905092915050565b600d5481565b600f81815481106128de57fe5b906000526020600020016000915090505481565b6128fa613626565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298090615572565b60405180910390fd5b80600b8190555050565b61299b614577565b600c6000600e5481526020019081526020016000206040518061012001604052908160008201548152602001600182018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a5f5780601f10612a3457610100808354040283529160200191612a5f565b820191906000526020600020905b815481529060010190602001808311612a4257829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612b015780601f10612ad657610100808354040283529160200191612b01565b820191906000526020600020905b815481529060010190602001808311612ae457829003601f168201915b50505050508152602001600382018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612ba35780601f10612b7857610100808354040283529160200191612ba3565b820191906000526020600020905b815481529060010190602001808311612b8657829003601f168201915b505050505081526020016004820160009054906101000a900460ff166002811115612bca57fe5b6002811115612bd557fe5b8152602001600582018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612c725780601f10612c4757610100808354040283529160200191612c72565b820191906000526020600020905b815481529060010190602001808311612c5557829003601f168201915b5050505050815260200160068201548152602001600782015481526020016008820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050905090565b612cfb612cf630610f3f565b613bc3565b565b60075481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600c602052806000526040600020600091509050806000015490806001018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612e3c5780601f10612e1157610100808354040283529160200191612e3c565b820191906000526020600020905b815481529060010190602001808311612e1f57829003601f168201915b505050505090806002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612eda5780601f10612eaf57610100808354040283529160200191612eda565b820191906000526020600020905b815481529060010190602001808311612ebd57829003601f168201915b505050505090806003018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612f785780601f10612f4d57610100808354040283529160200191612f78565b820191906000526020600020905b815481529060010190602001808311612f5b57829003601f168201915b5050505050908060040160009054906101000a900460ff1690806005018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130295780601f10612ffe57610100808354040283529160200191613029565b820191906000526020600020905b81548152906001019060200180831161300c57829003601f168201915b5050505050908060060154908060070154908060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905089565b61306d613626565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146130fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f390615572565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561316c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316390615492565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60608060108054905067ffffffffffffffff8111801561324b57600080fd5b5060405190808252806020026020018201604052801561328557816020015b613272614577565b81526020019060019003908161326a5790505b50905060008090505b60108054905081101561361e57600c6000601083815481106132ac57fe5b906000526020600020015481526020019081526020016000206040518061012001604052908160008201548152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156133745780601f1061334957610100808354040283529160200191613374565b820191906000526020600020905b81548152906001019060200180831161335757829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156134165780601f106133eb57610100808354040283529160200191613416565b820191906000526020600020905b8154815290600101906020018083116133f957829003601f168201915b50505050508152602001600382018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156134b85780601f1061348d576101008083540402835291602001916134b8565b820191906000526020600020905b81548152906001019060200180831161349b57829003601f168201915b505050505081526020016004820160009054906101000a900460ff1660028111156134df57fe5b60028111156134ea57fe5b8152602001600582018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156135875780601f1061355c57610100808354040283529160200191613587565b820191906000526020600020905b81548152906001019060200180831161356a57829003601f168201915b5050505050815260200160068201548152602001600782015481526020016008820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505082828151811061360657fe5b6020026020010181905250808060010191505061328e565b508091505090565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561369e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613695906155d2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561370e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613705906154b2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516137ec9190615614565b60405180910390a3505050565b60006007541415801561383857503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b801561388e5750600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156138da5760006138aa60075483613eff90919063ffffffff16565b90506138b7843083613f49565b6138d484846138cf84866141de90919063ffffffff16565b613f49565b506138e6565b6138e5838383613f49565b5b505050565b6000838311158290613933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161392a9190615430565b60405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015613991576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613988906154f2565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0290615592565b60405180910390fd5b613a1782600083614228565b613a828160405180606001604052806022815260200161597e602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138eb9092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ad9816002546141de90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613b3d9190615614565b60405180910390a35050565b60008090505b6001828054905003811015613b9f57816001820181548110613b6d57fe5b9060005260206000200154828281548110613b8457fe5b90600052602060002001819055508080600101915050613b4f565b5080805480613baa57fe5b6001900381819060005260206000200160009055905550565b613bcc30610f3f565b811115613c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c0590615552565b60405180910390fd5b6000811415613c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c49906154d2565b60405180910390fd5b6000613c68600283613eff90919063ffffffff16565b90506000613c7f82846141de90919063ffffffff16565b90506000479050613c8f8361422d565b6000613ca482476141de90919063ffffffff16565b9050613cb08382614445565b7f1ac88120e7cb0c1102895c679e94394ce3fb63f5fc8ff9519213798ec483fbc08382604051613ce1929190615732565b60405180910390a16000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613d469190615325565b60206040518083038186803b158015613d5e57600080fd5b505afa158015613d72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d9691906149f5565b9050600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401613e179291906153ca565b602060405180830381600087803b158015613e3157600080fd5b505af1158015613e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e6991906148bb565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633c6b16ab826040518263ffffffff1660e01b8152600401613ec59190615614565b600060405180830381600087803b158015613edf57600080fd5b505af1158015613ef3573d6000803e3d6000fd5b50505050505050505050565b6000613f4183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614516565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fb0906155b2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161402090615452565b60405180910390fd5b614034838383614228565b61409f816040518060600160405280602681526020016159a0602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138eb9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614132816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461394690919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516141d19190615614565b60405180910390a3505050565b600061422083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506138eb565b905092915050565b505050565b6060600267ffffffffffffffff8111801561424757600080fd5b506040519080825280602002602001820160405280156142765781602001602082028036833780820191505090505b509050308160008151811061428757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561431b57600080fd5b505afa15801561432f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614353919061478f565b8160018151811061436057fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506143b930737a250d5630b4cf539739df2c5dacb4c659f2488d8461362e565b737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161440f95949392919061562f565b600060405180830381600087803b15801561442957600080fd5b505af115801561443d573d6000803e3d6000fd5b505050505050565b61446430737a250d5630b4cf539739df2c5dacb4c659f2488d8461362e565b737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008030426040518863ffffffff1660e01b81526004016144bd96959493929190615340565b6060604051808303818588803b1580156144d657600080fd5b505af11580156144ea573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061450f9190614a1e565b5050505050565b6000808311829061455d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016145549190615430565b60405180910390fd5b50600083858161456957fe5b049050809150509392505050565b60405180610120016040528060008152602001606081526020016060815260200160608152602001600060028111156145ac57fe5b8152602001606081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061462557805160ff1916838001178555614653565b82800160010185558215614653579182015b82811115614652578251825591602001919060010190614637565b5b5090506146609190614664565b5090565b61468691905b8082111561468257600081600090555060010161466a565b5090565b90565b60008135905061469881615928565b92915050565b6000815190506146ad81615928565b92915050565b6000813590506146c28161593f565b92915050565b6000815190506146d78161593f565b92915050565b6000813590506146ec81615956565b92915050565b60008083601f84011261470457600080fd5b8235905067ffffffffffffffff81111561471d57600080fd5b60208301915083600182028301111561473557600080fd5b9250929050565b60008135905061474b81615966565b92915050565b60008151905061476081615966565b92915050565b60006020828403121561477857600080fd5b600061478684828501614689565b91505092915050565b6000602082840312156147a157600080fd5b60006147af8482850161469e565b91505092915050565b600080604083850312156147cb57600080fd5b60006147d985828601614689565b92505060206147ea85828601614689565b9150509250929050565b60008060006060848603121561480957600080fd5b600061481786828701614689565b935050602061482886828701614689565b92505060406148398682870161473c565b9150509250925092565b6000806040838503121561485657600080fd5b600061486485828601614689565b9250506020614875858286016146b3565b9150509250929050565b6000806040838503121561489257600080fd5b60006148a085828601614689565b92505060206148b18582860161473c565b9150509250929050565b6000602082840312156148cd57600080fd5b60006148db848285016146c8565b91505092915050565b600080600080600080600080600060a08a8c03121561490257600080fd5b60008a013567ffffffffffffffff81111561491c57600080fd5b6149288c828d016146f2565b995099505060208a013567ffffffffffffffff81111561494757600080fd5b6149538c828d016146f2565b975097505060408a013567ffffffffffffffff81111561497257600080fd5b61497e8c828d016146f2565b955095505060606149918c828d016146dd565b93505060808a013567ffffffffffffffff8111156149ae57600080fd5b6149ba8c828d016146f2565b92509250509295985092959850929598565b6000602082840312156149de57600080fd5b60006149ec8482850161473c565b91505092915050565b600060208284031215614a0757600080fd5b6000614a1584828501614751565b91505092915050565b600080600060608486031215614a3357600080fd5b6000614a4186828701614751565b9350506020614a5286828701614751565b9250506040614a6386828701614751565b9150509250925092565b6000614a798383614aa8565b60208301905092915050565b6000614a918383615129565b905092915050565b614aa28161587d565b82525050565b614ab181615815565b82525050565b614ac081615815565b82525050565b6000614ad182615796565b614adb81856157d1565b9350614ae683615776565b8060005b83811015614b17578151614afe8882614a6d565b9750614b09836157b7565b925050600181019050614aea565b5085935050505092915050565b6000614b2f826157a1565b614b3981856157e2565b935083602082028501614b4b85615786565b8060005b85811015614b875784840389528151614b688582614a85565b9450614b73836157c4565b925060208a01995050600181019050614b4f565b50829750879550505050505092915050565b614ba281615827565b82525050565b614bb18161588f565b82525050565b614bc08161588f565b82525050565b614bcf816158a1565b82525050565b6000614be0826157ac565b614bea81856157f3565b9350614bfa8185602086016158d7565b614c038161590a565b840191505092915050565b6000614c19826157ac565b614c238185615804565b9350614c338185602086016158d7565b614c3c8161590a565b840191505092915050565b6000614c54602383615804565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614cba601683615804565b91507f4e3357533a207061697220616c726561647920736574000000000000000000006000830152602082019050919050565b6000614cfa602683615804565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d60602283615804565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614dc6604283615804565b91507f45524332305472616e736665724c69717569646974794c6f636b3a3a6c6f636b60008301527f4c69717569646974793a206c6f636b20616d6f756e742063616e6e6f7420626560208301527f20300000000000000000000000000000000000000000000000000000000000006040830152606082019050919050565b6000614e52601b83615804565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614e92602683615804565b91507f4e3357533a206c6971756964697479206c6f636b2064697669736f7220746f6f60008301527f20736d616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ef8601a83615804565b91507f4e3357533a20696e76616c69642061727469636c6520747970650000000000006000830152602082019050919050565b6000614f38605383615804565b91507f45524332305472616e736665724c69717569646974794c6f636b3a3a6c6f636b60008301527f4c69717569646974793a206c6f636b20616d6f756e742068696768657220746860208301527f616e206c6f636b61626c652062616c616e6365000000000000000000000000006040830152606082019050919050565b6000614fc4602083615804565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000615004602183615804565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061506a602583615804565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006150d0602483615804565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006101208301600083015161514260008601826152dd565b506020830151848203602086015261515a8282614bd5565b915050604083015184820360408601526151748282614bd5565b9150506060830151848203606086015261518e8282614bd5565b91505060808301516151a36080860182614ba8565b5060a083015184820360a08601526151bb8282614bd5565b91505060c08301516151d060c08601826152dd565b5060e08301516151e360e08601826152dd565b506101008301516151f8610100860182614aa8565b508091505092915050565b60006101208301600083015161521c60008601826152dd565b50602083015184820360208601526152348282614bd5565b9150506040830151848203604086015261524e8282614bd5565b915050606083015184820360608601526152688282614bd5565b915050608083015161527d6080860182614ba8565b5060a083015184820360a08601526152958282614bd5565b91505060c08301516152aa60c08601826152dd565b5060e08301516152bd60e08601826152dd565b506101008301516152d2610100860182614aa8565b508091505092915050565b6152e681615866565b82525050565b6152f581615866565b82525050565b61530481615870565b82525050565b600060208201905061531f6000830184614ab7565b92915050565b600060208201905061533a6000830184614a99565b92915050565b600060c0820190506153556000830189614a99565b61536260208301886152ec565b61536f6040830187614bc6565b61537c6060830186614bc6565b6153896080830185614a99565b61539660a08301846152ec565b979650505050505050565b60006040820190506153b66000830185614ab7565b6153c36020830184614a99565b9392505050565b60006040820190506153df6000830185614ab7565b6153ec60208301846152ec565b9392505050565b6000602082019050818103600083015261540d8184614b24565b905092915050565b600060208201905061542a6000830184614b99565b92915050565b6000602082019050818103600083015261544a8184614c0e565b905092915050565b6000602082019050818103600083015261546b81614c47565b9050919050565b6000602082019050818103600083015261548b81614cad565b9050919050565b600060208201905081810360008301526154ab81614ced565b9050919050565b600060208201905081810360008301526154cb81614d53565b9050919050565b600060208201905081810360008301526154eb81614db9565b9050919050565b6000602082019050818103600083015261550b81614e45565b9050919050565b6000602082019050818103600083015261552b81614e85565b9050919050565b6000602082019050818103600083015261554b81614eeb565b9050919050565b6000602082019050818103600083015261556b81614f2b565b9050919050565b6000602082019050818103600083015261558b81614fb7565b9050919050565b600060208201905081810360008301526155ab81614ff7565b9050919050565b600060208201905081810360008301526155cb8161505d565b9050919050565b600060208201905081810360008301526155eb816150c3565b9050919050565b6000602082019050818103600083015261560c8184615203565b905092915050565b600060208201905061562960008301846152ec565b92915050565b600060a08201905061564460008301886152ec565b6156516020830187614bc6565b81810360408301526156638186614ac6565b90506156726060830185614a99565b61567f60808301846152ec565b9695505050505050565b60006101208201905061569f600083018c6152ec565b81810360208301526156b1818b614c0e565b905081810360408301526156c5818a614c0e565b905081810360608301526156d98189614c0e565b90506156e86080830188614bb7565b81810360a08301526156fa8187614c0e565b905061570960c08301866152ec565b61571660e08301856152ec565b615724610100830184614ab7565b9a9950505050505050505050565b600060408201905061574760008301856152ec565b61575460208301846152ec565b9392505050565b600060208201905061577060008301846152fb565b92915050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061582082615846565b9050919050565b60008115159050919050565b60008190506158418261591b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615888826158b3565b9050919050565b600061589a82615833565b9050919050565b60006158ac82615866565b9050919050565b60006158be826158c5565b9050919050565b60006158d082615846565b9050919050565b60005b838110156158f55780820151818401526020810190506158da565b83811115615904576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061592557fe5b50565b61593181615815565b811461593c57600080fd5b50565b61594881615827565b811461595357600080fd5b50565b6003811061596357600080fd5b50565b61596f81615866565b811461597a57600080fd5b5056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e67cf5d97fca1210eed918068b3f5b06b26015ec10e64dd1497198dac0cd30fe64736f6c63430006060033

Deployed Bytecode

0x60806040526004361061021e5760003560e01c806379cc679011610123578063bef2e1ee116100ab578063dc654a731161006f578063dc654a73146107e2578063dd62ed3e1461080d578063edcfafe61461084a578063f2fde38b1461088f578063fd24edca146108b857610225565b8063bef2e1ee1461070f578063d1786d4e1461073a578063d500d2fb14610777578063da0791fc146107a0578063db647b76146107cb57610225565b806395d89b41116100f257806395d89b4114610614578063a457c2d71461063f578063a6a738f11461067c578063a8a5550e146106a7578063a9059cbb146106d257610225565b806379cc67901461056c578063811afd6d146105955780638353fb30146105c05780638da5cb5b146105e957610225565b806339509351116101a657806350a66a3d1161017557806350a66a3d1461049b578063643d56f7146104c457806367a9fca6146104ef57806370a0823114610518578063715018a61461055557610225565b806339509351146103df5780633fb5b7111461041c57806342966c681461044757806349bd5a5e1461047057610225565b806329923838116101ed57806329923838146102fa5780632f8331df14610323578063313ce5671461036057806331b525b21461038b57806337517ce9146103b457610225565b806306fdde031461022a578063095ea7b31461025557806318160ddd1461029257806323b872dd146102bd57610225565b3661022557005b600080fd5b34801561023657600080fd5b5061023f6108e3565b60405161024c9190615430565b60405180910390f35b34801561026157600080fd5b5061027c6004803603810190610277919061487f565b610985565b6040516102899190615415565b60405180910390f35b34801561029e57600080fd5b506102a76109a3565b6040516102b49190615614565b60405180910390f35b3480156102c957600080fd5b506102e460048036038101906102df91906147f4565b6109ad565b6040516102f19190615415565b60405180910390f35b34801561030657600080fd5b50610321600480360381019061031c9190614843565b610a86565b005b34801561032f57600080fd5b5061034a600480360381019061034591906149cc565b610b78565b6040516103579190615614565b60405180910390f35b34801561036c57600080fd5b50610375610b99565b604051610382919061575b565b60405180910390f35b34801561039757600080fd5b506103b260048036038101906103ad91906149cc565b610bb0565b005b3480156103c057600080fd5b506103c9610c51565b6040516103d69190615614565b60405180910390f35b3480156103eb57600080fd5b506104066004803603810190610401919061487f565b610c5d565b6040516104139190615415565b60405180910390f35b34801561042857600080fd5b50610431610d10565b60405161043e9190615614565b60405180910390f35b34801561045357600080fd5b5061046e600480360381019061046991906149cc565b610d16565b005b34801561047c57600080fd5b50610485610d2a565b604051610492919061530a565b60405180910390f35b3480156104a757600080fd5b506104c260048036038101906104bd9190614766565b610d50565b005b3480156104d057600080fd5b506104d9610e2b565b6040516104e6919061530a565b60405180910390f35b3480156104fb57600080fd5b50610516600480360381019061051191906149cc565b610e51565b005b34801561052457600080fd5b5061053f600480360381019061053a9190614766565b610f3f565b60405161054c9190615614565b60405180910390f35b34801561056157600080fd5b5061056a610f87565b005b34801561057857600080fd5b50610593600480360381019061058e919061487f565b6110df565b005b3480156105a157600080fd5b506105aa611141565b6040516105b791906153f3565b60405180910390f35b3480156105cc57600080fd5b506105e760048036038101906105e291906148e4565b61153b565b005b3480156105f557600080fd5b506105fe612413565b60405161060b919061530a565b60405180910390f35b34801561062057600080fd5b5061062961243d565b6040516106369190615430565b60405180910390f35b34801561064b57600080fd5b506106666004803603810190610661919061487f565b6124df565b6040516106739190615415565b60405180910390f35b34801561068857600080fd5b506106916125ac565b60405161069e919061530a565b60405180910390f35b3480156106b357600080fd5b506106bc61289d565b6040516106c99190615614565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f4919061487f565b6128ad565b6040516107069190615415565b60405180910390f35b34801561071b57600080fd5b506107246128cb565b6040516107319190615614565b60405180910390f35b34801561074657600080fd5b50610761600480360381019061075c91906149cc565b6128d1565b60405161076e9190615614565b60405180910390f35b34801561078357600080fd5b5061079e600480360381019061079991906149cc565b6128f2565b005b3480156107ac57600080fd5b506107b5612993565b6040516107c291906155f2565b60405180910390f35b3480156107d757600080fd5b506107e0612cea565b005b3480156107ee57600080fd5b506107f7612cfd565b6040516108049190615614565b60405180910390f35b34801561081957600080fd5b50610834600480360381019061082f91906147b8565b612d03565b6040516108419190615614565b60405180910390f35b34801561085657600080fd5b50610871600480360381019061086c91906149cc565b612d8a565b60405161088699989796959493929190615689565b60405180910390f35b34801561089b57600080fd5b506108b660048036038101906108b19190614766565b613065565b005b3480156108c457600080fd5b506108cd61322c565b6040516108da91906153f3565b60405180910390f35b606060038054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561097b5780601f106109505761010080835404028352916020019161097b565b820191906000526020600020905b81548152906001019060200180831161095e57829003601f168201915b5050505050905090565b6000610999610992613626565b848461362e565b6001905092915050565b6000600254905090565b60006109ba8484846137f9565b610a7b846109c6613626565b610a76856040518060600160405280602881526020016159c660289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610a2c613626565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138eb9092919063ffffffff16565b61362e565b600190509392505050565b610a8e613626565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1490615572565b60405180910390fd5b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60108181548110610b8557fe5b906000526020600020016000915090505481565b6000600560009054906101000a900460ff16905090565b610bb8613626565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90615572565b60405180910390fd5b80600a8190555050565b670de0b6b3a764000081565b6000610d06610c6a613626565b84610d018560016000610c7b613626565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461394690919063ffffffff16565b61362e565b6001905092915050565b600e5481565b610d27610d21613626565b8261399b565b50565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d58613626565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dde90615572565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e59613626565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edf90615572565b60405180910390fd5b60008114610f3557600a811015610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b90615512565b60405180910390fd5b5b8060078190555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f8f613626565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590615572565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600061111e826040518060600160405280602481526020016159ee6024913961110f8661110a613626565b612d03565b6138eb9092919063ffffffff16565b90506111328361112c613626565b8361362e565b61113c838361399b565b505050565b606080600f8054905067ffffffffffffffff8111801561116057600080fd5b5060405190808252806020026020018201604052801561119a57816020015b611187614577565b81526020019060019003908161117f5790505b50905060008090505b600f8054905081101561153357600c6000600f83815481106111c157fe5b906000526020600020015481526020019081526020016000206040518061012001604052908160008201548152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112895780601f1061125e57610100808354040283529160200191611289565b820191906000526020600020905b81548152906001019060200180831161126c57829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561132b5780601f106113005761010080835404028352916020019161132b565b820191906000526020600020905b81548152906001019060200180831161130e57829003601f168201915b50505050508152602001600382018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113cd5780601f106113a2576101008083540402835291602001916113cd565b820191906000526020600020905b8154815290600101906020018083116113b057829003601f168201915b505050505081526020016004820160009054906101000a900460ff1660028111156113f457fe5b60028111156113ff57fe5b8152602001600582018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561149c5780601f106114715761010080835404028352916020019161149c565b820191906000526020600020905b81548152906001019060200180831161147f57829003601f168201915b5050505050815260200160068201548152602001600782015481526020016008820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505082828151811061151b57fe5b602002602001018190525080806001019150506111a3565b508091505090565b6000600d600081546001019190508190559050611556614577565b6000600281111561156357fe5b85600281111561156f57fe5b14156118cd57600c6000600e5481526020019081526020016000206040518061012001604052908160008201548152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116395780601f1061160e57610100808354040283529160200191611639565b820191906000526020600020905b81548152906001019060200180831161161c57829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116db5780601f106116b0576101008083540402835291602001916116db565b820191906000526020600020905b8154815290600101906020018083116116be57829003601f168201915b50505050508152602001600382018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561177d5780601f106117525761010080835404028352916020019161177d565b820191906000526020600020905b81548152906001019060200180831161176057829003601f168201915b505050505081526020016004820160009054906101000a900460ff1660028111156117a457fe5b60028111156117af57fe5b8152602001600582018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561184c5780601f106118215761010080835404028352916020019161184c565b820191906000526020600020905b81548152906001019060200180831161182f57829003601f168201915b5050505050815260200160068201548152602001600782015481526020016008820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050905081600e819055506120b9565b600160028111156118da57fe5b8560028111156118e657fe5b1415611ca5576000600f805490501115611c7757600a54600f805490501415611c7657600c6000600f60008154811061191b57fe5b906000526020600020015481526020019081526020016000206040518061012001604052908160008201548152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119e35780601f106119b8576101008083540402835291602001916119e3565b820191906000526020600020905b8154815290600101906020018083116119c657829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a855780601f10611a5a57610100808354040283529160200191611a85565b820191906000526020600020905b815481529060010190602001808311611a6857829003601f168201915b50505050508152602001600382018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b275780601f10611afc57610100808354040283529160200191611b27565b820191906000526020600020905b815481529060010190602001808311611b0a57829003601f168201915b505050505081526020016004820160009054906101000a900460ff166002811115611b4e57fe5b6002811115611b5957fe5b8152602001600582018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611bf65780601f10611bcb57610100808354040283529160200191611bf6565b820191906000526020600020905b815481529060010190602001808311611bd957829003601f168201915b5050505050815260200160068201548152602001600782015481526020016008820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050611c75600f613b49565b5b5b600f8290806001815401808255809150506001900390600052602060002001600090919091909150556120b8565b600280811115611cb157fe5b856002811115611cbd57fe5b141561207c576000601080549050111561204e57600b54601080549050141561204d57600c60006010600081548110611cf257fe5b906000526020600020015481526020019081526020016000206040518061012001604052908160008201548152602001600182018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611dba5780601f10611d8f57610100808354040283529160200191611dba565b820191906000526020600020905b815481529060010190602001808311611d9d57829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e5c5780601f10611e3157610100808354040283529160200191611e5c565b820191906000526020600020905b815481529060010190602001808311611e3f57829003601f168201915b50505050508152602001600382018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611efe5780601f10611ed357610100808354040283529160200191611efe565b820191906000526020600020905b815481529060010190602001808311611ee157829003601f168201915b505050505081526020016004820160009054906101000a900460ff166002811115611f2557fe5b6002811115611f3057fe5b8152602001600582018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611fcd5780601f10611fa257610100808354040283529160200191611fcd565b820191906000526020600020905b815481529060010190602001808311611fb057829003601f168201915b5050505050815260200160068201548152602001600782015481526020016008820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050905061204c6010613b49565b5b5b60108290806001815401808255809150506001900390600052602060002001600090919091909150556120b7565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ae90615532565b60405180910390fd5b5b5b6000670de0b6b3a7640000905060008260e0015111156120f3578160e00151905062093a8042018260c0015110156120f2576002810290505b5b6120fd338261399b565b612105614577565b604051806101200160405280600d5481526020018e8e8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020018a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020018c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200188600281111561220357fe5b815260200187878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020014281526020018381526020013373ffffffffffffffffffffffffffffffffffffffff16815250905080600c6000836000015181526020019081526020016000206000820151816000015560208201518160010190805190602001906122b89291906145e4565b5060408201518160020190805190602001906122d59291906145e4565b5060608201518160030190805190602001906122f29291906145e4565b5060808201518160040160006101000a81548160ff0219169083600281111561231757fe5b021790555060a08201518160050190805190602001906123389291906145e4565b5060c0820151816006015560e082015181600701556101008201518160080160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507feb12470937fad21fd1a370b583eed49055babef791c2a62c0c3bdc0afe7fdc7f816000015182602001518360600151846040015185608001518660a001518760c001518860e001518961010001516040516123fc99989796959493929190615689565b60405180910390a150505050505050505050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124d55780601f106124aa576101008083540402835291602001916124d5565b820191906000526020600020905b8154815290600101906020018083116124b857829003601f168201915b5050505050905090565b60006125a26124ec613626565b8461259d85604051806060016040528060258152602001615a126025913960016000612516613626565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138eb9092919063ffffffff16565b61362e565b6001905092915050565b60006125b6613626565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263c90615572565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146126d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cd90615472565b60405180910390fd5b735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f73ffffffffffffffffffffffffffffffffffffffff1663c9c65396737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561276057600080fd5b505afa158015612774573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612798919061478f565b306040518363ffffffff1660e01b81526004016127b69291906153a1565b602060405180830381600087803b1580156127d057600080fd5b505af11580156127e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612808919061478f565b600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612875600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001610a86565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006128a830610f3f565b905090565b60006128c16128ba613626565b84846137f9565b6001905092915050565b600d5481565b600f81815481106128de57fe5b906000526020600020016000915090505481565b6128fa613626565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298090615572565b60405180910390fd5b80600b8190555050565b61299b614577565b600c6000600e5481526020019081526020016000206040518061012001604052908160008201548152602001600182018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a5f5780601f10612a3457610100808354040283529160200191612a5f565b820191906000526020600020905b815481529060010190602001808311612a4257829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612b015780601f10612ad657610100808354040283529160200191612b01565b820191906000526020600020905b815481529060010190602001808311612ae457829003601f168201915b50505050508152602001600382018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612ba35780601f10612b7857610100808354040283529160200191612ba3565b820191906000526020600020905b815481529060010190602001808311612b8657829003601f168201915b505050505081526020016004820160009054906101000a900460ff166002811115612bca57fe5b6002811115612bd557fe5b8152602001600582018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612c725780601f10612c4757610100808354040283529160200191612c72565b820191906000526020600020905b815481529060010190602001808311612c5557829003601f168201915b5050505050815260200160068201548152602001600782015481526020016008820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525050905090565b612cfb612cf630610f3f565b613bc3565b565b60075481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600c602052806000526040600020600091509050806000015490806001018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612e3c5780601f10612e1157610100808354040283529160200191612e3c565b820191906000526020600020905b815481529060010190602001808311612e1f57829003601f168201915b505050505090806002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612eda5780601f10612eaf57610100808354040283529160200191612eda565b820191906000526020600020905b815481529060010190602001808311612ebd57829003601f168201915b505050505090806003018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612f785780601f10612f4d57610100808354040283529160200191612f78565b820191906000526020600020905b815481529060010190602001808311612f5b57829003601f168201915b5050505050908060040160009054906101000a900460ff1690806005018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130295780601f10612ffe57610100808354040283529160200191613029565b820191906000526020600020905b81548152906001019060200180831161300c57829003601f168201915b5050505050908060060154908060070154908060080160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905089565b61306d613626565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146130fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f390615572565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561316c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316390615492565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60608060108054905067ffffffffffffffff8111801561324b57600080fd5b5060405190808252806020026020018201604052801561328557816020015b613272614577565b81526020019060019003908161326a5790505b50905060008090505b60108054905081101561361e57600c6000601083815481106132ac57fe5b906000526020600020015481526020019081526020016000206040518061012001604052908160008201548152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156133745780601f1061334957610100808354040283529160200191613374565b820191906000526020600020905b81548152906001019060200180831161335757829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156134165780601f106133eb57610100808354040283529160200191613416565b820191906000526020600020905b8154815290600101906020018083116133f957829003601f168201915b50505050508152602001600382018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156134b85780601f1061348d576101008083540402835291602001916134b8565b820191906000526020600020905b81548152906001019060200180831161349b57829003601f168201915b505050505081526020016004820160009054906101000a900460ff1660028111156134df57fe5b60028111156134ea57fe5b8152602001600582018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156135875780601f1061355c57610100808354040283529160200191613587565b820191906000526020600020905b81548152906001019060200180831161356a57829003601f168201915b5050505050815260200160068201548152602001600782015481526020016008820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505082828151811061360657fe5b6020026020010181905250808060010191505061328e565b508091505090565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561369e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613695906155d2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561370e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613705906154b2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516137ec9190615614565b60405180910390a3505050565b60006007541415801561383857503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b801561388e5750600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156138da5760006138aa60075483613eff90919063ffffffff16565b90506138b7843083613f49565b6138d484846138cf84866141de90919063ffffffff16565b613f49565b506138e6565b6138e5838383613f49565b5b505050565b6000838311158290613933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161392a9190615430565b60405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015613991576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613988906154f2565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0290615592565b60405180910390fd5b613a1782600083614228565b613a828160405180606001604052806022815260200161597e602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138eb9092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ad9816002546141de90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613b3d9190615614565b60405180910390a35050565b60008090505b6001828054905003811015613b9f57816001820181548110613b6d57fe5b9060005260206000200154828281548110613b8457fe5b90600052602060002001819055508080600101915050613b4f565b5080805480613baa57fe5b6001900381819060005260206000200160009055905550565b613bcc30610f3f565b811115613c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c0590615552565b60405180910390fd5b6000811415613c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c49906154d2565b60405180910390fd5b6000613c68600283613eff90919063ffffffff16565b90506000613c7f82846141de90919063ffffffff16565b90506000479050613c8f8361422d565b6000613ca482476141de90919063ffffffff16565b9050613cb08382614445565b7f1ac88120e7cb0c1102895c679e94394ce3fb63f5fc8ff9519213798ec483fbc08382604051613ce1929190615732565b60405180910390a16000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613d469190615325565b60206040518083038186803b158015613d5e57600080fd5b505afa158015613d72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d9691906149f5565b9050600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401613e179291906153ca565b602060405180830381600087803b158015613e3157600080fd5b505af1158015613e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e6991906148bb565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633c6b16ab826040518263ffffffff1660e01b8152600401613ec59190615614565b600060405180830381600087803b158015613edf57600080fd5b505af1158015613ef3573d6000803e3d6000fd5b50505050505050505050565b6000613f4183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614516565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fb0906155b2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161402090615452565b60405180910390fd5b614034838383614228565b61409f816040518060600160405280602681526020016159a0602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138eb9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614132816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461394690919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516141d19190615614565b60405180910390a3505050565b600061422083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506138eb565b905092915050565b505050565b6060600267ffffffffffffffff8111801561424757600080fd5b506040519080825280602002602001820160405280156142765781602001602082028036833780820191505090505b509050308160008151811061428757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561431b57600080fd5b505afa15801561432f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614353919061478f565b8160018151811061436057fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506143b930737a250d5630b4cf539739df2c5dacb4c659f2488d8461362e565b737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040161440f95949392919061562f565b600060405180830381600087803b15801561442957600080fd5b505af115801561443d573d6000803e3d6000fd5b505050505050565b61446430737a250d5630b4cf539739df2c5dacb4c659f2488d8461362e565b737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008030426040518863ffffffff1660e01b81526004016144bd96959493929190615340565b6060604051808303818588803b1580156144d657600080fd5b505af11580156144ea573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061450f9190614a1e565b5050505050565b6000808311829061455d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016145549190615430565b60405180910390fd5b50600083858161456957fe5b049050809150509392505050565b60405180610120016040528060008152602001606081526020016060815260200160608152602001600060028111156145ac57fe5b8152602001606081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061462557805160ff1916838001178555614653565b82800160010185558215614653579182015b82811115614652578251825591602001919060010190614637565b5b5090506146609190614664565b5090565b61468691905b8082111561468257600081600090555060010161466a565b5090565b90565b60008135905061469881615928565b92915050565b6000815190506146ad81615928565b92915050565b6000813590506146c28161593f565b92915050565b6000815190506146d78161593f565b92915050565b6000813590506146ec81615956565b92915050565b60008083601f84011261470457600080fd5b8235905067ffffffffffffffff81111561471d57600080fd5b60208301915083600182028301111561473557600080fd5b9250929050565b60008135905061474b81615966565b92915050565b60008151905061476081615966565b92915050565b60006020828403121561477857600080fd5b600061478684828501614689565b91505092915050565b6000602082840312156147a157600080fd5b60006147af8482850161469e565b91505092915050565b600080604083850312156147cb57600080fd5b60006147d985828601614689565b92505060206147ea85828601614689565b9150509250929050565b60008060006060848603121561480957600080fd5b600061481786828701614689565b935050602061482886828701614689565b92505060406148398682870161473c565b9150509250925092565b6000806040838503121561485657600080fd5b600061486485828601614689565b9250506020614875858286016146b3565b9150509250929050565b6000806040838503121561489257600080fd5b60006148a085828601614689565b92505060206148b18582860161473c565b9150509250929050565b6000602082840312156148cd57600080fd5b60006148db848285016146c8565b91505092915050565b600080600080600080600080600060a08a8c03121561490257600080fd5b60008a013567ffffffffffffffff81111561491c57600080fd5b6149288c828d016146f2565b995099505060208a013567ffffffffffffffff81111561494757600080fd5b6149538c828d016146f2565b975097505060408a013567ffffffffffffffff81111561497257600080fd5b61497e8c828d016146f2565b955095505060606149918c828d016146dd565b93505060808a013567ffffffffffffffff8111156149ae57600080fd5b6149ba8c828d016146f2565b92509250509295985092959850929598565b6000602082840312156149de57600080fd5b60006149ec8482850161473c565b91505092915050565b600060208284031215614a0757600080fd5b6000614a1584828501614751565b91505092915050565b600080600060608486031215614a3357600080fd5b6000614a4186828701614751565b9350506020614a5286828701614751565b9250506040614a6386828701614751565b9150509250925092565b6000614a798383614aa8565b60208301905092915050565b6000614a918383615129565b905092915050565b614aa28161587d565b82525050565b614ab181615815565b82525050565b614ac081615815565b82525050565b6000614ad182615796565b614adb81856157d1565b9350614ae683615776565b8060005b83811015614b17578151614afe8882614a6d565b9750614b09836157b7565b925050600181019050614aea565b5085935050505092915050565b6000614b2f826157a1565b614b3981856157e2565b935083602082028501614b4b85615786565b8060005b85811015614b875784840389528151614b688582614a85565b9450614b73836157c4565b925060208a01995050600181019050614b4f565b50829750879550505050505092915050565b614ba281615827565b82525050565b614bb18161588f565b82525050565b614bc08161588f565b82525050565b614bcf816158a1565b82525050565b6000614be0826157ac565b614bea81856157f3565b9350614bfa8185602086016158d7565b614c038161590a565b840191505092915050565b6000614c19826157ac565b614c238185615804565b9350614c338185602086016158d7565b614c3c8161590a565b840191505092915050565b6000614c54602383615804565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614cba601683615804565b91507f4e3357533a207061697220616c726561647920736574000000000000000000006000830152602082019050919050565b6000614cfa602683615804565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d60602283615804565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614dc6604283615804565b91507f45524332305472616e736665724c69717569646974794c6f636b3a3a6c6f636b60008301527f4c69717569646974793a206c6f636b20616d6f756e742063616e6e6f7420626560208301527f20300000000000000000000000000000000000000000000000000000000000006040830152606082019050919050565b6000614e52601b83615804565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614e92602683615804565b91507f4e3357533a206c6971756964697479206c6f636b2064697669736f7220746f6f60008301527f20736d616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ef8601a83615804565b91507f4e3357533a20696e76616c69642061727469636c6520747970650000000000006000830152602082019050919050565b6000614f38605383615804565b91507f45524332305472616e736665724c69717569646974794c6f636b3a3a6c6f636b60008301527f4c69717569646974793a206c6f636b20616d6f756e742068696768657220746860208301527f616e206c6f636b61626c652062616c616e6365000000000000000000000000006040830152606082019050919050565b6000614fc4602083615804565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000615004602183615804565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061506a602583615804565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006150d0602483615804565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006101208301600083015161514260008601826152dd565b506020830151848203602086015261515a8282614bd5565b915050604083015184820360408601526151748282614bd5565b9150506060830151848203606086015261518e8282614bd5565b91505060808301516151a36080860182614ba8565b5060a083015184820360a08601526151bb8282614bd5565b91505060c08301516151d060c08601826152dd565b5060e08301516151e360e08601826152dd565b506101008301516151f8610100860182614aa8565b508091505092915050565b60006101208301600083015161521c60008601826152dd565b50602083015184820360208601526152348282614bd5565b9150506040830151848203604086015261524e8282614bd5565b915050606083015184820360608601526152688282614bd5565b915050608083015161527d6080860182614ba8565b5060a083015184820360a08601526152958282614bd5565b91505060c08301516152aa60c08601826152dd565b5060e08301516152bd60e08601826152dd565b506101008301516152d2610100860182614aa8565b508091505092915050565b6152e681615866565b82525050565b6152f581615866565b82525050565b61530481615870565b82525050565b600060208201905061531f6000830184614ab7565b92915050565b600060208201905061533a6000830184614a99565b92915050565b600060c0820190506153556000830189614a99565b61536260208301886152ec565b61536f6040830187614bc6565b61537c6060830186614bc6565b6153896080830185614a99565b61539660a08301846152ec565b979650505050505050565b60006040820190506153b66000830185614ab7565b6153c36020830184614a99565b9392505050565b60006040820190506153df6000830185614ab7565b6153ec60208301846152ec565b9392505050565b6000602082019050818103600083015261540d8184614b24565b905092915050565b600060208201905061542a6000830184614b99565b92915050565b6000602082019050818103600083015261544a8184614c0e565b905092915050565b6000602082019050818103600083015261546b81614c47565b9050919050565b6000602082019050818103600083015261548b81614cad565b9050919050565b600060208201905081810360008301526154ab81614ced565b9050919050565b600060208201905081810360008301526154cb81614d53565b9050919050565b600060208201905081810360008301526154eb81614db9565b9050919050565b6000602082019050818103600083015261550b81614e45565b9050919050565b6000602082019050818103600083015261552b81614e85565b9050919050565b6000602082019050818103600083015261554b81614eeb565b9050919050565b6000602082019050818103600083015261556b81614f2b565b9050919050565b6000602082019050818103600083015261558b81614fb7565b9050919050565b600060208201905081810360008301526155ab81614ff7565b9050919050565b600060208201905081810360008301526155cb8161505d565b9050919050565b600060208201905081810360008301526155eb816150c3565b9050919050565b6000602082019050818103600083015261560c8184615203565b905092915050565b600060208201905061562960008301846152ec565b92915050565b600060a08201905061564460008301886152ec565b6156516020830187614bc6565b81810360408301526156638186614ac6565b90506156726060830185614a99565b61567f60808301846152ec565b9695505050505050565b60006101208201905061569f600083018c6152ec565b81810360208301526156b1818b614c0e565b905081810360408301526156c5818a614c0e565b905081810360608301526156d98189614c0e565b90506156e86080830188614bb7565b81810360a08301526156fa8187614c0e565b905061570960c08301866152ec565b61571660e08301856152ec565b615724610100830184614ab7565b9a9950505050505050505050565b600060408201905061574760008301856152ec565b61575460208301846152ec565b9392505050565b600060208201905061577060008301846152fb565b92915050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061582082615846565b9050919050565b60008115159050919050565b60008190506158418261591b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615888826158b3565b9050919050565b600061589a82615833565b9050919050565b60006158ac82615866565b9050919050565b60006158be826158c5565b9050919050565b60006158d082615846565b9050919050565b60005b838110156158f55780820151818401526020810190506158da565b83811115615904576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061592557fe5b50565b61593181615815565b811461593c57600080fd5b50565b61594881615827565b811461595357600080fd5b50565b6003811061596357600080fd5b50565b61596f81615866565b811461597a57600080fd5b5056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e67cf5d97fca1210eed918068b3f5b06b26015ec10e64dd1497198dac0cd30fe64736f6c63430006060033

Deployed Bytecode Sourcemap

43693:6839:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;19263:83:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19263:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;21369:169;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21369:169:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;20338:100;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20338:100:0;;;:::i;:::-;;;;;;;;;;;;;;;;22012:321;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22012:321:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;45956:146;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45956:146:0;;;;;;;;;;;;;;;;:::i;:::-;;44518:31;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44518:31:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;20190:83;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20190:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;48341:134;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48341:134:0;;;;;;;;;;;;;;;;:::i;:::-;;44179:51;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44179:51:0;;;:::i;:::-;;;;;;;;;;;;;;;;22742:218;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22742:218:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;44434:31;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44434:31:0;;;:::i;:::-;;;;;;;;;;;;;;;;28462:91;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28462:91:0;;;;;;;;;;;;;;;;:::i;:::-;;30297:28;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30297:28:0;;;:::i;:::-;;;;;;;;;;;;;;;;45441:206;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45441:206:0;;;;;;;;;;;;;;;;:::i;:::-;;30334:28;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30334:28:0;;;:::i;:::-;;;;;;;;;;;;;;;;45655:293;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45655:293:0;;;;;;;;;;;;;;;;:::i;:::-;;20501:119;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20501:119:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2621:148;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2621:148:0;;;:::i;:::-;;28872:295;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28872:295:0;;;;;;;;;;;;;;;;:::i;:::-;;48738:350;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48738:350:0;;;:::i;:::-;;;;;;;;;;;;;;;;46114:2219;;5:9:-1;2:2;;;27:1;24;17:12;2:2;46114:2219:0;;;;;;;;;;;;;;;;:::i;:::-;;1979:79;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1979:79:0;;;:::i;:::-;;;;;;;;;;;;;;;;19465:87;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19465:87:0;;;:::i;:::-;;;;;;;;;;;;;;;;23463:269;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23463:269:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;45011:422;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45011:422:0;;;:::i;:::-;;;;;;;;;;;;;;;;33008:108;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33008:108:0;;;:::i;:::-;;;;;;;;;;;;;;;;20833:175;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20833:175:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;44397:28;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44397:28:0;;;:::i;:::-;;;;;;;;;;;;;;;;44474:35;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44474:35:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;48483:118;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48483:118:0;;;;;;;;;;;;;;;;:::i;:::-;;48609:121;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48609:121:0;;;:::i;:::-;;;;;;;;;;;;;;;;30598:149;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30598:149:0;;;:::i;:::-;;30479:35;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30479:35:0;;;:::i;:::-;;;;;;;;;;;;;;;;21071:151;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21071:151:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;44340:48;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44340:48:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;2924:244;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2924:244:0;;;;;;;;;;;;;;;;:::i;:::-;;49096:322;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49096:322:0;;;:::i;:::-;;;;;;;;;;;;;;;;19263:83;19300:13;19333:5;19326:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19263:83;:::o;21369:169::-;21452:4;21469:39;21478:12;:10;:12::i;:::-;21492:7;21501:6;21469:8;:39::i;:::-;21526:4;21519:11;;21369:169;;;;:::o;20338:100::-;20391:7;20418:12;;20411:19;;20338:100;:::o;22012:321::-;22118:4;22135:36;22145:6;22153:9;22164:6;22135:9;:36::i;:::-;22182:121;22191:6;22199:12;:10;:12::i;:::-;22213:89;22251:6;22213:89;;;;;;;;;;;;;;;;;:11;:19;22225:6;22213:19;;;;;;;;;;;;;;;:33;22233:12;:10;:12::i;:::-;22213:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;22182:8;:121::i;:::-;22321:4;22314:11;;22012:321;;;;;:::o;45956:146::-;2201:12;:10;:12::i;:::-;2191:22;;:6;;;;;;;;;;;:22;;;2183:67;;;;;;;;;;;;;;;;;;;;;;46082:12:::1;46051:18;:28;46070:8;46051:28;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;45956:146:::0;;:::o;44518:31::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20190:83::-;20231:5;20256:9;;;;;;;;;;;20249:16;;20190:83;:::o;48341:134::-;2201:12;:10;:12::i;:::-;2191:22;;:6;;;;;;;;;;;:22;;;2183:67;;;;;;;;;;;;;;;;;;;;;;48449:18:::1;48429:17;:38;;;;48341:134:::0;:::o;44179:51::-;44223:7;44179:51;:::o;22742:218::-;22830:4;22847:83;22856:12;:10;:12::i;:::-;22870:7;22879:50;22918:10;22879:11;:25;22891:12;:10;:12::i;:::-;22879:25;;;;;;;;;;;;;;;:34;22905:7;22879:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;22847:8;:83::i;:::-;22948:4;22941:11;;22742:218;;;;:::o;44434:31::-;;;;:::o;28462:91::-;28518:27;28524:12;:10;:12::i;:::-;28538:6;28518:5;:27::i;:::-;28462:91;:::o;30297:28::-;;;;;;;;;;;;;:::o;45441:206::-;2201:12;:10;:12::i;:::-;2191:22;;:6;;;;;;;;;;;:22;;;2183:67;;;;;;;;;;;;;;;;;;;;;;45624:15:::1;45608:13;;:31;;;;;;;;;;;;;;;;;;45441:206:::0;:::o;30334:28::-;;;;;;;;;;;;;:::o;45655:293::-;2201:12;:10;:12::i;:::-;2191:22;;:6;;;;;;;;;;;:22;;;2183:67;;;;;;;;;;;;;;;;;;;;;;45778:1:::1;45753:21;:26;45749:137;;45829:2;45804:21;:27;;45796:78;;;;;;;;;;;;;;;;;;;;;;45749:137;45919:21;45896:20;:44;;;;45655:293:::0;:::o;20501:119::-;20567:7;20594:9;:18;20604:7;20594:18;;;;;;;;;;;;;;;;20587:25;;20501:119;;;:::o;2621:148::-;2201:12;:10;:12::i;:::-;2191:22;;:6;;;;;;;;;;;:22;;;2183:67;;;;;;;;;;;;;;;;;;;;;;2728:1:::1;2691:40;;2712:6;;;;;;;;;;;2691:40;;;;;;;;;;;;2759:1;2742:6;;:19;;;;;;;;;;;;;;;;;;2621:148::o:0;28872:295::-;28949:26;28978:84;29015:6;28978:84;;;;;;;;;;;;;;;;;:32;28988:7;28997:12;:10;:12::i;:::-;28978:9;:32::i;:::-;:36;;:84;;;;;:::i;:::-;28949:113;;29075:51;29084:7;29093:12;:10;:12::i;:::-;29107:18;29075:8;:51::i;:::-;29137:22;29143:7;29152:6;29137:5;:22::i;:::-;28872:295;;;:::o;48738:350::-;48789:20;48822:35;48878:18;:25;;;;48860:44;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48860:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;48822:82;;48920:9;48932:1;48920:13;;48915:134;48939:18;:25;;;;48935:1;:29;48915:134;;;49006:8;:31;49015:18;49034:1;49015:21;;;;;;;;;;;;;;;;49006:31;;;;;;;;;;;48986:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:14;49001:1;48986:17;;;;;;;;;;;;;:51;;;;48966:3;;;;;;;48915:134;;;;49066:14;49059:21;;;48738:350;:::o;46114:2219::-;46294:20;46319:13;;46317:15;;;;;;;;;;46294:38;;46345:29;;:::i;:::-;46405:17;46389:33;;;;;;;;:12;:33;;;;;;;;;46385:962;;;46452:8;:26;46461:16;;46452:26;;;;;;;;;;;46439:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46512:12;46493:16;:31;;;;46385:962;;;46562:18;46546:34;;;;;;;;:12;:34;;;;;;;;;46542:805;;;46629:1;46601:18;:25;;;;:29;46597:261;;;46684:17;;46655:18;:25;;;;:46;46651:192;;;46739:8;:31;46748:18;46767:1;46748:21;;;;;;;;;;;;;;;;46739:31;;;;;;;;;;;46726:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46793:30;46804:18;46793:10;:30::i;:::-;46651:192;46597:261;46872:18;46896:12;46872:37;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;46872:37:0;;;;;;;;;;;;;;;;;;;46542:805;;;46947:14;46931:30;;;;;;;;:12;:30;;;;;;;;;46927:420;;;47006:1;46982:14;:21;;;;:25;46978:241;;;47057:13;;47032:14;:21;;;;:38;47028:176;;;47108:8;:27;47117:14;47132:1;47117:17;;;;;;;;;;;;;;;;47108:27;;;;;;;;;;;47095:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47158:26;47169:14;47158:10;:26::i;:::-;47028:176;46978:241;47233:14;47253:12;47233:33;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;47233:33:0;;;;;;;;;;;;;;;;;;;46927:420;;;47299:36;;;;;;;;;;;;;;;;;;;46927:420;46542:805;46385:962;47359:20;44223:7;47359:40;;47433:1;47414:10;:16;;;:20;47410:210;;;47466:10;:16;;;47451:31;;47548:7;47530:15;:25;47501:10;:26;;;:54;47497:112;;;47592:1;47576:17;;;;47497:112;47410:210;47632:37;47644:10;47656:12;47632:11;:37::i;:::-;47690:29;;:::i;:::-;47722:331;;;;;;;;47753:13;;47722:331;;;;47788:6;;47722:331;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;47722:331:0;;;;;;;;;;47845:9;;47722:331;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;47722:331:0;;;;;;;;;;47815:5;;47722:331;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;47722:331:0;;;;;;;;;;47882:12;47722:331;;;;;;;;;;;;47919:9;;47722:331;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;47722:331:0;;;;;;;;;;47960:15;47722:331;;;;47997:12;47722:331;;;;48031:10;47722:331;;;;;47690:363;;48090:10;48064:8;:23;48073:10;:13;;;48064:23;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48118:207;48132:10;:13;;;48147:10;:16;;;48165:10;:15;;;48182:10;:19;;;48217:10;:22;;;48241:10;:19;;;48262:10;:26;;;48290:10;:16;;;48308:10;:16;;;48118:207;;;;;;;;;;;;;;;;;;;;;;;46114:2219;;;;;;;;;;;;;:::o;1979:79::-;2017:7;2044:6;;;;;;;;;;;2037:13;;1979:79;:::o;19465:87::-;19504:13;19537:7;19530:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19465:87;:::o;23463:269::-;23556:4;23573:129;23582:12;:10;:12::i;:::-;23596:7;23605:96;23644:15;23605:96;;;;;;;;;;;;;;;;;:11;:25;23617:12;:10;:12::i;:::-;23605:25;;;;;;;;;;;;;;;:34;23631:7;23605:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;23573:8;:129::i;:::-;23720:4;23713:11;;23463:269;;;;:::o;45011:422::-;45067:7;2201:12;:10;:12::i;:::-;2191:22;;:6;;;;;;;;;;;:22;;;2183:67;;;;;;;;;;;;;;;;;;;;;;45120:1:::1;45095:27;;:13;;;;;;;;;;;:27;;;45087:62;;;;;;;;;;;;;;;;;;;;;;30247:42;45176:53;;;30146:42;45244:49;;;:51;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;45244:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;45244:51:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;45244:51:0;;;;;;;;;45318:4;45176:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;45176:158:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;45176:158:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;45176:158:0;;;;;;;;;45160:13;;:174;;;;;;;;;;;;;;;;;;45353:41;45374:13;;;;;;;;;;;45389:4;45353:20;:41::i;:::-;45412:13;;;;;;;;;;;45405:20;;45011:422:::0;:::o;33008:108::-;33057:7;33084:24;33102:4;33084:9;:24::i;:::-;33077:31;;33008:108;:::o;20833:175::-;20919:4;20936:42;20946:12;:10;:12::i;:::-;20960:9;20971:6;20936:9;:42::i;:::-;20996:4;20989:11;;20833:175;;;;:::o;44397:28::-;;;;:::o;44474:35::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48483:118::-;2201:12;:10;:12::i;:::-;2191:22;;:6;;;;;;;;;;;:22;;;2183:67;;;;;;;;;;;;;;;;;;;;;;48579:14:::1;48563:13;:30;;;;48483:118:::0;:::o;48609:121::-;48658:18;;:::i;:::-;48696:8;:26;48705:16;;48696:26;;;;;;;;;;;48689:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48609:121;:::o;30598:149::-;30699:40;30714:24;30732:4;30714:9;:24::i;:::-;30699:14;:40::i;:::-;30598:149::o;30479:35::-;;;;:::o;21071:151::-;21160:7;21187:11;:18;21199:5;21187:18;;;;;;;;;;;;;;;:27;21206:7;21187:27;;;;;;;;;;;;;;;;21180:34;;21071:151;;;;:::o;44340:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2924:244::-;2201:12;:10;:12::i;:::-;2191:22;;:6;;;;;;;;;;;:22;;;2183:67;;;;;;;;;;;;;;;;;;;;;;3033:1:::1;3013:22;;:8;:22;;;;3005:73;;;;;;;;;;;;;;;;;;;;;;3123:8;3094:38;;3115:6;;;;;;;;;;;3094:38;;;;;;;;;;;;3152:8;3143:6;;:17;;;;;;;;;;;;;;;;;;2924:244:::0;:::o;49096:322::-;49143:20;49176:31;49228:14;:21;;;;49210:40;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49210:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;49176:74;;49266:9;49278:1;49266:13;;49261:122;49285:14;:21;;;;49281:1;:25;49261:122;;;49344:8;:27;49353:14;49368:1;49353:17;;;;;;;;;;;;;;;;49344:27;;;;;;;;;;;49328:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:10;49339:1;49328:13;;;;;;;;;;;;;:43;;;;49308:3;;;;;;;49261:122;;;;49400:10;49393:17;;;49096:322;:::o;612:106::-;665:15;700:10;693:17;;612:106;:::o;26608:346::-;26727:1;26710:19;;:5;:19;;;;26702:68;;;;;;;;;;;;;;;;;;;;;;26808:1;26789:21;;:7;:21;;;;26781:68;;;;;;;;;;;;;;;;;;;;;;26892:6;26862:11;:18;26874:5;26862:18;;;;;;;;;;;;;;;:27;26881:7;26862:27;;;;;;;;;;;;;;;:36;;;;26930:7;26914:32;;26923:5;26914:32;;;26939:6;26914:32;;;;;;;;;;;;;;;26608:346;;;:::o;49426:491::-;49544:1;49520:20;;:25;;:50;;;;;49565:4;49549:21;;:4;:21;;;;49520:50;:79;;;;;49575:18;:24;49594:4;49575:24;;;;;;;;;;;;;;;;;;;;;;;;;49574:25;49520:79;49516:394;;;49616:27;49646:32;49657:20;;49646:6;:10;;:32;;;;:::i;:::-;49616:62;;49693:57;49709:4;49723;49730:19;49693:15;:57::i;:::-;49765:58;49781:4;49787:2;49791:31;49802:19;49791:6;:10;;:31;;;;:::i;:::-;49765:15;:58::i;:::-;49516:394;;;;49865:33;49881:4;49887:2;49891:6;49865:15;:33::i;:::-;49516:394;49426:491;;;:::o;7641:192::-;7727:7;7760:1;7755;:6;;7763:12;7747:29;;;;;;;;;;;;;;;;;;;;;;;;;7787:9;7803:1;7799;:5;7787:17;;7824:1;7817:8;;;7641:192;;;;;:::o;6738:181::-;6796:7;6816:9;6832:1;6828;:5;6816:17;;6857:1;6852;:6;;6844:46;;;;;;;;;;;;;;;;;;;;;;6910:1;6903:8;;;6738:181;;;;:::o;25752:418::-;25855:1;25836:21;;:7;:21;;;;25828:67;;;;;;;;;;;;;;;;;;;;;;25908:49;25929:7;25946:1;25950:6;25908:20;:49::i;:::-;25991:68;26014:6;25991:68;;;;;;;;;;;;;;;;;:9;:18;26001:7;25991:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;25970:9;:18;25980:7;25970:18;;;;;;;;;;;;;;;:89;;;;26085:24;26102:6;26085:12;;:16;;:24;;;;:::i;:::-;26070:12;:39;;;;26151:1;26125:37;;26134:7;26125:37;;;26155:6;26125:37;;;;;;;;;;;;;;;25752:418;;:::o;50282:247::-;50350:9;50362:1;50350:13;;50345:91;50382:1;50369:3;:10;;;;:14;50365:1;:18;50345:91;;;50414:3;50422:1;50418;:5;50414:10;;;;;;;;;;;;;;;;50405:3;50409:1;50405:6;;;;;;;;;;;;;;;:19;;;;50385:3;;;;;;;50345:91;;;;50512:3;:9;;;;;;;;;;;;;;;;;;;;;;;;50282:247;:::o;30755:1196::-;30917:24;30935:4;30917:9;:24::i;:::-;30898:15;:43;;30890:139;;;;;;;;;;;;;;;;;;;;;;31067:1;31048:15;:20;;31040:99;;;;;;;;;;;;;;;;;;;;;;31152:26;31181:22;31201:1;31181:15;:19;;:22;;;;:::i;:::-;31152:51;;31214:28;31245:39;31265:18;31245:15;:19;;:39;;;;:::i;:::-;31214:70;;31350:28;31381:21;31350:52;;31413:37;31431:18;31413:17;:37::i;:::-;31461:19;31483:47;31509:20;31483:21;:25;;:47;;;;:::i;:::-;31461:69;;31543:48;31557:20;31579:11;31543:13;:48::i;:::-;31607;31621:20;31643:11;31607:48;;;;;;;;;;;;;;;;31668:34;31711:13;;;;;;;;;;;31705:30;;;31744:4;31705:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31705:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31705:45:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;31705:45:0;;;;;;;;;31668:82;;31767:13;;;;;;;;;;;31761:29;;;31799:13;;;;;;;;;;;31815:26;31761:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31761:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31761:81:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;31761:81:0;;;;;;;;;;31882:13;;;;;;;;;;;31853:62;;;31916:26;31853:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31853:90:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31853:90:0;;;;30755:1196;;;;;;:::o;9039:132::-;9097:7;9124:39;9128:1;9131;9124:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;9117:46;;9039:132;;;;:::o;24222:539::-;24346:1;24328:20;;:6;:20;;;;24320:70;;;;;;;;;;;;;;;;;;;;;;24430:1;24409:23;;:9;:23;;;;24401:71;;;;;;;;;;;;;;;;;;;;;;24485:47;24506:6;24514:9;24525:6;24485:20;:47::i;:::-;24565:71;24587:6;24565:71;;;;;;;;;;;;;;;;;:9;:17;24575:6;24565:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;24545:9;:17;24555:6;24545:17;;;;;;;;;;;;;;;:91;;;;24670:32;24695:6;24670:9;:20;24680:9;24670:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;24647:9;:20;24657:9;24647:20;;;;;;;;;;;;;;;:55;;;;24735:9;24718:35;;24727:6;24718:35;;;24746:6;24718:35;;;;;;;;;;;;;;;24222:539;;;:::o;7202:136::-;7260:7;7287:43;7291:1;7294;7287:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;7280:50;;7202:136;;;;:::o;27979:92::-;;;;:::o;31963:590::-;32031:32;32080:1;32066:16;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32066:16:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;156:4;148:6;144:17;134:27;;0:165;32066:16:0;;;;32031:51;;32122:4;32093:15;32109:1;32093:18;;;;;;;;;;;;;:34;;;;;;;;;;;30146:42;32159:40;;;:42;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32159:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32159:42:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;32159:42:0;;;;;;;;;32138:15;32154:1;32138:18;;;;;;;;;;;;;:63;;;;;;;;;;;32214:53;32231:4;30146:42;32255:11;32214:8;:53::i;:::-;30146:42;32280:100;;;32399:11;32429:1;32449:15;32491:4;32515:15;32280:265;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32280:265:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32280:265:0;;;;31963:590;;:::o;32561:439::-;32644:53;32661:4;30146:42;32685:11;32644:8;:53::i;:::-;30146:42;32710:65;;;32784:9;32836:4;32860:11;32890:1;32910;32938:4;32962:15;32710:282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32710:282:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32710:282:0;;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;32710:282:0;;;;;;;;;;;;32561:439;;:::o;9667:278::-;9753:7;9785:1;9781;:5;9788:12;9773:28;;;;;;;;;;;;;;;;;;;;;;;;;9812:9;9828:1;9824;:5;;;;;;9812:17;;9936:1;9929:8;;;9667:278;;;;;:::o;43693:6839::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;142:134;;226:6;220:13;211:22;;238:33;265:5;238:33;;;205:71;;;;;283:124;;360:6;347:20;338:29;;372:30;396:5;372:30;;;332:75;;;;;414:128;;495:6;489:13;480:22;;507:30;531:5;507:30;;;474:68;;;;;549:162;;645:6;632:20;623:29;;657:49;700:5;657:49;;;617:94;;;;;733:337;;;848:3;841:4;833:6;829:17;825:27;815:2;;866:1;863;856:12;815:2;899:6;886:20;876:30;;926:18;918:6;915:30;912:2;;;958:1;955;948:12;912:2;992:4;984:6;980:17;968:29;;1043:3;1035:4;1027:6;1023:17;1013:8;1009:32;1006:41;1003:2;;;1060:1;1057;1050:12;1003:2;808:262;;;;;;1078:130;;1158:6;1145:20;1136:29;;1170:33;1197:5;1170:33;;;1130:78;;;;;1215:134;;1299:6;1293:13;1284:22;;1311:33;1338:5;1311:33;;;1278:71;;;;;1356:241;;1460:2;1448:9;1439:7;1435:23;1431:32;1428:2;;;1476:1;1473;1466:12;1428:2;1511:1;1528:53;1573:7;1564:6;1553:9;1549:22;1528:53;;;1518:63;;1490:97;1422:175;;;;;1604:263;;1719:2;1707:9;1698:7;1694:23;1690:32;1687:2;;;1735:1;1732;1725:12;1687:2;1770:1;1787:64;1843:7;1834:6;1823:9;1819:22;1787:64;;;1777:74;;1749:108;1681:186;;;;;1874:366;;;1995:2;1983:9;1974:7;1970:23;1966:32;1963:2;;;2011:1;2008;2001:12;1963:2;2046:1;2063:53;2108:7;2099:6;2088:9;2084:22;2063:53;;;2053:63;;2025:97;2153:2;2171:53;2216:7;2207:6;2196:9;2192:22;2171:53;;;2161:63;;2132:98;1957:283;;;;;;2247:491;;;;2385:2;2373:9;2364:7;2360:23;2356:32;2353:2;;;2401:1;2398;2391:12;2353:2;2436:1;2453:53;2498:7;2489:6;2478:9;2474:22;2453:53;;;2443:63;;2415:97;2543:2;2561:53;2606:7;2597:6;2586:9;2582:22;2561:53;;;2551:63;;2522:98;2651:2;2669:53;2714:7;2705:6;2694:9;2690:22;2669:53;;;2659:63;;2630:98;2347:391;;;;;;2745:360;;;2863:2;2851:9;2842:7;2838:23;2834:32;2831:2;;;2879:1;2876;2869:12;2831:2;2914:1;2931:53;2976:7;2967:6;2956:9;2952:22;2931:53;;;2921:63;;2893:97;3021:2;3039:50;3081:7;3072:6;3061:9;3057:22;3039:50;;;3029:60;;3000:95;2825:280;;;;;;3112:366;;;3233:2;3221:9;3212:7;3208:23;3204:32;3201:2;;;3249:1;3246;3239:12;3201:2;3284:1;3301:53;3346:7;3337:6;3326:9;3322:22;3301:53;;;3291:63;;3263:97;3391:2;3409:53;3454:7;3445:6;3434:9;3430:22;3409:53;;;3399:63;;3370:98;3195:283;;;;;;3485:257;;3597:2;3585:9;3576:7;3572:23;3568:32;3565:2;;;3613:1;3610;3603:12;3565:2;3648:1;3665:61;3718:7;3709:6;3698:9;3694:22;3665:61;;;3655:71;;3627:105;3559:183;;;;;3749:1279;;;;;;;;;;4017:3;4005:9;3996:7;3992:23;3988:33;3985:2;;;4034:1;4031;4024:12;3985:2;4097:1;4086:9;4082:17;4069:31;4120:18;4112:6;4109:30;4106:2;;;4152:1;4149;4142:12;4106:2;4180:65;4237:7;4228:6;4217:9;4213:22;4180:65;;;4170:75;;;;4048:203;4310:2;4299:9;4295:18;4282:32;4334:18;4326:6;4323:30;4320:2;;;4366:1;4363;4356:12;4320:2;4394:65;4451:7;4442:6;4431:9;4427:22;4394:65;;;4384:75;;;;4261:204;4524:2;4513:9;4509:18;4496:32;4548:18;4540:6;4537:30;4534:2;;;4580:1;4577;4570:12;4534:2;4608:65;4665:7;4656:6;4645:9;4641:22;4608:65;;;4598:75;;;;4475:204;4710:2;4728:69;4789:7;4780:6;4769:9;4765:22;4728:69;;;4718:79;;4689:114;4862:3;4851:9;4847:19;4834:33;4887:18;4879:6;4876:30;4873:2;;;4919:1;4916;4909:12;4873:2;4947:65;5004:7;4995:6;4984:9;4980:22;4947:65;;;4937:75;;;;4813:205;3979:1049;;;;;;;;;;;;5035:241;;5139:2;5127:9;5118:7;5114:23;5110:32;5107:2;;;5155:1;5152;5145:12;5107:2;5190:1;5207:53;5252:7;5243:6;5232:9;5228:22;5207:53;;;5197:63;;5169:97;5101:175;;;;;5283:263;;5398:2;5386:9;5377:7;5373:23;5369:32;5366:2;;;5414:1;5411;5404:12;5366:2;5449:1;5466:64;5522:7;5513:6;5502:9;5498:22;5466:64;;;5456:74;;5428:108;5360:186;;;;;5553:535;;;;5702:2;5690:9;5681:7;5677:23;5673:32;5670:2;;;5718:1;5715;5708:12;5670:2;5753:1;5770:64;5826:7;5817:6;5806:9;5802:22;5770:64;;;5760:74;;5732:108;5871:2;5889:64;5945:7;5936:6;5925:9;5921:22;5889:64;;;5879:74;;5850:109;5990:2;6008:64;6064:7;6055:6;6044:9;6040:22;6008:64;;;5998:74;;5969:109;5664:424;;;;;;6096:173;;6183:46;6225:3;6217:6;6183:46;;;6258:4;6253:3;6249:14;6235:28;;6176:93;;;;;6278:269;;6437:104;6537:3;6529:6;6437:104;;;6423:118;;6416:131;;;;;6555:142;6646:45;6685:5;6646:45;;;6641:3;6634:58;6628:69;;;6704:103;6777:24;6795:5;6777:24;;;6772:3;6765:37;6759:48;;;6814:113;6897:24;6915:5;6897:24;;;6892:3;6885:37;6879:48;;;6965:690;;7110:54;7158:5;7110:54;;;7177:86;7256:6;7251:3;7177:86;;;7170:93;;7284:56;7334:5;7284:56;;;7360:7;7388:1;7373:260;7398:6;7395:1;7392:13;7373:260;;;7465:6;7459:13;7486:63;7545:3;7530:13;7486:63;;;7479:70;;7566:60;7619:6;7566:60;;;7556:70;;7430:203;7420:1;7417;7413:9;7408:14;;7373:260;;;7377:14;7646:3;7639:10;;7089:566;;;;;;;;7726:1080;;7929:83;8006:5;7929:83;;;8025:115;8133:6;8128:3;8025:115;;;8018:122;;8163:3;8205:4;8197:6;8193:17;8188:3;8184:27;8232:85;8311:5;8232:85;;;8337:7;8365:1;8350:417;8375:6;8372:1;8369:13;8350:417;;;8437:9;8431:4;8427:20;8422:3;8415:33;8482:6;8476:13;8504:122;8621:4;8606:13;8504:122;;;8496:130;;8643:89;8725:6;8643:89;;;8633:99;;8755:4;8750:3;8746:14;8739:21;;8407:360;8397:1;8394;8390:9;8385:14;;8350:417;;;8354:14;8780:4;8773:11;;8797:3;8790:10;;7908:898;;;;;;;;;;8814:104;8891:21;8906:5;8891:21;;;8886:3;8879:34;8873:45;;;8925:144;9012:51;9057:5;9012:51;;;9007:3;9000:64;8994:75;;;9076:154;9173:51;9218:5;9173:51;;;9168:3;9161:64;9155:75;;;9237:142;9328:45;9367:5;9328:45;;;9323:3;9316:58;9310:69;;;9386:327;;9488:39;9521:5;9488:39;;;9539:61;9593:6;9588:3;9539:61;;;9532:68;;9605:52;9650:6;9645:3;9638:4;9631:5;9627:16;9605:52;;;9678:29;9700:6;9678:29;;;9673:3;9669:39;9662:46;;9468:245;;;;;;9720:347;;9832:39;9865:5;9832:39;;;9883:71;9947:6;9942:3;9883:71;;;9876:78;;9959:52;10004:6;9999:3;9992:4;9985:5;9981:16;9959:52;;;10032:29;10054:6;10032:29;;;10027:3;10023:39;10016:46;;9812:255;;;;;;10075:372;;10235:67;10299:2;10294:3;10235:67;;;10228:74;;10335:34;10331:1;10326:3;10322:11;10315:55;10404:5;10399:2;10394:3;10390:12;10383:27;10438:2;10433:3;10429:12;10422:19;;10221:226;;;;10456:322;;10616:67;10680:2;10675:3;10616:67;;;10609:74;;10716:24;10712:1;10707:3;10703:11;10696:45;10769:2;10764:3;10760:12;10753:19;;10602:176;;;;10787:375;;10947:67;11011:2;11006:3;10947:67;;;10940:74;;11047:34;11043:1;11038:3;11034:11;11027:55;11116:8;11111:2;11106:3;11102:12;11095:30;11153:2;11148:3;11144:12;11137:19;;10933:229;;;;11171:371;;11331:67;11395:2;11390:3;11331:67;;;11324:74;;11431:34;11427:1;11422:3;11418:11;11411:55;11500:4;11495:2;11490:3;11486:12;11479:26;11533:2;11528:3;11524:12;11517:19;;11317:225;;;;11551:440;;11711:67;11775:2;11770:3;11711:67;;;11704:74;;11811:34;11807:1;11802:3;11798:11;11791:55;11880:34;11875:2;11870:3;11866:12;11859:56;11949:4;11944:2;11939:3;11935:12;11928:26;11982:2;11977:3;11973:12;11966:19;;11697:294;;;;12000:327;;12160:67;12224:2;12219:3;12160:67;;;12153:74;;12260:29;12256:1;12251:3;12247:11;12240:50;12318:2;12313:3;12309:12;12302:19;;12146:181;;;;12336:375;;12496:67;12560:2;12555:3;12496:67;;;12489:74;;12596:34;12592:1;12587:3;12583:11;12576:55;12665:8;12660:2;12655:3;12651:12;12644:30;12702:2;12697:3;12693:12;12686:19;;12482:229;;;;12720:326;;12880:67;12944:2;12939:3;12880:67;;;12873:74;;12980:28;12976:1;12971:3;12967:11;12960:49;13037:2;13032:3;13028:12;13021:19;;12866:180;;;;13055:457;;13215:67;13279:2;13274:3;13215:67;;;13208:74;;13315:34;13311:1;13306:3;13302:11;13295:55;13384:34;13379:2;13374:3;13370:12;13363:56;13453:21;13448:2;13443:3;13439:12;13432:43;13503:2;13498:3;13494:12;13487:19;;13201:311;;;;13521:332;;13681:67;13745:2;13740:3;13681:67;;;13674:74;;13781:34;13777:1;13772:3;13768:11;13761:55;13844:2;13839:3;13835:12;13828:19;;13667:186;;;;13862:370;;14022:67;14086:2;14081:3;14022:67;;;14015:74;;14122:34;14118:1;14113:3;14109:11;14102:55;14191:3;14186:2;14181:3;14177:12;14170:25;14223:2;14218:3;14214:12;14207:19;;14008:224;;;;14241:374;;14401:67;14465:2;14460:3;14401:67;;;14394:74;;14501:34;14497:1;14492:3;14488:11;14481:55;14570:7;14565:2;14560:3;14556:12;14549:29;14606:2;14601:3;14597:12;14590:19;;14387:228;;;;14624:373;;14784:67;14848:2;14843:3;14784:67;;;14777:74;;14884:34;14880:1;14875:3;14871:11;14864:55;14953:6;14948:2;14943:3;14939:12;14932:28;14988:2;14983:3;14979:12;14972:19;;14770:227;;;;15062:1922;;15211:6;15206:3;15202:16;15294:4;15287:5;15283:16;15277:23;15306:63;15363:4;15358:3;15354:14;15340:12;15306:63;;;15233:142;15449:4;15442:5;15438:16;15432:23;15501:3;15495:4;15491:14;15484:4;15479:3;15475:14;15468:38;15521:73;15589:4;15575:12;15521:73;;;15513:81;;15385:221;15683:4;15676:5;15672:16;15666:23;15735:3;15729:4;15725:14;15718:4;15713:3;15709:14;15702:38;15755:73;15823:4;15809:12;15755:73;;;15747:81;;15616:224;15913:4;15906:5;15902:16;15896:23;15965:3;15959:4;15955:14;15948:4;15943:3;15939:14;15932:38;15985:73;16053:4;16039:12;15985:73;;;15977:81;;15850:220;16150:4;16143:5;16139:16;16133:23;16162:77;16233:4;16228:3;16224:14;16210:12;16162:77;;;16080:165;16322:4;16315:5;16311:16;16305:23;16374:3;16368:4;16364:14;16357:4;16352:3;16348:14;16341:38;16394:73;16462:4;16448:12;16394:73;;;16386:81;;16255:224;16563:4;16556:5;16552:16;16546:23;16575:63;16632:4;16627:3;16623:14;16609:12;16575:63;;;16489:155;16718:4;16711:5;16707:16;16701:23;16730:63;16787:4;16782:3;16778:14;16764:12;16730:63;;;16654:145;16873:6;16866:5;16862:18;16856:25;16887:65;16944:6;16939:3;16935:16;16921:12;16887:65;;;16809:149;16975:4;16968:11;;15184:1800;;;;;;17048:1932;;17207:6;17202:3;17198:16;17290:4;17283:5;17279:16;17273:23;17302:63;17359:4;17354:3;17350:14;17336:12;17302:63;;;17229:142;17445:4;17438:5;17434:16;17428:23;17497:3;17491:4;17487:14;17480:4;17475:3;17471:14;17464:38;17517:73;17585:4;17571:12;17517:73;;;17509:81;;17381:221;17679:4;17672:5;17668:16;17662:23;17731:3;17725:4;17721:14;17714:4;17709:3;17705:14;17698:38;17751:73;17819:4;17805:12;17751:73;;;17743:81;;17612:224;17909:4;17902:5;17898:16;17892:23;17961:3;17955:4;17951:14;17944:4;17939:3;17935:14;17928:38;17981:73;18049:4;18035:12;17981:73;;;17973:81;;17846:220;18146:4;18139:5;18135:16;18129:23;18158:77;18229:4;18224:3;18220:14;18206:12;18158:77;;;18076:165;18318:4;18311:5;18307:16;18301:23;18370:3;18364:4;18360:14;18353:4;18348:3;18344:14;18337:38;18390:73;18458:4;18444:12;18390:73;;;18382:81;;18251:224;18559:4;18552:5;18548:16;18542:23;18571:63;18628:4;18623:3;18619:14;18605:12;18571:63;;;18485:155;18714:4;18707:5;18703:16;18697:23;18726:63;18783:4;18778:3;18774:14;18760:12;18726:63;;;18650:145;18869:6;18862:5;18858:18;18852:25;18883:65;18940:6;18935:3;18931:16;18917:12;18883:65;;;18805:149;18971:4;18964:11;;17180:1800;;;;;;18987:103;19060:24;19078:5;19060:24;;;19055:3;19048:37;19042:48;;;19097:113;19180:24;19198:5;19180:24;;;19175:3;19168:37;19162:48;;;19217:107;19296:22;19312:5;19296:22;;;19291:3;19284:35;19278:46;;;19331:213;;19449:2;19438:9;19434:18;19426:26;;19463:71;19531:1;19520:9;19516:17;19507:6;19463:71;;;19420:124;;;;;19551:229;;19677:2;19666:9;19662:18;19654:26;;19691:79;19767:1;19756:9;19752:17;19743:6;19691:79;;;19648:132;;;;;19787:835;;20077:3;20066:9;20062:19;20054:27;;20092:79;20168:1;20157:9;20153:17;20144:6;20092:79;;;20182:72;20250:2;20239:9;20235:18;20226:6;20182:72;;;20265:80;20341:2;20330:9;20326:18;20317:6;20265:80;;;20356;20432:2;20421:9;20417:18;20408:6;20356:80;;;20447:81;20523:3;20512:9;20508:19;20499:6;20447:81;;;20539:73;20607:3;20596:9;20592:19;20583:6;20539:73;;;20048:574;;;;;;;;;;20629:340;;20783:2;20772:9;20768:18;20760:26;;20797:71;20865:1;20854:9;20850:17;20841:6;20797:71;;;20879:80;20955:2;20944:9;20940:18;20931:6;20879:80;;;20754:215;;;;;;20976:324;;21122:2;21111:9;21107:18;21099:26;;21136:71;21204:1;21193:9;21189:17;21180:6;21136:71;;;21218:72;21286:2;21275:9;21271:18;21262:6;21218:72;;;21093:207;;;;;;21307:477;;21533:2;21522:9;21518:18;21510:26;;21583:9;21577:4;21573:20;21569:1;21558:9;21554:17;21547:47;21608:166;21769:4;21760:6;21608:166;;;21600:174;;21504:280;;;;;21791:201;;21903:2;21892:9;21888:18;21880:26;;21917:65;21979:1;21968:9;21964:17;21955:6;21917:65;;;21874:118;;;;;21999:301;;22137:2;22126:9;22122:18;22114:26;;22187:9;22181:4;22177:20;22173:1;22162:9;22158:17;22151:47;22212:78;22285:4;22276:6;22212:78;;;22204:86;;22108:192;;;;;22307:407;;22498:2;22487:9;22483:18;22475:26;;22548:9;22542:4;22538:20;22534:1;22523:9;22519:17;22512:47;22573:131;22699:4;22573:131;;;22565:139;;22469:245;;;;22721:407;;22912:2;22901:9;22897:18;22889:26;;22962:9;22956:4;22952:20;22948:1;22937:9;22933:17;22926:47;22987:131;23113:4;22987:131;;;22979:139;;22883:245;;;;23135:407;;23326:2;23315:9;23311:18;23303:26;;23376:9;23370:4;23366:20;23362:1;23351:9;23347:17;23340:47;23401:131;23527:4;23401:131;;;23393:139;;23297:245;;;;23549:407;;23740:2;23729:9;23725:18;23717:26;;23790:9;23784:4;23780:20;23776:1;23765:9;23761:17;23754:47;23815:131;23941:4;23815:131;;;23807:139;;23711:245;;;;23963:407;;24154:2;24143:9;24139:18;24131:26;;24204:9;24198:4;24194:20;24190:1;24179:9;24175:17;24168:47;24229:131;24355:4;24229:131;;;24221:139;;24125:245;;;;24377:407;;24568:2;24557:9;24553:18;24545:26;;24618:9;24612:4;24608:20;24604:1;24593:9;24589:17;24582:47;24643:131;24769:4;24643:131;;;24635:139;;24539:245;;;;24791:407;;24982:2;24971:9;24967:18;24959:26;;25032:9;25026:4;25022:20;25018:1;25007:9;25003:17;24996:47;25057:131;25183:4;25057:131;;;25049:139;;24953:245;;;;25205:407;;25396:2;25385:9;25381:18;25373:26;;25446:9;25440:4;25436:20;25432:1;25421:9;25417:17;25410:47;25471:131;25597:4;25471:131;;;25463:139;;25367:245;;;;25619:407;;25810:2;25799:9;25795:18;25787:26;;25860:9;25854:4;25850:20;25846:1;25835:9;25831:17;25824:47;25885:131;26011:4;25885:131;;;25877:139;;25781:245;;;;26033:407;;26224:2;26213:9;26209:18;26201:26;;26274:9;26268:4;26264:20;26260:1;26249:9;26245:17;26238:47;26299:131;26425:4;26299:131;;;26291:139;;26195:245;;;;26447:407;;26638:2;26627:9;26623:18;26615:26;;26688:9;26682:4;26678:20;26674:1;26663:9;26659:17;26652:47;26713:131;26839:4;26713:131;;;26705:139;;26609:245;;;;26861:407;;27052:2;27041:9;27037:18;27029:26;;27102:9;27096:4;27092:20;27088:1;27077:9;27073:17;27066:47;27127:131;27253:4;27127:131;;;27119:139;;27023:245;;;;27275:407;;27466:2;27455:9;27451:18;27443:26;;27516:9;27510:4;27506:20;27502:1;27491:9;27487:17;27480:47;27541:131;27667:4;27541:131;;;27533:139;;27437:245;;;;27689:377;;27865:2;27854:9;27850:18;27842:26;;27915:9;27909:4;27905:20;27901:1;27890:9;27886:17;27879:47;27940:116;28051:4;28042:6;27940:116;;;27932:124;;27836:230;;;;;28073:213;;28191:2;28180:9;28176:18;28168:26;;28205:71;28273:1;28262:9;28258:17;28249:6;28205:71;;;28162:124;;;;;28293:839;;28589:3;28578:9;28574:19;28566:27;;28604:71;28672:1;28661:9;28657:17;28648:6;28604:71;;;28686:80;28762:2;28751:9;28747:18;28738:6;28686:80;;;28814:9;28808:4;28804:20;28799:2;28788:9;28784:18;28777:48;28839:108;28942:4;28933:6;28839:108;;;28831:116;;28958:80;29034:2;29023:9;29019:18;29010:6;28958:80;;;29049:73;29117:3;29106:9;29102:19;29093:6;29049:73;;;28560:572;;;;;;;;;29139:1487;;29575:3;29564:9;29560:19;29552:27;;29590:71;29658:1;29647:9;29643:17;29634:6;29590:71;;;29709:9;29703:4;29699:20;29694:2;29683:9;29679:18;29672:48;29734:78;29807:4;29798:6;29734:78;;;29726:86;;29860:9;29854:4;29850:20;29845:2;29834:9;29830:18;29823:48;29885:78;29958:4;29949:6;29885:78;;;29877:86;;30011:9;30005:4;30001:20;29996:2;29985:9;29981:18;29974:48;30036:78;30109:4;30100:6;30036:78;;;30028:86;;30125:87;30207:3;30196:9;30192:19;30183:6;30125:87;;;30261:9;30255:4;30251:20;30245:3;30234:9;30230:19;30223:49;30286:78;30359:4;30350:6;30286:78;;;30278:86;;30375:73;30443:3;30432:9;30428:19;30419:6;30375:73;;;30459;30527:3;30516:9;30512:19;30503:6;30459:73;;;30543;30611:3;30600:9;30596:19;30587:6;30543:73;;;29546:1080;;;;;;;;;;;;;30633:324;;30779:2;30768:9;30764:18;30756:26;;30793:71;30861:1;30850:9;30846:17;30837:6;30793:71;;;30875:72;30943:2;30932:9;30928:18;30919:6;30875:72;;;30750:207;;;;;;30964:205;;31078:2;31067:9;31063:18;31055:26;;31092:67;31156:1;31145:9;31141:17;31132:6;31092:67;;;31049:120;;;;;31176:151;;31262:3;31254:11;;31300:4;31295:3;31291:14;31283:22;;31248:79;;;;31334:180;;31449:3;31441:11;;31487:4;31482:3;31478:14;31470:22;;31435:79;;;;31521:137;;31630:5;31624:12;31614:22;;31595:63;;;;31665:166;;31803:5;31797:12;31787:22;;31768:63;;;;31838:122;;31932:5;31926:12;31916:22;;31897:63;;;;31967:108;;32065:4;32060:3;32056:14;32048:22;;32042:33;;;;32082:137;;32209:4;32204:3;32200:14;32192:22;;32186:33;;;;32227:178;;32357:6;32352:3;32345:19;32394:4;32389:3;32385:14;32370:29;;32338:67;;;;;32414:207;;32573:6;32568:3;32561:19;32610:4;32605:3;32601:14;32586:29;;32554:67;;;;;32630:153;;32735:6;32730:3;32723:19;32772:4;32767:3;32763:14;32748:29;;32716:67;;;;;32792:163;;32907:6;32902:3;32895:19;32944:4;32939:3;32935:14;32920:29;;32888:67;;;;;32963:91;;33025:24;33043:5;33025:24;;;33014:35;;33008:46;;;;33061:85;;33134:5;33127:13;33120:21;33109:32;;33103:43;;;;33153:138;;33231:5;33220:16;;33237:49;33280:5;33237:49;;;33214:77;;;;33298:121;;33371:42;33364:5;33360:54;33349:65;;33343:76;;;;33426:72;;33488:5;33477:16;;33471:27;;;;33505:81;;33576:4;33569:5;33565:16;33554:27;;33548:38;;;;33593:129;;33680:37;33711:5;33680:37;;;33667:50;;33661:61;;;;33729:138;;33822:40;33856:5;33822:40;;;33809:53;;33803:64;;;;33874:116;;33961:24;33979:5;33961:24;;;33948:37;;33942:48;;;;33997:121;;34076:37;34107:5;34076:37;;;34063:50;;34057:61;;;;34125:108;;34204:24;34222:5;34204:24;;;34191:37;;34185:48;;;;34241:268;34306:1;34313:101;34327:6;34324:1;34321:13;34313:101;;;34403:1;34398:3;34394:11;34388:18;34384:1;34379:3;34375:11;34368:39;34349:2;34346:1;34342:10;34337:15;;34313:101;;;34429:6;34426:1;34423:13;34420:2;;;34494:1;34485:6;34480:3;34476:16;34469:27;34420:2;34290:219;;;;;34517:97;;34605:2;34601:7;34596:2;34589:5;34585:14;34581:28;34571:38;;34565:49;;;;34622:107;34707:1;34700:5;34697:12;34687:2;;34713:9;34687:2;34681:48;;34736:117;34805:24;34823:5;34805:24;;;34798:5;34795:35;34785:2;;34844:1;34841;34834:12;34785:2;34779:74;;34860:111;34926:21;34941:5;34926:21;;;34919:5;34916:32;34906:2;;34962:1;34959;34952:12;34906:2;34900:71;;34978:110;35063:1;35056:5;35053:12;35043:2;;35079:1;35076;35069:12;35043:2;35037:51;;35095:117;35164:24;35182:5;35164:24;;;35157:5;35154:35;35144:2;;35203:1;35200;35193:12;35144:2;35138:74;

Swarm Source

ipfs://e67cf5d97fca1210eed918068b3f5b06b26015ec10e64dd1497198dac0cd30fe
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.