Token Tera System

Overview CRC20

Price
$0.00 @ 0.000000 CRO
Fully Diluted Market Cap
Total Supply:
1,000,000,000,000 TSYS

Holders:
168 addresses
Contract:
0xaeea11f1375ecb30030eb14f2ef352b83722ddef0xaEEA11F1375ECb30030Eb14F2EF352b83722dDEf

Decimals:
9

Social Profiles:
Not Available, Update ?

Balance
463,677.34892394 TSYS

Value
$0.00
0x7dae8fbcc37f67cb1ca02b959fa97c1473bd3a63
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
TeraSystemCro

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-03-29
*/

/**
🔊 TERA SYSTEM LAUNCH

Tera System provides the foundational building layers for a new digital 
economy with products: DeFi, LaunchPad, GameFi, NFT, and Blockchain
------------------------------------------------------------------------------
CONTRACT : 0xaEEA11F1375ECb30030Eb14F2EF352b83722dDEf

https://dexscreener.com/cronos/0x098c105073CDdc9440DD18850A398DDF545f24B0

https://mm.finance/swap?outputCurrency=0xaEEA11F1375ECb30030Eb14F2EF352b83722dDEf

Token Alocation :
20% Farming Pool 
20% CEX LIST (LOCK 6 MONTH)
10% Team (LOCK 6 MONTH)
50% Liquidity

BUY TAX : 8%
SELL TAX : 12%

📱Telegram :
https://t.me/terasystemofficial
🌐 Website :
https://terasystem.io/
🐦 Twitter :
https://twitter.com/Terasystoken
📷 Instagram :
https://instagram.com/terasystoken
⚫️ Medium :
https://medium.com/@terasystem
**/

pragma solidity ^0.8.10;

// SPDX-License-Identifier: MIT
interface IERC20 {
    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;
    }
}

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

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

/**
 *@dev Collection of functions related to the address type
 */
library Address {
    /**
     *@dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     *@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 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;
    address private _previousOwner;
    uint256 private _lockTime;

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

    /**
     *@dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        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;
    }

    function geUnlockTime() public view returns (uint256) {
        return _lockTime;
    }

    //Locks the contract for owner for the amount of time provided
    function lock(uint256 time) public virtual onlyOwner {
        _previousOwner = _owner;
        _owner = address(0);
        _lockTime = block.timestamp + time;
        emit OwnershipTransferred(_owner, address(0));
    }

    //Unlocks the contract for owner when _lockTime is exceeds
    function unlock() public virtual {
        require(
            _previousOwner == msg.sender,
            "You don't have permission to unlock"
        );
        require(block.timestamp > _lockTime, "Contract is locked until a later date");
        emit OwnershipTransferred(_owner, _previousOwner);
        _owner = _previousOwner;
        _previousOwner = address(0);
    }
}

// pragma solidity >=0.5.0;

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

// pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

// pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

// pragma solidity >=0.6.2;

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}


contract TeraSystemCro is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

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

    mapping(address => bool) private _isExcludedFromFee;

    mapping(address => bool) private _isExcluded;
    address[] private _excluded;

    mapping(address => bool) private _isExcludedFromLimit;

    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 1000000000000 * 10**9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    address payable public marketingWallet = payable(0xF666321b524233563a9eBaD9C53800a8AD1c511b);
    address payable public devWallet = payable(0x6Ba3B420A3aE52FfB8378fbA58C4BF743c30D208);
    address payable public stakingWallet = payable(0x7BF009bDF3547968643d529858F711B6bf3f271C);
    address payable public deployerWallet;

    

    string private _name = "Tera System";
    string private _symbol = "TSYS";
    uint8 private _decimals = 9;

    struct TransferFee {
        uint16 tax;
        uint16 liquidity;
        uint16 staking;
        uint16 marketing;
        uint16 dev;
    }

    struct BuyFee {
        uint16 tax;
        uint16 liquidity;
        uint16 staking;
        uint16 marketing;
        uint16 dev;
    }

    struct SellFee {
        uint16 tax;
        uint16 liquidity;
        uint16 staking;
        uint16 marketing;
        uint16 dev;
    }
    
    TransferFee public transferFee;
    BuyFee public buyFee;
    SellFee public sellFee;

    uint16 private _taxFee;
    uint16 private _liquidityFee;
    uint16 private _staking;
    uint16 private _marketingFee;
    uint16 private _devFee;
    

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;

    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;

    uint256 public maxTransferAmount = 5000000000 * 10**9;
    uint256 public maxBuyAmount = 5000000000 * 10**9;
    uint256 public maxSellAmount = 5000000000 * 10**9;
    uint256 public maxWalletSize = 5000000000 * 10**9;
    uint256 public numTokensSellToAddToLiquidity = 100000000 * 10**9;

    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    constructor() {
        _rOwned[_msgSender()] = _rTotal;

        transferFee.tax = 0;
        transferFee.liquidity = 3;
        transferFee.staking = 0;
        transferFee.marketing = 5;
        transferFee.dev = 2;

        buyFee.tax = 0;
        buyFee.liquidity = 3;
        buyFee.staking = 0;
        buyFee.marketing = 5;
        buyFee.dev = 0;

        sellFee.tax = 0;
        sellFee.liquidity = 7;
        sellFee.staking = 0;
        sellFee.marketing = 4;
        sellFee.dev = 0;

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x145677FC4d9b8F19B5D56d1820c48e0443049a30
        );
        // Create a uniswap pair for this new token
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        // set the rest of the contract variables
        uniswapV2Router = _uniswapV2Router;
        deployerWallet = payable(msg.sender);

        // exclude owner, dev wallet, and this contract from fee
        _isExcludedFromFee[msg.sender] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[marketingWallet] = true;
        _isExcludedFromFee[devWallet] = true;
        _isExcludedFromFee[stakingWallet] = true;


        _isExcludedFromLimit[marketingWallet] = true;
        _isExcludedFromLimit[devWallet] = true;
        _isExcludedFromLimit[msg.sender] = true;
        _isExcludedFromLimit[stakingWallet] = true;
        _isExcludedFromLimit[address(this)] = true;

        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount)
        public
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender)
        public
        view
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount)
        public
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].add(addedValue)
        );
        return true;
    }

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

    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        require(
            !_isExcluded[sender],
            "Excluded addresses cannot call this function"
        );

        (
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tWallet,
        ) = _getTValues(tAmount);
        (uint256 rAmount, ,) = _getRValues(
            tAmount,
            tFee,
            tLiquidity,
            tWallet,
            _getRate()
        );

        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee)
        public
        view
        returns (uint256)
    {
        require(tAmount <= _tTotal, "Amount must be less than supply");

        (
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tWallet,
        ) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, ) = _getRValues(
            tAmount,
            tFee,
            tLiquidity,
            tWallet,
            _getRate()
        );

        if (!deductTransferFee) {
            return rAmount;
        } else {
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount)
        public
        view
        returns (uint256)
    {
        require(
            rAmount <= _rTotal,
            "Amount must be less than total reflections"
        );
        uint256 currentRate = _getRate();
        return rAmount.div(currentRate);
    }


    function updateMarketingWallet(address payable newAddress) external onlyOwner {
        marketingWallet = newAddress;
    }

    function updateDevWallet(address payable newAddress) external onlyOwner {
        devWallet = newAddress;
    }

    function updateBuybackWallet(address payable newAddress) external onlyOwner {
        stakingWallet = newAddress;
    }

    function excludeFromReward(address account) public onlyOwner {
        require(!_isExcluded[account], "Account is already excluded");
        if (_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner {
        require(_isExcluded[account], "Account is not excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }
    
    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    function excludeFromLimit(address account) public onlyOwner {
        _isExcludedFromLimit[account] = true;
    }

    function includeInLimit(address account) public onlyOwner {
        _isExcludedFromLimit[account] = false;
    }

    function setSellFee(
        uint16 tax,
        uint16 liquidity,
        uint16 staking,
        uint16 marketing,
        uint16 dev
    ) external onlyOwner {
        require(tax + liquidity + staking + marketing + dev <= 25, "You can't set fees higher 25%");
        sellFee.tax = tax;
        sellFee.marketing = marketing;
        sellFee.staking = staking;
        sellFee.liquidity = liquidity;
        sellFee.dev = dev;
    }

    function setBuyFee(
        uint16 tax,
        uint16 liquidity,
        uint16 staking,
        uint16 marketing,
        uint16 dev
    ) external onlyOwner {
        require(tax + liquidity + staking + marketing + dev <= 25, "You can't set fees higher 25%");
        buyFee.tax = tax;
        buyFee.marketing = marketing;
        buyFee.staking = staking;
        buyFee.liquidity = liquidity;
        buyFee.dev = dev;
    }

    function setTransferFee(
        uint16 tax,
        uint16 liquidity,
        uint16 staking,
        uint16 marketing,
        uint16 dev
    ) external onlyOwner {
        require(tax + liquidity + staking + marketing + dev <= 25, "You can't set fees higher 25%");
        transferFee.tax = tax;
        transferFee.marketing = marketing;
        transferFee.staking = staking;
        transferFee.liquidity = liquidity;
        transferFee.dev = dev;
    }

    function setNumTokensSellToAddToLiquidity(uint256 numTokens) external onlyOwner {
        numTokensSellToAddToLiquidity = numTokens;
    }

    function setMaxTxAmount(uint256 newMaxTxAmount) external onlyOwner {
        require(newMaxTxAmount >= _tTotal / 1000, "You Can't set Smaller than 0.1%");
        maxTransferAmount = newMaxTxAmount;
    }
    
    function setMaxBuyAmount(uint256 newMaxBuyAmount) external onlyOwner {
        require(newMaxBuyAmount >= _tTotal / 1000, "You Can't set Smaller than 0.1%");
        maxBuyAmount = newMaxBuyAmount;
    }

    function setMaxSellAmount(uint256 newMaxSellAmount) external onlyOwner {
        require(newMaxSellAmount >= _tTotal / 1000, "You Can't set Smaller than 0.1%");
        maxSellAmount = newMaxSellAmount;
    }

    function setMaxWalletSize(uint256 newMaxWalletSize) external onlyOwner {
        require(newMaxWalletSize >= _tTotal / 1000, "You Can't set Smaller than 0.1%");
        maxWalletSize = newMaxWalletSize;
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    //to recieve ETH from uniswapV2Router when swapping
    receive() external payable {}

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getTValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tWallet = calculateMarketingFee(tAmount) +
            calculateDevFee(tAmount) + calculatestaking(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
        tTransferAmount = tTransferAmount.sub(tWallet);

        return (tTransferAmount, tFee, tLiquidity, tWallet);
    }

    function _getRValues(
        uint256 tAmount,
        uint256 tFee,
        uint256 tLiquidity,
        uint256 tWallet,
        uint256 currentRate
    )
        private
        pure
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rWallet = tWallet.mul(currentRate);
        uint256 rTransferAmount = rAmount
            .sub(rFee)
            .sub(rLiquidity)
            .sub(rWallet);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns (uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (
                _rOwned[_excluded[i]] > rSupply ||
                _tOwned[_excluded[i]] > tSupply
            ) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate = _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if (_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }

    function _takeWalletFee(uint256 tWallet) private {
        uint256 currentRate = _getRate();
        uint256 rWallet = tWallet.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rWallet);
        if (_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tWallet);
    }

    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(10**2);
    }

    function calculateLiquidityFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount.mul(_liquidityFee).div(10**2);
    }

    function calculateMarketingFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount.mul(_marketingFee).div(10**2);
    }

    function calculateDevFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_devFee).div(10**2);
    }

    function calculatestaking(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_staking).div(10**2);
    }

    function removeAllFee() private {
        _taxFee = 0;
        _liquidityFee = 0;
        _staking = 0;
        _marketingFee = 0;
        _devFee = 0;
    }
    
    function setTransfer() private {
        _taxFee = transferFee.tax;
        _liquidityFee = transferFee.liquidity;
        _staking = transferFee.staking;
        _marketingFee = transferFee.marketing;
        _devFee = transferFee.dev;
    }

    function setBuy() private {
        _taxFee = buyFee.tax;
        _liquidityFee = buyFee.liquidity;
        _staking = buyFee.staking;
        _marketingFee = buyFee.marketing;
        _devFee = buyFee.dev;
    }
    
    function setSell() private {
        _taxFee = sellFee.tax;
        _liquidityFee = sellFee.liquidity;
        _staking = sellFee.staking;
        _marketingFee = sellFee.marketing;
        _devFee = sellFee.dev;
    }

    function isExcludedFromFee(address account) public view returns (bool) {
        return _isExcludedFromFee[account];
    }

    function isExcludedFromLimit(address account) public view returns (bool) {
        return _isExcludedFromLimit[account];
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) private {
        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);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        // is the token balance of this contract address over the min number of
        // tokens that we need to initiate a swap + liquidity lock?
        // also, don't get caught in a circular liquidity event.
        // also, don't swap & liquify if sender is uniswap pair.
        uint256 contractTokenBalance = balanceOf(address(this));

        if (contractTokenBalance >= maxTransferAmount) {
            contractTokenBalance = maxTransferAmount;
        }

        bool overMinTokenBalance = contractTokenBalance >=
            numTokensSellToAddToLiquidity;
        if (
            overMinTokenBalance &&
            !inSwapAndLiquify &&
            from != uniswapV2Pair &&
            swapAndLiquifyEnabled
        ) {
            contractTokenBalance = numTokensSellToAddToLiquidity;
            //add liquidity
            swapAndLiquify(contractTokenBalance);
        }

        //indicates if fee should be deducted from transfer
        bool takeFee = true;

        //if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
            takeFee = false;
        }

        if (takeFee) {
            if (!_isExcludedFromLimit[from] && !_isExcludedFromLimit[to]) {
                require(
                    amount <= maxTransferAmount,
                    "Transfer amount exceeds the maxTransferAmount."
                );

                if (from == uniswapV2Pair) {
                    require(
                        amount + balanceOf(to) <= maxWalletSize,
                        "Recipient exceeds max wallet size."
                    );
                    require(
                        amount <= maxBuyAmount,
                        "Buy amount exceeds the maxBuyAmount."
                    );
                } if (to == uniswapV2Pair) {
                    require(
                        amount <= maxSellAmount,
                        "Sell amount exceeds the maxSellAmout."
                    );
                }
            }
        }

        //transfer amount, it will take tax, burn, liquidity fee
        _tokenTransfer(from, to, amount, takeFee);
    }

    function swapAndLiquify(uint256 tokens) private lockTheSwap {
        // Split the contract balance into halves
        uint256 denominator = (buyFee.liquidity +
            sellFee.liquidity +
            buyFee.staking +
            sellFee.staking +
            buyFee.marketing +
            sellFee.marketing +
            buyFee.dev +
            sellFee.dev) * 2;
        uint256 tokensToAddLiquidityWith = (tokens *
            (buyFee.liquidity + sellFee.liquidity)) / denominator;
        uint256 tokensToStaking = ((tokens *
            (buyFee.staking + sellFee.staking)) * 2) / denominator;
        _transferBothExcluded(address(this), stakingWallet, tokensToStaking);
        uint256 toSwap = tokens - (tokensToAddLiquidityWith + tokensToStaking);
        
        uint256 initialBalance = address(this).balance;

        swapTokensForEth(toSwap);

        uint256 deltaBalance = address(this).balance - initialBalance;
        uint256 unitBalance = deltaBalance /
            (denominator - (buyFee.liquidity + sellFee.liquidity));
        uint256 bnbToAddLiquidityWith = unitBalance *
            (buyFee.liquidity + sellFee.liquidity);

        if (bnbToAddLiquidityWith > 0) {
            // Add liquidity to pancake
            addLiquidity(tokensToAddLiquidityWith, bnbToAddLiquidityWith);
        }

        // Send ETH to marketing
        uint256 marketingAmt = unitBalance *
            2 *
            (buyFee.marketing + sellFee.marketing);
        uint256 devAmt = unitBalance * 2 * (buyFee.dev + sellFee.dev) >
            address(this).balance
            ? address(this).balance
            : unitBalance * 2 * (buyFee.dev + sellFee.dev);

        if (marketingAmt > 0) {
            (marketingWallet).transfer(marketingAmt);
        }

        if (devAmt > 0) {
            devWallet.transfer(devAmt);
        }
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(deployerWallet),
            block.timestamp
        );
    }

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount,
        bool takeFee
    ) private {
        if (takeFee) {
            removeAllFee();
            if (sender == uniswapV2Pair) {
                setBuy();
            }
            else if (recipient == uniswapV2Pair) {
                setSell();
            }
            else {
                setTransfer();
            }
        }

        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
        removeAllFee();
    }

    function _transferStandard(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tWallet
        ) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(
            tAmount,
            tFee,
            tLiquidity,
            tWallet,
            _getRate()
        );

        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _takeWalletFee(tWallet);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }


    function _transferToExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tWallet
        ) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(
            tAmount,
            tFee,
            tLiquidity,
            tWallet,
            _getRate()
        );

        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _takeWalletFee(tWallet);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tWallet
        ) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(
            tAmount,
            tFee,
            tLiquidity,
            tWallet,
            _getRate()
        );

        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _takeWalletFee(tWallet);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity,
            uint256 tWallet
        ) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(
            tAmount,
            tFee,
            tLiquidity,
            tWallet,
            _getRate()
        );

        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _takeWalletFee(tWallet);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function clearStuckBalance() public onlyOwner {
        uint256 amount = address(this).balance;
        payable(marketingWallet).transfer(amount);
    }

    function withdrawForeignToken(address tokenAddress, address recipient, uint256 amount) public onlyOwner {
        IERC20 foreignToken = IERC20(tokenAddress);
        foreignToken.transfer(recipient, amount);
    }
}

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":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","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":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint16","name":"tax","type":"uint16"},{"internalType":"uint16","name":"liquidity","type":"uint16"},{"internalType":"uint16","name":"staking","type":"uint16"},{"internalType":"uint16","name":"marketing","type":"uint16"},{"internalType":"uint16","name":"dev","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearStuckBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deployerWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"geUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransferAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletSize","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":"numTokensSellToAddToLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint16","name":"tax","type":"uint16"},{"internalType":"uint16","name":"liquidity","type":"uint16"},{"internalType":"uint16","name":"staking","type":"uint16"},{"internalType":"uint16","name":"marketing","type":"uint16"},{"internalType":"uint16","name":"dev","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tax","type":"uint16"},{"internalType":"uint16","name":"liquidity","type":"uint16"},{"internalType":"uint16","name":"staking","type":"uint16"},{"internalType":"uint16","name":"marketing","type":"uint16"},{"internalType":"uint16","name":"dev","type":"uint16"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxBuyAmount","type":"uint256"}],"name":"setMaxBuyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxSellAmount","type":"uint256"}],"name":"setMaxSellAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxTxAmount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxWalletSize","type":"uint256"}],"name":"setMaxWalletSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"setNumTokensSellToAddToLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"tax","type":"uint16"},{"internalType":"uint16","name":"liquidity","type":"uint16"},{"internalType":"uint16","name":"staking","type":"uint16"},{"internalType":"uint16","name":"marketing","type":"uint16"},{"internalType":"uint16","name":"dev","type":"uint16"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"tax","type":"uint16"},{"internalType":"uint16","name":"liquidity","type":"uint16"},{"internalType":"uint16","name":"staking","type":"uint16"},{"internalType":"uint16","name":"marketing","type":"uint16"},{"internalType":"uint16","name":"dev","type":"uint16"}],"name":"setTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","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":[],"name":"transferFee","outputs":[{"internalType":"uint16","name":"tax","type":"uint16"},{"internalType":"uint16","name":"liquidity","type":"uint16"},{"internalType":"uint16","name":"staking","type":"uint16"},{"internalType":"uint16","name":"marketing","type":"uint16"},{"internalType":"uint16","name":"dev","type":"uint16"}],"stateMutability":"view","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"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newAddress","type":"address"}],"name":"updateBuybackWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newAddress","type":"address"}],"name":"updateDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newAddress","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawForeignToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052683635c9adc5dea00000600a819055620000219060001962000519565b6200002f906000196200053c565b600b908155600d80546001600160a01b031990811673f666321b524233563a9ebad9c53800a8ad1c511b17909155600e80548216736ba3b420a3ae52ffb8378fba58c4bf743c30d208179055600f8054909116737bf009bdf3547968643d529858f711b6bf3f271c179055604080518082019091528181526a546572612053797374656d60a81b6020909101908152620000cd916011919062000473565b50604080518082019091526004808252635453595360e01b6020909201918252620000fb9160129162000473565b506013805460ff191660091790556017805460ff60581b19166b010000000000000000000000179055674563918244f4000060188190556019819055601a819055601b5567016345785d8a0000601c553480156200015857600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600b54336000908152600360209081526040918290209290925560148054680200050000000300006001600160501b0319918216179091556015805482166605000000030000179055601680549091166604000000070000179055805163c45a015560e01b8152905173145677fc4d9b8f19b5d56d1820c48e0443049a3092839263c45a015592600480830193928290030181865afa15801562000242573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000268919062000562565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002b6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002dc919062000562565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200032a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000350919062000562565b6001600160a01b0390811660a052818116608052601080546001600160a01b031916339081179091556000818152600660209081526040808320805460ff199081166001908117909255308086528386208054831684179055600d8054891687528487208054841685179055600e80548a1688528588208054851686179055600f80548b168952868920805486168717905591548a1688526009875285882080548516861790555489168752848720805484168517905587875284872080548416851790555490971685528285208054821683179055958452818420805490961617909455600a549351938452919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350620005d1565b828054620004819062000594565b90600052602060002090601f016020900481019282620004a55760008555620004f0565b82601f10620004c057805160ff1916838001178555620004f0565b82800160010185558215620004f0579182015b82811115620004f0578251825591602001919060010190620004d3565b50620004fe92915062000502565b5090565b5b80821115620004fe576000815560010162000503565b6000826200053757634e487b7160e01b600052601260045260246000fd5b500690565b6000828210156200055d57634e487b7160e01b600052601160045260246000fd5b500390565b6000602082840312156200057557600080fd5b81516001600160a01b03811681146200058d57600080fd5b9392505050565b600181811c90821680620005a957607f821691505b60208210811415620005cb57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a051613b3b6200063d6000396000818161073b015281816120ae0152818161220e01528181612315015281816129820152612a2f0152600081816104de015281816131620152818161321b01528181613257015281816132c901526133310152613b3b6000f3fe6080604052600436106103905760003560e01c806366d602ae116101dc578063aacebbe311610102578063dd62ed3e116100a0578063ec28438a1161006f578063ec28438a14610b73578063f0f165af14610b93578063f2fde38b14610bb3578063f34eb0b814610bd357600080fd5b8063dd62ed3e14610acd578063e99c9d0914610b13578063ea1644d514610b33578063ea2f0b3714610b5357600080fd5b8063c49b9a80116100dc578063c49b9a8014610a3e578063d12a768814610a5e578063d94160e014610a74578063dd46706414610aad57600080fd5b8063aacebbe3146109c5578063acb2ad6f146109e5578063b6c5232414610a2957600080fd5b80638ea5220f1161017a578063a457c2d711610149578063a457c2d71461095a578063a69df4b51461097a578063a9059cbb1461098f578063a9e75723146109af57600080fd5b80638ea5220f146108ef5780638f3fa8601461090f57806391d919a91461092557806395d89b411461094557600080fd5b806375f0a874116101b657806375f0a8741461086257806388e765ff1461088257806388f82020146108985780638da5cb5b146108d157600080fd5b806366d602ae1461081757806370a082311461082d578063715018a61461084d57600080fd5b8063313ce567116102c15780634549b0391161025f5780634cfd4a921161022e5780634cfd4a921461077e57806352390c021461079e5780635342acb4146107be5780635d60c7be146107f757600080fd5b80634549b039146106c557806347062402146106e557806349bd5a5e146107295780634a74bb021461075d57600080fd5b806338c4f8141161029b57806338c4f8141461064557806339509351146106655780633bd5d17314610685578063437823ec146106a557600080fd5b8063313ce567146105ee578063364333f4146106105780633685d4191461062557600080fd5b80631465d9291161032e5780631816467f116103085780631816467f1461051557806323b872dd146105355780632b14ca56146105555780632d838119146105ce57600080fd5b80631465d929146104ac5780631694505e146104cc57806318160ddd1461050057600080fd5b806306fdde031161036a57806306fdde031461041b578063095ea7b31461043d5780630bd3a7f91461046d57806313114a9d1461048d57600080fd5b806304dacd501461039c5780630659ce5c146103be57806306ee6ad8146103de57600080fd5b3661039757005b600080fd5b3480156103a857600080fd5b506103bc6103b73660046135c7565b610bf3565b005b3480156103ca57600080fd5b506103bc6103d93660046135e4565b610c48565b3480156103ea57600080fd5b50600f546103fe906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561042757600080fd5b50610430610cef565b6040516104129190613625565b34801561044957600080fd5b5061045d61045836600461367a565b610d81565b6040519015158152602001610412565b34801561047957600080fd5b506103bc6104883660046135c7565b610d98565b34801561049957600080fd5b50600c545b604051908152602001610412565b3480156104b857600080fd5b506103bc6104c73660046136bd565b610de6565b3480156104d857600080fd5b506103fe7f000000000000000000000000000000000000000000000000000000000000000081565b34801561050c57600080fd5b50600a5461049e565b34801561052157600080fd5b506103bc6105303660046135c7565b610ed0565b34801561054157600080fd5b5061045d6105503660046135e4565b610f1c565b34801561056157600080fd5b506016546105999061ffff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b9091041685565b6040805161ffff968716815294861660208601529285169284019290925283166060830152909116608082015260a001610412565b3480156105da57600080fd5b5061049e6105e9366004613722565b610f85565b3480156105fa57600080fd5b5060135460405160ff9091168152602001610412565b34801561061c57600080fd5b506103bc611009565b34801561063157600080fd5b506103bc6106403660046135c7565b611071565b34801561065157600080fd5b506103bc6106603660046136bd565b611224565b34801561067157600080fd5b5061045d61068036600461367a565b61130e565b34801561069157600080fd5b506103bc6106a0366004613722565b611344565b3480156106b157600080fd5b506103bc6106c03660046135c7565b61144d565b3480156106d157600080fd5b5061049e6106e0366004613749565b61149b565b3480156106f157600080fd5b506015546105999061ffff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b9091041685565b34801561073557600080fd5b506103fe7f000000000000000000000000000000000000000000000000000000000000000081565b34801561076957600080fd5b5060175461045d90600160581b900460ff1681565b34801561078a57600080fd5b506103bc6107993660046136bd565b611538565b3480156107aa57600080fd5b506103bc6107b93660046135c7565b611622565b3480156107ca57600080fd5b5061045d6107d93660046135c7565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561080357600080fd5b506010546103fe906001600160a01b031681565b34801561082357600080fd5b5061049e601a5481565b34801561083957600080fd5b5061049e6108483660046135c7565b611775565b34801561085957600080fd5b506103bc6117d4565b34801561086e57600080fd5b50600d546103fe906001600160a01b031681565b34801561088e57600080fd5b5061049e60195481565b3480156108a457600080fd5b5061045d6108b33660046135c7565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156108dd57600080fd5b506000546001600160a01b03166103fe565b3480156108fb57600080fd5b50600e546103fe906001600160a01b031681565b34801561091b57600080fd5b5061049e601b5481565b34801561093157600080fd5b506103bc6109403660046135c7565b611836565b34801561095157600080fd5b50610430611881565b34801561096657600080fd5b5061045d61097536600461367a565b611890565b34801561098657600080fd5b506103bc6118df565b34801561099b57600080fd5b5061045d6109aa36600461367a565b6119f6565b3480156109bb57600080fd5b5061049e60185481565b3480156109d157600080fd5b506103bc6109e03660046135c7565b611a03565b3480156109f157600080fd5b506014546105999061ffff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b9091041685565b348015610a3557600080fd5b5060025461049e565b348015610a4a57600080fd5b506103bc610a59366004613779565b611a4f565b348015610a6a57600080fd5b5061049e601c5481565b348015610a8057600080fd5b5061045d610a8f3660046135c7565b6001600160a01b031660009081526009602052604090205460ff1690565b348015610ab957600080fd5b506103bc610ac8366004613722565b611ad1565b348015610ad957600080fd5b5061049e610ae8366004613796565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610b1f57600080fd5b506103bc610b2e366004613722565b611b56565b348015610b3f57600080fd5b506103bc610b4e366004613722565b611bb4565b348015610b5f57600080fd5b506103bc610b6e3660046135c7565b611c12565b348015610b7f57600080fd5b506103bc610b8e366004613722565b611c5d565b348015610b9f57600080fd5b506103bc610bae366004613722565b611cbb565b348015610bbf57600080fd5b506103bc610bce3660046135c7565b611cea565b348015610bdf57600080fd5b506103bc610bee366004613722565b611dc2565b6000546001600160a01b03163314610c265760405162461bcd60e51b8152600401610c1d906137c4565b60405180910390fd5b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610c725760405162461bcd60e51b8152600401610c1d906137c4565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284919082169063a9059cbb906044016020604051808303816000875af1158015610cc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce891906137f9565b5050505050565b606060118054610cfe90613816565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2a90613816565b8015610d775780601f10610d4c57610100808354040283529160200191610d77565b820191906000526020600020905b815481529060010190602001808311610d5a57829003601f168201915b5050505050905090565b6000610d8e338484611e20565b5060015b92915050565b6000546001600160a01b03163314610dc25760405162461bcd60e51b8152600401610c1d906137c4565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b6000546001600160a01b03163314610e105760405162461bcd60e51b8152600401610c1d906137c4565b6019818385610e1f888a613867565b610e299190613867565b610e339190613867565b610e3d9190613867565b61ffff161115610e5f5760405162461bcd60e51b8152600401610c1d9061388d565b6015805461ffff928316600160401b0261ffff60401b19968416620100000263ffff000019968516600160201b029690961665ffffffff000019958516600160301b0267ffff00000000ffff1990931694909816939093171792909216949094179190911791909116919091179055565b6000546001600160a01b03163314610efa5760405162461bcd60e51b8152600401610c1d906137c4565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000610f29848484611f44565b610f7b8433610f7685604051806060016040528060288152602001613a99602891396001600160a01b038a16600090815260056020908152604080832033845290915290205491906123c1565b611e20565b5060019392505050565b6000600b54821115610fec5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610c1d565b6000610ff66123fb565b9050611002838261241e565b9392505050565b6000546001600160a01b031633146110335760405162461bcd60e51b8152600401610c1d906137c4565b600d5460405147916001600160a01b03169082156108fc029083906000818181858888f1935050505015801561106d573d6000803e3d6000fd5b5050565b6000546001600160a01b0316331461109b5760405162461bcd60e51b8152600401610c1d906137c4565b6001600160a01b03811660009081526007602052604090205460ff166111035760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610c1d565b60005b60085481101561106d57816001600160a01b03166008828154811061112d5761112d6138c4565b6000918252602090912001546001600160a01b031614156112125760088054611158906001906138da565b81548110611168576111686138c4565b600091825260209091200154600880546001600160a01b039092169183908110611194576111946138c4565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600482526040808220829055600790925220805460ff1916905560088054806111ec576111ec6138f1565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b8061121c81613907565b915050611106565b6000546001600160a01b0316331461124e5760405162461bcd60e51b8152600401610c1d906137c4565b601981838561125d888a613867565b6112679190613867565b6112719190613867565b61127b9190613867565b61ffff16111561129d5760405162461bcd60e51b8152600401610c1d9061388d565b6014805461ffff928316600160401b0261ffff60401b19968416620100000263ffff000019968516600160201b029690961665ffffffff000019958516600160301b0267ffff00000000ffff1990931694909816939093171792909216949094179190911791909116919091179055565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610d8e918590610f769086612460565b3360008181526007602052604090205460ff16156113b95760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610c1d565b60008060006113c7856124bf565b5092509250925060006113e4868585856113df6123fb565b612544565b50506001600160a01b03861660009081526003602052604090205490915061140c90826125a6565b6001600160a01b038616600090815260036020526040902055600b5461143290826125a6565b600b55600c546114429087612460565b600c55505050505050565b6000546001600160a01b031633146114775760405162461bcd60e51b8152600401610c1d906137c4565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6000600a548311156114ef5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610c1d565b60008060006114fd866124bf565b50925092509250600080611516888686866113df6123fb565b50915091508661152c57509350610d9292505050565b9450610d929350505050565b6000546001600160a01b031633146115625760405162461bcd60e51b8152600401610c1d906137c4565b6019818385611571888a613867565b61157b9190613867565b6115859190613867565b61158f9190613867565b61ffff1611156115b15760405162461bcd60e51b8152600401610c1d9061388d565b6016805461ffff928316600160401b0261ffff60401b19968416620100000263ffff000019968516600160201b029690961665ffffffff000019958516600160301b0267ffff00000000ffff1990931694909816939093171792909216949094179190911791909116919091179055565b6000546001600160a01b0316331461164c5760405162461bcd60e51b8152600401610c1d906137c4565b6001600160a01b03811660009081526007602052604090205460ff16156116b55760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610c1d565b6001600160a01b0381166000908152600360205260409020541561170f576001600160a01b0381166000908152600360205260409020546116f590610f85565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6001600160a01b03811660009081526007602052604081205460ff16156117b257506001600160a01b031660009081526004602052604090205490565b6001600160a01b038216600090815260036020526040902054610d9290610f85565b6000546001600160a01b031633146117fe5760405162461bcd60e51b8152600401610c1d906137c4565b600080546040516001600160a01b0390911690600080516020613ac1833981519152908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146118605760405162461bcd60e51b8152600401610c1d906137c4565b6001600160a01b03166000908152600960205260409020805460ff19169055565b606060128054610cfe90613816565b6000610d8e3384610f7685604051806060016040528060258152602001613ae1602591393360009081526005602090815260408083206001600160a01b038d16845290915290205491906123c1565b6001546001600160a01b031633146119455760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b6064820152608401610c1d565b60025442116119a45760405162461bcd60e51b815260206004820152602560248201527f436f6e7472616374206973206c6f636b656420756e74696c2061206c61746572604482015264206461746560d81b6064820152608401610c1d565b600154600080546040516001600160a01b039384169390911691600080516020613ac183398151915291a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000610d8e338484611f44565b6000546001600160a01b03163314611a2d5760405162461bcd60e51b8152600401610c1d906137c4565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611a795760405162461bcd60e51b8152600401610c1d906137c4565b60178054821515600160581b0260ff60581b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611ac690831515815260200190565b60405180910390a150565b6000546001600160a01b03163314611afb5760405162461bcd60e51b8152600401610c1d906137c4565b60008054600180546001600160a01b03199081166001600160a01b03841617909155169055611b2a8142613922565b600255600080546040516001600160a01b0390911690600080516020613ac1833981519152908390a350565b6000546001600160a01b03163314611b805760405162461bcd60e51b8152600401610c1d906137c4565b6103e8600a54611b90919061393a565b811015611baf5760405162461bcd60e51b8152600401610c1d9061395c565b601a55565b6000546001600160a01b03163314611bde5760405162461bcd60e51b8152600401610c1d906137c4565b6103e8600a54611bee919061393a565b811015611c0d5760405162461bcd60e51b8152600401610c1d9061395c565b601b55565b6000546001600160a01b03163314611c3c5760405162461bcd60e51b8152600401610c1d906137c4565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b03163314611c875760405162461bcd60e51b8152600401610c1d906137c4565b6103e8600a54611c97919061393a565b811015611cb65760405162461bcd60e51b8152600401610c1d9061395c565b601855565b6000546001600160a01b03163314611ce55760405162461bcd60e51b8152600401610c1d906137c4565b601c55565b6000546001600160a01b03163314611d145760405162461bcd60e51b8152600401610c1d906137c4565b6001600160a01b038116611d795760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c1d565b600080546040516001600160a01b0380851693921691600080516020613ac183398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611dec5760405162461bcd60e51b8152600401610c1d906137c4565b6103e8600a54611dfc919061393a565b811015611e1b5760405162461bcd60e51b8152600401610c1d9061395c565b601955565b6001600160a01b038316611e825760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c1d565b6001600160a01b038216611ee35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c1d565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611fa85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c1d565b6001600160a01b03821661200a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c1d565b6000811161206c5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610c1d565b600061207730611775565b9050601854811061208757506018545b601c54811080159081906120a55750601754600160501b900460ff16155b80156120e357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b80156120f85750601754600160581b900460ff165b1561210b57601c54915061210b826125e8565b6001600160a01b03851660009081526006602052604090205460019060ff168061214d57506001600160a01b03851660009081526006602052604090205460ff165b15612156575060005b80156123ad576001600160a01b03861660009081526009602052604090205460ff1615801561219e57506001600160a01b03851660009081526009602052604090205460ff16155b156123ad5760185484111561220c5760405162461bcd60e51b815260206004820152602e60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785460448201526d3930b739b332b920b6b7bab73a1760911b6064820152608401610c1d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b0316141561231357601b5461225286611775565b61225c9086613922565b11156122b55760405162461bcd60e51b815260206004820152602260248201527f526563697069656e742065786365656473206d61782077616c6c65742073697a604482015261329760f11b6064820152608401610c1d565b6019548411156123135760405162461bcd60e51b8152602060048201526024808201527f42757920616d6f756e74206578636565647320746865206d6178427579416d6f6044820152633ab73a1760e11b6064820152608401610c1d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614156123ad57601a548411156123ad5760405162461bcd60e51b815260206004820152602560248201527f53656c6c20616d6f756e74206578636565647320746865206d617853656c6c4160448201526436b7baba1760d91b6064820152608401610c1d565b6123b986868684612962565b505050505050565b600081848411156123e55760405162461bcd60e51b8152600401610c1d9190613625565b5060006123f284866138da565b95945050505050565b6000806000612408612cbb565b9092509050612417828261241e565b9250505090565b600061100283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e3d565b60008061246d8385613922565b9050838110156110025760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c1d565b60008060008060006124d086612e6b565b905060006124dd87612e8d565b905060006124ea88612eaf565b6124f389612ed2565b6124fc8a612ef5565b6125069190613922565b6125109190613922565b90506000612528836125228b876125a6565b906125a6565b905061253481836125a6565b9993985091965094509092505050565b60008080806125538986612f14565b905060006125618987612f14565b9050600061256f8988612f14565b9050600061257d8989612f14565b9050600061259182612522858189896125a6565b949d949c50929a509298505050505050505050565b600061100283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506123c1565b6017805460ff60501b1916600160501b17905560165460155460009161ffff600160401b808304821693908104821692600160301b808204841693908304811692600160201b808404831693908204831692612651926201000092839004821692900416613867565b61265b9190613867565b6126659190613867565b61266f9190613867565b6126799190613867565b6126839190613867565b61268d9190613867565b612698906002613993565b60165460155461ffff928316935060009284926126c392620100009182900483169291900416613867565b6126d19061ffff16856139bd565b6126db919061393a565b60165460155491925060009184916127059161ffff600160201b9283900481169290910416613867565b6127139061ffff16866139bd565b61271e9060026139bd565b612728919061393a565b600f549091506127439030906001600160a01b031683612f93565b600061274f8284613922565b61275990866138da565b9050476127658261310b565b600061277182476138da565b6016546015549192506000916127999161ffff62010000918290048116929190910416613867565b6127a79061ffff16886138da565b6127b1908361393a565b6016546015549192506000916127d99161ffff62010000918290048116929190910416613867565b6127e79061ffff16836139bd565b905080156127f9576127f987826132c3565b60165460155460009161281e9161ffff600160301b9283900481169290910416613867565b61ffff1661282d8460026139bd565b61283791906139bd565b60165460155491925060009147916128619161ffff600160401b9283900481169290910416613867565b61ffff166128708660026139bd565b61287a91906139bd565b116128c0576016546015546128a29161ffff600160401b918290048116929190910416613867565b61ffff166128b18560026139bd565b6128bb91906139bd565b6128c2565b475b9050811561290657600d546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015612904573d6000803e3d6000fd5b505b801561294857600e546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612946573d6000803e3d6000fd5b505b50506017805460ff60501b19169055505050505050505050565b8015612b49576129806017805469ffffffffffffffffffff19169055565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b03161415612a2d576015546017805461ffff80841663ffffffff1990921691909117620100008085048316021767ffffffff000000001916600160201b80850483160261ffff60301b191617600160301b8085048316021761ffff60401b1916600160401b9384900491909116909202919091179055612b49565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161415612ada576016546017805461ffff80841663ffffffff1990921691909117620100008085048316021767ffffffff000000001916600160201b80850483160261ffff60301b191617600160301b8085048316021761ffff60401b1916600160401b9384900491909116909202919091179055612b49565b6014546017805461ffff80841663ffffffff1990921691909117620100008085048316021767ffffffff000000001916600160201b80850483160261ffff60301b191617600160301b8085048316021761ffff60401b1916600160401b93849004919091169092029190911790555b6001600160a01b03841660009081526007602052604090205460ff168015612b8a57506001600160a01b03831660009081526007602052604090205460ff16155b15612b9f57612b9a8484846133a2565b612c9d565b6001600160a01b03841660009081526007602052604090205460ff16158015612be057506001600160a01b03831660009081526007602052604090205460ff165b15612bf057612b9a848484613456565b6001600160a01b03841660009081526007602052604090205460ff16158015612c3257506001600160a01b03831660009081526007602052604090205460ff16155b15612c4257612b9a8484846134ac565b6001600160a01b03841660009081526007602052604090205460ff168015612c8257506001600160a01b03831660009081526007602052604090205460ff165b15612c9257612b9a848484612f93565b612c9d8484846134ac565b612cb56017805469ffffffffffffffffffff19169055565b50505050565b600b54600a546000918291825b600854811015612e0d57826003600060088481548110612cea57612cea6138c4565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612d555750816004600060088481548110612d2e57612d2e6138c4565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612d6b57600b54600a54945094505050509091565b612db16003600060088481548110612d8557612d856138c4565b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906125a6565b9250612df96004600060088481548110612dcd57612dcd6138c4565b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906125a6565b915080612e0581613907565b915050612cc8565b50600a54600b54612e1d9161241e565b821015612e3457600b54600a549350935050509091565b90939092509050565b60008183612e5e5760405162461bcd60e51b8152600401610c1d9190613625565b5060006123f2848661393a565b601754600090610d9290606490612e8790859061ffff16612f14565b9061241e565b601754600090610d9290606490612e8790859062010000900461ffff16612f14565b601754600090610d9290606490612e87908590600160201b900461ffff16612f14565b601754600090610d9290606490612e87908590600160401b900461ffff16612f14565b601754600090610d9290606490612e87908590600160301b900461ffff165b600082612f2357506000610d92565b6000612f2f83856139bd565b905082612f3c858361393a565b146110025760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610c1d565b600080600080612fa2856124bf565b93509350935093506000806000612fbe888787876113df6123fb565b6001600160a01b038d166000908152600460205260409020549295509093509150612fe990896125a6565b6001600160a01b038b1660009081526004602090815260408083209390935560039052205461301890846125a6565b6001600160a01b03808c16600090815260036020908152604080832094909455918c1681526004909152205461304e9088612460565b6001600160a01b038a1660009081526004602090815260408083209390935560039052205461307d9083612460565b6001600160a01b038a1660009081526003602052604090205561309f85613502565b6130a884613502565b6130b2818761358b565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef896040516130f791815260200190565b60405180910390a350505050505050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613140576131406138c4565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131e291906139dc565b816001815181106131f5576131f56138c4565b60200260200101906001600160a01b031690816001600160a01b031681525050613240307f000000000000000000000000000000000000000000000000000000000000000084611e20565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906132959085906000908690309042906004016139f9565b600060405180830381600087803b1580156132af57600080fd5b505af11580156123b9573d6000803e3d6000fd5b6132ee307f000000000000000000000000000000000000000000000000000000000000000084611e20565b60105460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000009091169063f305d71990839060c40160606040518083038185885af115801561337d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ce89190613a6a565b6000806000806133b1856124bf565b935093509350935060008060006133cd888787876113df6123fb565b6001600160a01b038d1660009081526004602052604090205492955090935091506133f890896125a6565b6001600160a01b038b1660009081526004602090815260408083209390935560039052205461342790846125a6565b6001600160a01b03808c1660009081526003602052604080822093909355908b168152205461307d9083612460565b600080600080613465856124bf565b93509350935093506000806000613481888787876113df6123fb565b6001600160a01b038d16600090815260036020526040902054929550909350915061301890846125a6565b6000806000806134bb856124bf565b935093509350935060008060006134d7888787876113df6123fb565b6001600160a01b038d16600090815260036020526040902054929550909350915061342790846125a6565b600061350c6123fb565b9050600061351a8383612f14565b306000908152600360205260409020549091506135379082612460565b3060009081526003602090815260408083209390935560079052205460ff161561358657306000908152600460205260409020546135759084612460565b306000908152600460205260409020555b505050565b600b5461359890836125a6565b600b55600c546135a89082612460565b600c555050565b6001600160a01b03811681146135c457600080fd5b50565b6000602082840312156135d957600080fd5b8135611002816135af565b6000806000606084860312156135f957600080fd5b8335613604816135af565b92506020840135613614816135af565b929592945050506040919091013590565b600060208083528351808285015260005b8181101561365257858101830151858201604001528201613636565b81811115613664576000604083870101525b50601f01601f1916929092016040019392505050565b6000806040838503121561368d57600080fd5b8235613698816135af565b946020939093013593505050565b803561ffff811681146136b857600080fd5b919050565b600080600080600060a086880312156136d557600080fd5b6136de866136a6565b94506136ec602087016136a6565b93506136fa604087016136a6565b9250613708606087016136a6565b9150613716608087016136a6565b90509295509295909350565b60006020828403121561373457600080fd5b5035919050565b80151581146135c457600080fd5b6000806040838503121561375c57600080fd5b82359150602083013561376e8161373b565b809150509250929050565b60006020828403121561378b57600080fd5b81356110028161373b565b600080604083850312156137a957600080fd5b82356137b4816135af565b9150602083013561376e816135af565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561380b57600080fd5b81516110028161373b565b600181811c9082168061382a57607f821691505b6020821081141561384b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600061ffff80831681851680830382111561388457613884613851565b01949350505050565b6020808252601d908201527f596f752063616e27742073657420666565732068696768657220323525000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6000828210156138ec576138ec613851565b500390565b634e487b7160e01b600052603160045260246000fd5b600060001982141561391b5761391b613851565b5060010190565b6000821982111561393557613935613851565b500190565b60008261395757634e487b7160e01b600052601260045260246000fd5b500490565b6020808252601f908201527f596f752043616e27742073657420536d616c6c6572207468616e20302e312500604082015260600190565b600061ffff808316818516818304811182151516156139b4576139b4613851565b02949350505050565b60008160001904831182151516156139d7576139d7613851565b500290565b6000602082840312156139ee57600080fd5b8151611002816135af565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613a495784516001600160a01b031683529383019391830191600101613a24565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215613a7f57600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122077801296e0742bc96d19c892bdca3d228f34b5b887b47d9cc3ee1cbc8f4c0f7b64736f6c634300080a0033

Deployed Bytecode

0x6080604052600436106103905760003560e01c806366d602ae116101dc578063aacebbe311610102578063dd62ed3e116100a0578063ec28438a1161006f578063ec28438a14610b73578063f0f165af14610b93578063f2fde38b14610bb3578063f34eb0b814610bd357600080fd5b8063dd62ed3e14610acd578063e99c9d0914610b13578063ea1644d514610b33578063ea2f0b3714610b5357600080fd5b8063c49b9a80116100dc578063c49b9a8014610a3e578063d12a768814610a5e578063d94160e014610a74578063dd46706414610aad57600080fd5b8063aacebbe3146109c5578063acb2ad6f146109e5578063b6c5232414610a2957600080fd5b80638ea5220f1161017a578063a457c2d711610149578063a457c2d71461095a578063a69df4b51461097a578063a9059cbb1461098f578063a9e75723146109af57600080fd5b80638ea5220f146108ef5780638f3fa8601461090f57806391d919a91461092557806395d89b411461094557600080fd5b806375f0a874116101b657806375f0a8741461086257806388e765ff1461088257806388f82020146108985780638da5cb5b146108d157600080fd5b806366d602ae1461081757806370a082311461082d578063715018a61461084d57600080fd5b8063313ce567116102c15780634549b0391161025f5780634cfd4a921161022e5780634cfd4a921461077e57806352390c021461079e5780635342acb4146107be5780635d60c7be146107f757600080fd5b80634549b039146106c557806347062402146106e557806349bd5a5e146107295780634a74bb021461075d57600080fd5b806338c4f8141161029b57806338c4f8141461064557806339509351146106655780633bd5d17314610685578063437823ec146106a557600080fd5b8063313ce567146105ee578063364333f4146106105780633685d4191461062557600080fd5b80631465d9291161032e5780631816467f116103085780631816467f1461051557806323b872dd146105355780632b14ca56146105555780632d838119146105ce57600080fd5b80631465d929146104ac5780631694505e146104cc57806318160ddd1461050057600080fd5b806306fdde031161036a57806306fdde031461041b578063095ea7b31461043d5780630bd3a7f91461046d57806313114a9d1461048d57600080fd5b806304dacd501461039c5780630659ce5c146103be57806306ee6ad8146103de57600080fd5b3661039757005b600080fd5b3480156103a857600080fd5b506103bc6103b73660046135c7565b610bf3565b005b3480156103ca57600080fd5b506103bc6103d93660046135e4565b610c48565b3480156103ea57600080fd5b50600f546103fe906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561042757600080fd5b50610430610cef565b6040516104129190613625565b34801561044957600080fd5b5061045d61045836600461367a565b610d81565b6040519015158152602001610412565b34801561047957600080fd5b506103bc6104883660046135c7565b610d98565b34801561049957600080fd5b50600c545b604051908152602001610412565b3480156104b857600080fd5b506103bc6104c73660046136bd565b610de6565b3480156104d857600080fd5b506103fe7f000000000000000000000000145677fc4d9b8f19b5d56d1820c48e0443049a3081565b34801561050c57600080fd5b50600a5461049e565b34801561052157600080fd5b506103bc6105303660046135c7565b610ed0565b34801561054157600080fd5b5061045d6105503660046135e4565b610f1c565b34801561056157600080fd5b506016546105999061ffff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b9091041685565b6040805161ffff968716815294861660208601529285169284019290925283166060830152909116608082015260a001610412565b3480156105da57600080fd5b5061049e6105e9366004613722565b610f85565b3480156105fa57600080fd5b5060135460405160ff9091168152602001610412565b34801561061c57600080fd5b506103bc611009565b34801561063157600080fd5b506103bc6106403660046135c7565b611071565b34801561065157600080fd5b506103bc6106603660046136bd565b611224565b34801561067157600080fd5b5061045d61068036600461367a565b61130e565b34801561069157600080fd5b506103bc6106a0366004613722565b611344565b3480156106b157600080fd5b506103bc6106c03660046135c7565b61144d565b3480156106d157600080fd5b5061049e6106e0366004613749565b61149b565b3480156106f157600080fd5b506015546105999061ffff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b9091041685565b34801561073557600080fd5b506103fe7f000000000000000000000000098c105073cddc9440dd18850a398ddf545f24b081565b34801561076957600080fd5b5060175461045d90600160581b900460ff1681565b34801561078a57600080fd5b506103bc6107993660046136bd565b611538565b3480156107aa57600080fd5b506103bc6107b93660046135c7565b611622565b3480156107ca57600080fd5b5061045d6107d93660046135c7565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561080357600080fd5b506010546103fe906001600160a01b031681565b34801561082357600080fd5b5061049e601a5481565b34801561083957600080fd5b5061049e6108483660046135c7565b611775565b34801561085957600080fd5b506103bc6117d4565b34801561086e57600080fd5b50600d546103fe906001600160a01b031681565b34801561088e57600080fd5b5061049e60195481565b3480156108a457600080fd5b5061045d6108b33660046135c7565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156108dd57600080fd5b506000546001600160a01b03166103fe565b3480156108fb57600080fd5b50600e546103fe906001600160a01b031681565b34801561091b57600080fd5b5061049e601b5481565b34801561093157600080fd5b506103bc6109403660046135c7565b611836565b34801561095157600080fd5b50610430611881565b34801561096657600080fd5b5061045d61097536600461367a565b611890565b34801561098657600080fd5b506103bc6118df565b34801561099b57600080fd5b5061045d6109aa36600461367a565b6119f6565b3480156109bb57600080fd5b5061049e60185481565b3480156109d157600080fd5b506103bc6109e03660046135c7565b611a03565b3480156109f157600080fd5b506014546105999061ffff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b9091041685565b348015610a3557600080fd5b5060025461049e565b348015610a4a57600080fd5b506103bc610a59366004613779565b611a4f565b348015610a6a57600080fd5b5061049e601c5481565b348015610a8057600080fd5b5061045d610a8f3660046135c7565b6001600160a01b031660009081526009602052604090205460ff1690565b348015610ab957600080fd5b506103bc610ac8366004613722565b611ad1565b348015610ad957600080fd5b5061049e610ae8366004613796565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610b1f57600080fd5b506103bc610b2e366004613722565b611b56565b348015610b3f57600080fd5b506103bc610b4e366004613722565b611bb4565b348015610b5f57600080fd5b506103bc610b6e3660046135c7565b611c12565b348015610b7f57600080fd5b506103bc610b8e366004613722565b611c5d565b348015610b9f57600080fd5b506103bc610bae366004613722565b611cbb565b348015610bbf57600080fd5b506103bc610bce3660046135c7565b611cea565b348015610bdf57600080fd5b506103bc610bee366004613722565b611dc2565b6000546001600160a01b03163314610c265760405162461bcd60e51b8152600401610c1d906137c4565b60405180910390fd5b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610c725760405162461bcd60e51b8152600401610c1d906137c4565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284919082169063a9059cbb906044016020604051808303816000875af1158015610cc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce891906137f9565b5050505050565b606060118054610cfe90613816565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2a90613816565b8015610d775780601f10610d4c57610100808354040283529160200191610d77565b820191906000526020600020905b815481529060010190602001808311610d5a57829003601f168201915b5050505050905090565b6000610d8e338484611e20565b5060015b92915050565b6000546001600160a01b03163314610dc25760405162461bcd60e51b8152600401610c1d906137c4565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b6000546001600160a01b03163314610e105760405162461bcd60e51b8152600401610c1d906137c4565b6019818385610e1f888a613867565b610e299190613867565b610e339190613867565b610e3d9190613867565b61ffff161115610e5f5760405162461bcd60e51b8152600401610c1d9061388d565b6015805461ffff928316600160401b0261ffff60401b19968416620100000263ffff000019968516600160201b029690961665ffffffff000019958516600160301b0267ffff00000000ffff1990931694909816939093171792909216949094179190911791909116919091179055565b6000546001600160a01b03163314610efa5760405162461bcd60e51b8152600401610c1d906137c4565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000610f29848484611f44565b610f7b8433610f7685604051806060016040528060288152602001613a99602891396001600160a01b038a16600090815260056020908152604080832033845290915290205491906123c1565b611e20565b5060019392505050565b6000600b54821115610fec5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610c1d565b6000610ff66123fb565b9050611002838261241e565b9392505050565b6000546001600160a01b031633146110335760405162461bcd60e51b8152600401610c1d906137c4565b600d5460405147916001600160a01b03169082156108fc029083906000818181858888f1935050505015801561106d573d6000803e3d6000fd5b5050565b6000546001600160a01b0316331461109b5760405162461bcd60e51b8152600401610c1d906137c4565b6001600160a01b03811660009081526007602052604090205460ff166111035760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610c1d565b60005b60085481101561106d57816001600160a01b03166008828154811061112d5761112d6138c4565b6000918252602090912001546001600160a01b031614156112125760088054611158906001906138da565b81548110611168576111686138c4565b600091825260209091200154600880546001600160a01b039092169183908110611194576111946138c4565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600482526040808220829055600790925220805460ff1916905560088054806111ec576111ec6138f1565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b8061121c81613907565b915050611106565b6000546001600160a01b0316331461124e5760405162461bcd60e51b8152600401610c1d906137c4565b601981838561125d888a613867565b6112679190613867565b6112719190613867565b61127b9190613867565b61ffff16111561129d5760405162461bcd60e51b8152600401610c1d9061388d565b6014805461ffff928316600160401b0261ffff60401b19968416620100000263ffff000019968516600160201b029690961665ffffffff000019958516600160301b0267ffff00000000ffff1990931694909816939093171792909216949094179190911791909116919091179055565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610d8e918590610f769086612460565b3360008181526007602052604090205460ff16156113b95760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610c1d565b60008060006113c7856124bf565b5092509250925060006113e4868585856113df6123fb565b612544565b50506001600160a01b03861660009081526003602052604090205490915061140c90826125a6565b6001600160a01b038616600090815260036020526040902055600b5461143290826125a6565b600b55600c546114429087612460565b600c55505050505050565b6000546001600160a01b031633146114775760405162461bcd60e51b8152600401610c1d906137c4565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6000600a548311156114ef5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610c1d565b60008060006114fd866124bf565b50925092509250600080611516888686866113df6123fb565b50915091508661152c57509350610d9292505050565b9450610d929350505050565b6000546001600160a01b031633146115625760405162461bcd60e51b8152600401610c1d906137c4565b6019818385611571888a613867565b61157b9190613867565b6115859190613867565b61158f9190613867565b61ffff1611156115b15760405162461bcd60e51b8152600401610c1d9061388d565b6016805461ffff928316600160401b0261ffff60401b19968416620100000263ffff000019968516600160201b029690961665ffffffff000019958516600160301b0267ffff00000000ffff1990931694909816939093171792909216949094179190911791909116919091179055565b6000546001600160a01b0316331461164c5760405162461bcd60e51b8152600401610c1d906137c4565b6001600160a01b03811660009081526007602052604090205460ff16156116b55760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610c1d565b6001600160a01b0381166000908152600360205260409020541561170f576001600160a01b0381166000908152600360205260409020546116f590610f85565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600760205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6001600160a01b03811660009081526007602052604081205460ff16156117b257506001600160a01b031660009081526004602052604090205490565b6001600160a01b038216600090815260036020526040902054610d9290610f85565b6000546001600160a01b031633146117fe5760405162461bcd60e51b8152600401610c1d906137c4565b600080546040516001600160a01b0390911690600080516020613ac1833981519152908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146118605760405162461bcd60e51b8152600401610c1d906137c4565b6001600160a01b03166000908152600960205260409020805460ff19169055565b606060128054610cfe90613816565b6000610d8e3384610f7685604051806060016040528060258152602001613ae1602591393360009081526005602090815260408083206001600160a01b038d16845290915290205491906123c1565b6001546001600160a01b031633146119455760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b6064820152608401610c1d565b60025442116119a45760405162461bcd60e51b815260206004820152602560248201527f436f6e7472616374206973206c6f636b656420756e74696c2061206c61746572604482015264206461746560d81b6064820152608401610c1d565b600154600080546040516001600160a01b039384169390911691600080516020613ac183398151915291a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000610d8e338484611f44565b6000546001600160a01b03163314611a2d5760405162461bcd60e51b8152600401610c1d906137c4565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611a795760405162461bcd60e51b8152600401610c1d906137c4565b60178054821515600160581b0260ff60581b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611ac690831515815260200190565b60405180910390a150565b6000546001600160a01b03163314611afb5760405162461bcd60e51b8152600401610c1d906137c4565b60008054600180546001600160a01b03199081166001600160a01b03841617909155169055611b2a8142613922565b600255600080546040516001600160a01b0390911690600080516020613ac1833981519152908390a350565b6000546001600160a01b03163314611b805760405162461bcd60e51b8152600401610c1d906137c4565b6103e8600a54611b90919061393a565b811015611baf5760405162461bcd60e51b8152600401610c1d9061395c565b601a55565b6000546001600160a01b03163314611bde5760405162461bcd60e51b8152600401610c1d906137c4565b6103e8600a54611bee919061393a565b811015611c0d5760405162461bcd60e51b8152600401610c1d9061395c565b601b55565b6000546001600160a01b03163314611c3c5760405162461bcd60e51b8152600401610c1d906137c4565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b03163314611c875760405162461bcd60e51b8152600401610c1d906137c4565b6103e8600a54611c97919061393a565b811015611cb65760405162461bcd60e51b8152600401610c1d9061395c565b601855565b6000546001600160a01b03163314611ce55760405162461bcd60e51b8152600401610c1d906137c4565b601c55565b6000546001600160a01b03163314611d145760405162461bcd60e51b8152600401610c1d906137c4565b6001600160a01b038116611d795760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c1d565b600080546040516001600160a01b0380851693921691600080516020613ac183398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611dec5760405162461bcd60e51b8152600401610c1d906137c4565b6103e8600a54611dfc919061393a565b811015611e1b5760405162461bcd60e51b8152600401610c1d9061395c565b601955565b6001600160a01b038316611e825760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c1d565b6001600160a01b038216611ee35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c1d565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611fa85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c1d565b6001600160a01b03821661200a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c1d565b6000811161206c5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610c1d565b600061207730611775565b9050601854811061208757506018545b601c54811080159081906120a55750601754600160501b900460ff16155b80156120e357507f000000000000000000000000098c105073cddc9440dd18850a398ddf545f24b06001600160a01b0316856001600160a01b031614155b80156120f85750601754600160581b900460ff165b1561210b57601c54915061210b826125e8565b6001600160a01b03851660009081526006602052604090205460019060ff168061214d57506001600160a01b03851660009081526006602052604090205460ff165b15612156575060005b80156123ad576001600160a01b03861660009081526009602052604090205460ff1615801561219e57506001600160a01b03851660009081526009602052604090205460ff16155b156123ad5760185484111561220c5760405162461bcd60e51b815260206004820152602e60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785460448201526d3930b739b332b920b6b7bab73a1760911b6064820152608401610c1d565b7f000000000000000000000000098c105073cddc9440dd18850a398ddf545f24b06001600160a01b0316866001600160a01b0316141561231357601b5461225286611775565b61225c9086613922565b11156122b55760405162461bcd60e51b815260206004820152602260248201527f526563697069656e742065786365656473206d61782077616c6c65742073697a604482015261329760f11b6064820152608401610c1d565b6019548411156123135760405162461bcd60e51b8152602060048201526024808201527f42757920616d6f756e74206578636565647320746865206d6178427579416d6f6044820152633ab73a1760e11b6064820152608401610c1d565b7f000000000000000000000000098c105073cddc9440dd18850a398ddf545f24b06001600160a01b0316856001600160a01b031614156123ad57601a548411156123ad5760405162461bcd60e51b815260206004820152602560248201527f53656c6c20616d6f756e74206578636565647320746865206d617853656c6c4160448201526436b7baba1760d91b6064820152608401610c1d565b6123b986868684612962565b505050505050565b600081848411156123e55760405162461bcd60e51b8152600401610c1d9190613625565b5060006123f284866138da565b95945050505050565b6000806000612408612cbb565b9092509050612417828261241e565b9250505090565b600061100283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e3d565b60008061246d8385613922565b9050838110156110025760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c1d565b60008060008060006124d086612e6b565b905060006124dd87612e8d565b905060006124ea88612eaf565b6124f389612ed2565b6124fc8a612ef5565b6125069190613922565b6125109190613922565b90506000612528836125228b876125a6565b906125a6565b905061253481836125a6565b9993985091965094509092505050565b60008080806125538986612f14565b905060006125618987612f14565b9050600061256f8988612f14565b9050600061257d8989612f14565b9050600061259182612522858189896125a6565b949d949c50929a509298505050505050505050565b600061100283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506123c1565b6017805460ff60501b1916600160501b17905560165460155460009161ffff600160401b808304821693908104821692600160301b808204841693908304811692600160201b808404831693908204831692612651926201000092839004821692900416613867565b61265b9190613867565b6126659190613867565b61266f9190613867565b6126799190613867565b6126839190613867565b61268d9190613867565b612698906002613993565b60165460155461ffff928316935060009284926126c392620100009182900483169291900416613867565b6126d19061ffff16856139bd565b6126db919061393a565b60165460155491925060009184916127059161ffff600160201b9283900481169290910416613867565b6127139061ffff16866139bd565b61271e9060026139bd565b612728919061393a565b600f549091506127439030906001600160a01b031683612f93565b600061274f8284613922565b61275990866138da565b9050476127658261310b565b600061277182476138da565b6016546015549192506000916127999161ffff62010000918290048116929190910416613867565b6127a79061ffff16886138da565b6127b1908361393a565b6016546015549192506000916127d99161ffff62010000918290048116929190910416613867565b6127e79061ffff16836139bd565b905080156127f9576127f987826132c3565b60165460155460009161281e9161ffff600160301b9283900481169290910416613867565b61ffff1661282d8460026139bd565b61283791906139bd565b60165460155491925060009147916128619161ffff600160401b9283900481169290910416613867565b61ffff166128708660026139bd565b61287a91906139bd565b116128c0576016546015546128a29161ffff600160401b918290048116929190910416613867565b61ffff166128b18560026139bd565b6128bb91906139bd565b6128c2565b475b9050811561290657600d546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015612904573d6000803e3d6000fd5b505b801561294857600e546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612946573d6000803e3d6000fd5b505b50506017805460ff60501b19169055505050505050505050565b8015612b49576129806017805469ffffffffffffffffffff19169055565b7f000000000000000000000000098c105073cddc9440dd18850a398ddf545f24b06001600160a01b0316846001600160a01b03161415612a2d576015546017805461ffff80841663ffffffff1990921691909117620100008085048316021767ffffffff000000001916600160201b80850483160261ffff60301b191617600160301b8085048316021761ffff60401b1916600160401b9384900491909116909202919091179055612b49565b7f000000000000000000000000098c105073cddc9440dd18850a398ddf545f24b06001600160a01b0316836001600160a01b03161415612ada576016546017805461ffff80841663ffffffff1990921691909117620100008085048316021767ffffffff000000001916600160201b80850483160261ffff60301b191617600160301b8085048316021761ffff60401b1916600160401b9384900491909116909202919091179055612b49565b6014546017805461ffff80841663ffffffff1990921691909117620100008085048316021767ffffffff000000001916600160201b80850483160261ffff60301b191617600160301b8085048316021761ffff60401b1916600160401b93849004919091169092029190911790555b6001600160a01b03841660009081526007602052604090205460ff168015612b8a57506001600160a01b03831660009081526007602052604090205460ff16155b15612b9f57612b9a8484846133a2565b612c9d565b6001600160a01b03841660009081526007602052604090205460ff16158015612be057506001600160a01b03831660009081526007602052604090205460ff165b15612bf057612b9a848484613456565b6001600160a01b03841660009081526007602052604090205460ff16158015612c3257506001600160a01b03831660009081526007602052604090205460ff16155b15612c4257612b9a8484846134ac565b6001600160a01b03841660009081526007602052604090205460ff168015612c8257506001600160a01b03831660009081526007602052604090205460ff165b15612c9257612b9a848484612f93565b612c9d8484846134ac565b612cb56017805469ffffffffffffffffffff19169055565b50505050565b600b54600a546000918291825b600854811015612e0d57826003600060088481548110612cea57612cea6138c4565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612d555750816004600060088481548110612d2e57612d2e6138c4565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612d6b57600b54600a54945094505050509091565b612db16003600060088481548110612d8557612d856138c4565b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906125a6565b9250612df96004600060088481548110612dcd57612dcd6138c4565b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906125a6565b915080612e0581613907565b915050612cc8565b50600a54600b54612e1d9161241e565b821015612e3457600b54600a549350935050509091565b90939092509050565b60008183612e5e5760405162461bcd60e51b8152600401610c1d9190613625565b5060006123f2848661393a565b601754600090610d9290606490612e8790859061ffff16612f14565b9061241e565b601754600090610d9290606490612e8790859062010000900461ffff16612f14565b601754600090610d9290606490612e87908590600160201b900461ffff16612f14565b601754600090610d9290606490612e87908590600160401b900461ffff16612f14565b601754600090610d9290606490612e87908590600160301b900461ffff165b600082612f2357506000610d92565b6000612f2f83856139bd565b905082612f3c858361393a565b146110025760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610c1d565b600080600080612fa2856124bf565b93509350935093506000806000612fbe888787876113df6123fb565b6001600160a01b038d166000908152600460205260409020549295509093509150612fe990896125a6565b6001600160a01b038b1660009081526004602090815260408083209390935560039052205461301890846125a6565b6001600160a01b03808c16600090815260036020908152604080832094909455918c1681526004909152205461304e9088612460565b6001600160a01b038a1660009081526004602090815260408083209390935560039052205461307d9083612460565b6001600160a01b038a1660009081526003602052604090205561309f85613502565b6130a884613502565b6130b2818761358b565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef896040516130f791815260200190565b60405180910390a350505050505050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613140576131406138c4565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000145677fc4d9b8f19b5d56d1820c48e0443049a306001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131e291906139dc565b816001815181106131f5576131f56138c4565b60200260200101906001600160a01b031690816001600160a01b031681525050613240307f000000000000000000000000145677fc4d9b8f19b5d56d1820c48e0443049a3084611e20565b60405163791ac94760e01b81526001600160a01b037f000000000000000000000000145677fc4d9b8f19b5d56d1820c48e0443049a30169063791ac947906132959085906000908690309042906004016139f9565b600060405180830381600087803b1580156132af57600080fd5b505af11580156123b9573d6000803e3d6000fd5b6132ee307f000000000000000000000000145677fc4d9b8f19b5d56d1820c48e0443049a3084611e20565b60105460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f000000000000000000000000145677fc4d9b8f19b5d56d1820c48e0443049a309091169063f305d71990839060c40160606040518083038185885af115801561337d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ce89190613a6a565b6000806000806133b1856124bf565b935093509350935060008060006133cd888787876113df6123fb565b6001600160a01b038d1660009081526004602052604090205492955090935091506133f890896125a6565b6001600160a01b038b1660009081526004602090815260408083209390935560039052205461342790846125a6565b6001600160a01b03808c1660009081526003602052604080822093909355908b168152205461307d9083612460565b600080600080613465856124bf565b93509350935093506000806000613481888787876113df6123fb565b6001600160a01b038d16600090815260036020526040902054929550909350915061301890846125a6565b6000806000806134bb856124bf565b935093509350935060008060006134d7888787876113df6123fb565b6001600160a01b038d16600090815260036020526040902054929550909350915061342790846125a6565b600061350c6123fb565b9050600061351a8383612f14565b306000908152600360205260409020549091506135379082612460565b3060009081526003602090815260408083209390935560079052205460ff161561358657306000908152600460205260409020546135759084612460565b306000908152600460205260409020555b505050565b600b5461359890836125a6565b600b55600c546135a89082612460565b600c555050565b6001600160a01b03811681146135c457600080fd5b50565b6000602082840312156135d957600080fd5b8135611002816135af565b6000806000606084860312156135f957600080fd5b8335613604816135af565b92506020840135613614816135af565b929592945050506040919091013590565b600060208083528351808285015260005b8181101561365257858101830151858201604001528201613636565b81811115613664576000604083870101525b50601f01601f1916929092016040019392505050565b6000806040838503121561368d57600080fd5b8235613698816135af565b946020939093013593505050565b803561ffff811681146136b857600080fd5b919050565b600080600080600060a086880312156136d557600080fd5b6136de866136a6565b94506136ec602087016136a6565b93506136fa604087016136a6565b9250613708606087016136a6565b9150613716608087016136a6565b90509295509295909350565b60006020828403121561373457600080fd5b5035919050565b80151581146135c457600080fd5b6000806040838503121561375c57600080fd5b82359150602083013561376e8161373b565b809150509250929050565b60006020828403121561378b57600080fd5b81356110028161373b565b600080604083850312156137a957600080fd5b82356137b4816135af565b9150602083013561376e816135af565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561380b57600080fd5b81516110028161373b565b600181811c9082168061382a57607f821691505b6020821081141561384b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600061ffff80831681851680830382111561388457613884613851565b01949350505050565b6020808252601d908201527f596f752063616e27742073657420666565732068696768657220323525000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6000828210156138ec576138ec613851565b500390565b634e487b7160e01b600052603160045260246000fd5b600060001982141561391b5761391b613851565b5060010190565b6000821982111561393557613935613851565b500190565b60008261395757634e487b7160e01b600052601260045260246000fd5b500490565b6020808252601f908201527f596f752043616e27742073657420536d616c6c6572207468616e20302e312500604082015260600190565b600061ffff808316818516818304811182151516156139b4576139b4613851565b02949350505050565b60008160001904831182151516156139d7576139d7613851565b500290565b6000602082840312156139ee57600080fd5b8151611002816135af565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613a495784516001600160a01b031683529383019391830191600101613a24565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215613a7f57600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122077801296e0742bc96d19c892bdca3d228f34b5b887b47d9cc3ee1cbc8f4c0f7b64736f6c634300080a0033

Deployed ByteCode Sourcemap

28611:29034:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37530:121;;;;;;;;;;-1:-1:-1;37530:121:0;;;;;:::i;:::-;;:::i;:::-;;57426:216;;;;;;;;;;-1:-1:-1;57426:216:0;;;;;:::i;:::-;;:::i;29507:90::-;;;;;;;;;;-1:-1:-1;29507:90:0;;;;-1:-1:-1;;;;;29507:90:0;;;;;;-1:-1:-1;;;;;1083:32:1;;;1065:51;;1053:2;1038:18;29507:90:0;;;;;;;;33005:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33990:193::-;;;;;;;;;;-1:-1:-1;33990:193:0;;;;;:::i;:::-;;:::i;:::-;;;2222:14:1;;2215:22;2197:41;;2185:2;2170:18;33990:193:0;2057:187:1;38721:115:0;;;;;;;;;;-1:-1:-1;38721:115:0;;;;;:::i;:::-;;:::i;35489:87::-;;;;;;;;;;-1:-1:-1;35558:10:0;;35489:87;;;2655:25:1;;;2643:2;2628:18;35489:87:0;2509:177:1;39423:443:0;;;;;;;;;;-1:-1:-1;39423:443:0;;;;;:::i;:::-;;:::i;30499:51::-;;;;;;;;;;;;;;;33282:95;;;;;;;;;;-1:-1:-1;33362:7:0;;33282:95;;37409:113;;;;;;;;;;-1:-1:-1;37409:113:0;;;;;:::i;:::-;;:::i;34191:446::-;;;;;;;;;;-1:-1:-1;34191:446:0;;;;;:::i;:::-;;:::i;30302:22::-;;;;;;;;;;-1:-1:-1;30302:22:0;;;;;;;;;;;;;;;-1:-1:-1;;;30302:22:0;;;;;-1:-1:-1;;;30302:22:0;;;;;-1:-1:-1;;;30302:22:0;;;;;;;;;;3828:6:1;3861:15;;;3843:34;;3913:15;;;3908:2;3893:18;;3886:43;3965:15;;;3945:18;;;3938:43;;;;4017:15;;4012:2;3997:18;;3990:43;4070:15;;;4064:3;4049:19;;4042:44;3805:3;3790:19;30302:22:0;3569:523:1;36944:322:0;;;;;;;;;;-1:-1:-1;36944:322:0;;;;;:::i;:::-;;:::i;33191:83::-;;;;;;;;;;-1:-1:-1;33257:9:0;;33191:83;;33257:9;;;;4424:36:1;;4412:2;4397:18;33191:83:0;4282:184:1;57263:155:0;;;;;;;;;;;;;:::i;37999:473::-;;;;;;;;;;-1:-1:-1;37999:473:0;;;;;:::i;:::-;;:::i;39874:::-;;;;;;;;;;-1:-1:-1;39874:473:0;;;;;:::i;:::-;;:::i;34645:300::-;;;;;;;;;;-1:-1:-1;34645:300:0;;;;;:::i;:::-;;:::i;35584:668::-;;;;;;;;;;-1:-1:-1;35584:668:0;;;;;:::i;:::-;;:::i;38480:111::-;;;;;;;;;;-1:-1:-1;38480:111:0;;;;;:::i;:::-;;:::i;36260:676::-;;;;;;;;;;-1:-1:-1;36260:676:0;;;;;:::i;:::-;;:::i;30275:20::-;;;;;;;;;;-1:-1:-1;30275:20:0;;;;;;;;;;;;;;;-1:-1:-1;;;30275:20:0;;;;;-1:-1:-1;;;30275:20:0;;;;;-1:-1:-1;;;30275:20:0;;;;;;30557:38;;;;;;;;;;;;;;;30632:40;;;;;;;;;;-1:-1:-1;30632:40:0;;;;-1:-1:-1;;;30632:40:0;;;;;;38966:449;;;;;;;;;;-1:-1:-1;38966:449:0;;;;;:::i;:::-;;:::i;37659:332::-;;;;;;;;;;-1:-1:-1;37659:332:0;;;;;:::i;:::-;;:::i;46304:124::-;;;;;;;;;;-1:-1:-1;46304:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;46393:27:0;46369:4;46393:27;;;:18;:27;;;;;;;;;46304:124;29604:37;;;;;;;;;;-1:-1:-1;29604:37:0;;;;-1:-1:-1;;;;;29604:37:0;;;30796:49;;;;;;;;;;;;;;;;33385:198;;;;;;;;;;-1:-1:-1;33385:198:0;;;;;:::i;:::-;;:::i;17696:148::-;;;;;;;;;;;;;:::i;29315:92::-;;;;;;;;;;-1:-1:-1;29315:92:0;;;;-1:-1:-1;;;;;29315:92:0;;;30741:48;;;;;;;;;;;;;;;;35361:120;;;;;;;;;;-1:-1:-1;35361:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;35453:20:0;35429:4;35453:20;;;:11;:20;;;;;;;;;35361:120;17056:79;;;;;;;;;;-1:-1:-1;17094:7:0;17121:6;-1:-1:-1;;;;;17121:6:0;17056:79;;29414:86;;;;;;;;;;-1:-1:-1;29414:86:0;;;;-1:-1:-1;;;;;29414:86:0;;;30852:49;;;;;;;;;;;;;;;;38844:114;;;;;;;;;;-1:-1:-1;38844:114:0;;;;;:::i;:::-;;:::i;33096:87::-;;;;;;;;;;;;;:::i;34953:400::-;;;;;;;;;;-1:-1:-1;34953:400:0;;;;;:::i;:::-;;:::i;18750:385::-;;;;;;;;;;;;;:::i;33591:199::-;;;;;;;;;;-1:-1:-1;33591:199:0;;;;;:::i;:::-;;:::i;30681:53::-;;;;;;;;;;;;;;;;37276:125;;;;;;;;;;-1:-1:-1;37276:125:0;;;;;:::i;:::-;;:::i;30238:30::-;;;;;;;;;;-1:-1:-1;30238:30:0;;;;;;;;;;;;;;;-1:-1:-1;;;30238:30:0;;;;;-1:-1:-1;;;30238:30:0;;;;;-1:-1:-1;;;30238:30:0;;;;;;18287:89;;;;;;;;;;-1:-1:-1;18359:9:0;;18287:89;;41374:171;;;;;;;;;;-1:-1:-1;41374:171:0;;;;;:::i;:::-;;:::i;30908:64::-;;;;;;;;;;;;;;;;46436:128;;;;;;;;;;-1:-1:-1;46436:128:0;;;;;:::i;:::-;-1:-1:-1;;;;;46527:29:0;46503:4;46527:29;;;:20;:29;;;;;;;;;46436:128;18452:226;;;;;;;;;;-1:-1:-1;18452:226:0;;;;;:::i;:::-;;:::i;33798:184::-;;;;;;;;;;-1:-1:-1;33798:184:0;;;;;:::i;:::-;-1:-1:-1;;;;;33947:18:0;;;33915:7;33947:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;33798:184;40936:211;;;;;;;;;;-1:-1:-1;40936:211:0;;;;;:::i;:::-;;:::i;41155:::-;;;;;;;;;;-1:-1:-1;41155:211:0;;;;;:::i;:::-;;:::i;38603:110::-;;;;;;;;;;-1:-1:-1;38603:110:0;;;;;:::i;:::-;;:::i;40503:207::-;;;;;;;;;;-1:-1:-1;40503:207:0;;;;;:::i;:::-;;:::i;40355:140::-;;;;;;;;;;-1:-1:-1;40355:140:0;;;;;:::i;:::-;;:::i;17998:281::-;;;;;;;;;;-1:-1:-1;17998:281:0;;;;;:::i;:::-;;:::i;40722:206::-;;;;;;;;;;-1:-1:-1;40722:206:0;;;;;:::i;:::-;;:::i;37530:121::-;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;;;;;;;;;37617:13:::1;:26:::0;;-1:-1:-1;;;;;;37617:26:0::1;-1:-1:-1::0;;;;;37617:26:0;;;::::1;::::0;;;::::1;::::0;;37530:121::o;57426:216::-;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;57594:40:::1;::::0;-1:-1:-1;;;57594:40:0;;-1:-1:-1;;;;;6324:32:1;;;57594:40:0::1;::::0;::::1;6306:51:1::0;6373:18;;;6366:34;;;57570:12:0;;57594:21;;::::1;::::0;::::1;::::0;6279:18:1;;57594:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57530:112;57426:216:::0;;;:::o;33005:83::-;33042:13;33075:5;33068:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33005:83;:::o;33990:193::-;34092:4;34114:39;9120:10;34137:7;34146:6;34114:8;:39::i;:::-;-1:-1:-1;34171:4:0;33990:193;;;;;:::o;38721:115::-;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38792:29:0::1;;::::0;;;:20:::1;:29;::::0;;;;:36;;-1:-1:-1;;38792:36:0::1;38824:4;38792:36;::::0;;38721:115::o;39423:443::-;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;39655:2:::1;39648:3:::0;39636:9;39626:7;39608:15:::1;39614:9:::0;39608:3;:15:::1;:::i;:::-;:25;;;;:::i;:::-;:37;;;;:::i;:::-;:43;;;;:::i;:::-;:49;;;;39600:91;;;;-1:-1:-1::0;;;39600:91:0::1;;;;;;;:::i;:::-;39702:6;:16:::0;;::::1;39842::::0;;::::1;-1:-1:-1::0;;;39842:16:0::1;-1:-1:-1::0;;;;39803:28:0;;::::1;::::0;::::1;-1:-1:-1::0;;39768:24:0;;::::1;-1:-1:-1::0;;;39768:24:0::1;39803:28:::0;;;;-1:-1:-1;;39729:28:0;;::::1;-1:-1:-1::0;;;39729:28:0::1;-1:-1:-1::0;;39729:28:0;;;39702:16;;;::::1;39729:28:::0;;;;::::1;39803::::0;;;;;;;;;;;::::1;39842:16:::0;;;::::1;::::0;;;::::1;::::0;;39423:443::o;37409:113::-;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;37492:9:::1;:22:::0;;-1:-1:-1;;;;;;37492:22:0::1;-1:-1:-1::0;;;;;37492:22:0;;;::::1;::::0;;;::::1;::::0;;37409:113::o;34191:446::-;34323:4;34340:36;34350:6;34358:9;34369:6;34340:9;:36::i;:::-;34387:220;34410:6;9120:10;34458:138;34514:6;34458:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34458:19:0;;;;;;:11;:19;;;;;;;;9120:10;34458:33;;;;;;;;;;:37;:138::i;:::-;34387:8;:220::i;:::-;-1:-1:-1;34625:4:0;34191:446;;;;;:::o;36944:322::-;37038:7;37096;;37085;:18;;37063:110;;;;-1:-1:-1;;;37063:110:0;;7967:2:1;37063:110:0;;;7949:21:1;8006:2;7986:18;;;7979:30;8045:34;8025:18;;;8018:62;-1:-1:-1;;;8096:18:1;;;8089:40;8146:19;;37063:110:0;7765:406:1;37063:110:0;37184:19;37206:10;:8;:10::i;:::-;37184:32;-1:-1:-1;37234:24:0;:7;37184:32;37234:11;:24::i;:::-;37227:31;36944:322;-1:-1:-1;;;36944:322:0:o;57263:155::-;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;57377:15:::1;::::0;57369:41:::1;::::0;57337:21:::1;::::0;-1:-1:-1;;;;;57377:15:0::1;::::0;57369:41;::::1;;;::::0;57337:21;;57320:14:::1;57369:41:::0;57320:14;57369:41;57337:21;57377:15;57369:41;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;57309:109;57263:155::o:0;37999:473::-;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38079:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;38071:56;;;::::0;-1:-1:-1;;;38071:56:0;;8378:2:1;38071:56:0::1;::::0;::::1;8360:21:1::0;8417:2;8397:18;;;8390:30;8456:25;8436:18;;;8429:53;8499:18;;38071:56:0::1;8176:347:1::0;38071:56:0::1;38143:9;38138:327;38162:9;:16:::0;38158:20;::::1;38138:327;;;38220:7;-1:-1:-1::0;;;;;38204:23:0::1;:9;38214:1;38204:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;38204:12:0::1;:23;38200:254;;;38263:9;38273:16:::0;;:20:::1;::::0;38292:1:::1;::::0;38273:20:::1;:::i;:::-;38263:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;38248:9:::1;:12:::0;;-1:-1:-1;;;;;38263:31:0;;::::1;::::0;38258:1;;38248:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;38248:46:0::1;-1:-1:-1::0;;;;;38248:46:0;;::::1;;::::0;;38313:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;38352:11:::1;:20:::0;;;;:28;;-1:-1:-1;;38352:28:0::1;::::0;;38399:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;38399:15:0;;;;;-1:-1:-1;;;;;;38399:15:0::1;::::0;;;;;57369:41:::1;57309:109;57263:155::o:0;38200:254::-:1;38180:3:::0;::::1;::::0;::::1;:::i;:::-;;;;38138:327;;39874:473:::0;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;40111:2:::1;40104:3:::0;40092:9;40082:7;40064:15:::1;40070:9:::0;40064:3;:15:::1;:::i;:::-;:25;;;;:::i;:::-;:37;;;;:::i;:::-;:43;;;;:::i;:::-;:49;;;;40056:91;;;;-1:-1:-1::0;;;40056:91:0::1;;;;;;;:::i;:::-;40158:11;:21:::0;;::::1;40318::::0;;::::1;-1:-1:-1::0;;;40318:21:0::1;-1:-1:-1::0;;;;40274:33:0;;::::1;::::0;::::1;-1:-1:-1::0;;40234:29:0;;::::1;-1:-1:-1::0;;;40234:29:0::1;40274:33:::0;;;;-1:-1:-1;;40190:33:0;;::::1;-1:-1:-1::0;;;40190:33:0::1;-1:-1:-1::0;;40190:33:0;;;40158:21;;;::::1;40190:33:::0;;;;::::1;40274::::0;;;;;;;;;;;::::1;40318:21:::0;;;::::1;::::0;;;::::1;::::0;;39874:473::o;34645:300::-;9120:10;34760:4;34854:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;34854:34:0;;;;;;;;;;34760:4;;34782:133;;34832:7;;34854:50;;34893:10;34854:38;:50::i;35584:668::-;9120:10;35636:14;35699:19;;;:11;:19;;;;;;;;35698:20;35676:114;;;;-1:-1:-1;;;35676:114:0;;9264:2:1;35676:114:0;;;9246:21:1;9303:2;9283:18;;;9276:30;9342:34;9322:18;;;9315:62;-1:-1:-1;;;9393:18:1;;;9386:42;9445:19;;35676:114:0;9062:408:1;35676:114:0;35818:12;35845:18;35878:15;35908:20;35920:7;35908:11;:20::i;:::-;35803:125;;;;;;;35940:15;35962:135;35988:7;36010:4;36029:10;36054:7;36076:10;:8;:10::i;:::-;35962:11;:135::i;:::-;-1:-1:-1;;;;;;;36128:15:0;;;;;;:7;:15;;;;;;35939:158;;-1:-1:-1;36128:28:0;;35939:158;36128:19;:28::i;:::-;-1:-1:-1;;;;;36110:15:0;;;;;;:7;:15;;;;;:46;36177:7;;:20;;36189:7;36177:11;:20::i;:::-;36167:7;:30;36221:10;;:23;;36236:7;36221:14;:23::i;:::-;36208:10;:36;-1:-1:-1;;;;;;35584:668:0:o;38480:111::-;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38549:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;38549:34:0::1;38579:4;38549:34;::::0;;38480:111::o;36260:676::-;36378:7;36422;;36411;:18;;36403:62;;;;-1:-1:-1;;;36403:62:0;;9677:2:1;36403:62:0;;;9659:21:1;9716:2;9696:18;;;9689:30;9755:33;9735:18;;;9728:61;9806:18;;36403:62:0;9475:355:1;36403:62:0;36493:12;36520:18;36553:15;36583:20;36595:7;36583:11;:20::i;:::-;36478:125;;;;;;;36615:15;36632:23;36661:135;36687:7;36709:4;36728:10;36753:7;36775:10;:8;:10::i;36661:135::-;36614:182;;;;;36814:17;36809:120;;-1:-1:-1;36855:7:0;-1:-1:-1;36848:14:0;;-1:-1:-1;;;36848:14:0;36809:120;36902:15;-1:-1:-1;36895:22:0;;-1:-1:-1;;;;36895:22:0;38966:449;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;39199:2:::1;39192:3:::0;39180:9;39170:7;39152:15:::1;39158:9:::0;39152:3;:15:::1;:::i;:::-;:25;;;;:::i;:::-;:37;;;;:::i;:::-;:43;;;;:::i;:::-;:49;;;;39144:91;;;;-1:-1:-1::0;;;39144:91:0::1;;;;;;;:::i;:::-;39246:7;:17:::0;;::::1;39390::::0;;::::1;-1:-1:-1::0;;;39390:17:0::1;-1:-1:-1::0;;;;39350:29:0;;::::1;::::0;::::1;-1:-1:-1::0;;39314:25:0;;::::1;-1:-1:-1::0;;;39314:25:0::1;39350:29:::0;;;;-1:-1:-1;;39274:29:0;;::::1;-1:-1:-1::0;;;39274:29:0::1;-1:-1:-1::0;;39274:29:0;;;39246:17;;;::::1;39274:29:::0;;;;::::1;39350::::0;;;;;;;;;;;::::1;39390:17:::0;;;::::1;::::0;;;::::1;::::0;;38966:449::o;37659:332::-;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37740:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;37739:21;37731:61;;;::::0;-1:-1:-1;;;37731:61:0;;10037:2:1;37731:61:0::1;::::0;::::1;10019:21:1::0;10076:2;10056:18;;;10049:30;10115:29;10095:18;;;10088:57;10162:18;;37731:61:0::1;9835:351:1::0;37731:61:0::1;-1:-1:-1::0;;;;;37807:16:0;::::1;37826:1;37807:16:::0;;;:7:::1;:16;::::0;;;;;:20;37803:109:::1;;-1:-1:-1::0;;;;;37883:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;37863:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;37844:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;37803:109:::1;-1:-1:-1::0;;;;;37922:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;37922:27:0::1;37945:4;37922:27:::0;;::::1;::::0;;;37960:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;37960:23:0::1;::::0;;::::1;::::0;;37659:332::o;33385:198::-;-1:-1:-1;;;;;33475:20:0;;33451:7;33475:20;;;:11;:20;;;;;;;;33471:49;;;-1:-1:-1;;;;;;33504:16:0;;;;;:7;:16;;;;;;;33385:198::o;33471:49::-;-1:-1:-1;;;;;33558:16:0;;;;;;:7;:16;;;;;;33538:37;;:19;:37::i;17696:148::-;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;17803:1:::1;17787:6:::0;;17766:40:::1;::::0;-1:-1:-1;;;;;17787:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;17766:40:0;17803:1;;17766:40:::1;17834:1;17817:19:::0;;-1:-1:-1;;;;;;17817:19:0::1;::::0;;17696:148::o;38844:114::-;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38913:29:0::1;38945:5;38913:29:::0;;;:20:::1;:29;::::0;;;;:37;;-1:-1:-1;;38913:37:0::1;::::0;;38844:114::o;33096:87::-;33135:13;33168:7;33161:14;;;;;:::i;34953:400::-;35073:4;35095:228;9120:10;35145:7;35167:145;35224:15;35167:145;;;;;;;;;;;;;;;;;9120:10;35167:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;35167:34:0;;;;;;;;;;;;:38;:145::i;18750:385::-;18816:14;;-1:-1:-1;;;;;18816:14:0;18834:10;18816:28;18794:113;;;;-1:-1:-1;;;18794:113:0;;10393:2:1;18794:113:0;;;10375:21:1;10432:2;10412:18;;;10405:30;10471:34;10451:18;;;10444:62;-1:-1:-1;;;10522:18:1;;;10515:33;10565:19;;18794:113:0;10191:399:1;18794:113:0;18944:9;;18926:15;:27;18918:77;;;;-1:-1:-1;;;18918:77:0;;10797:2:1;18918:77:0;;;10779:21:1;10836:2;10816:18;;;10809:30;10875:34;10855:18;;;10848:62;-1:-1:-1;;;10926:18:1;;;10919:35;10971:19;;18918:77:0;10595:401:1;18918:77:0;19040:14;;;19032:6;;19011:44;;-1:-1:-1;;;;;19040:14:0;;;;19032:6;;;;-1:-1:-1;;;;;;;;;;;19011:44:0;;19075:14;;;;19066:23;;-1:-1:-1;;;;;;19066:23:0;;;-1:-1:-1;;;;;19075:14:0;;19066:23;;;;19100:27;;;18750:385::o;33591:199::-;33696:4;33718:42;9120:10;33742:9;33753:6;33718:9;:42::i;37276:125::-;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;37365:15:::1;:28:::0;;-1:-1:-1;;;;;;37365:28:0::1;-1:-1:-1::0;;;;;37365:28:0;;;::::1;::::0;;;::::1;::::0;;37276:125::o;41374:171::-;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;41451:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;41451:32:0::1;-1:-1:-1::0;;;;41451:32:0;;::::1;;::::0;;41499:38:::1;::::0;::::1;::::0;::::1;::::0;41475:8;2222:14:1;2215:22;2197:41;;2185:2;2170:18;;2057:187;41499:38:0::1;;;;;;;;41374:171:::0;:::o;18452:226::-;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;18533:6:::1;::::0;;;18516:23;;-1:-1:-1;;;;;;18516:23:0;;::::1;-1:-1:-1::0;;;;;18533:6:0;::::1;18516:23;::::0;;;18550:19:::1;::::0;;18592:22:::1;18610:4:::0;18592:15:::1;:22;:::i;:::-;18580:9;:34:::0;18667:1:::1;18651:6:::0;;18630:40:::1;::::0;-1:-1:-1;;;;;18651:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;18630:40:0;18667:1;;18630:40:::1;18452:226:::0;:::o;40936:211::-;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;41056:4:::1;41046:7;;:14;;;;:::i;:::-;41026:16;:34;;41018:78;;;;-1:-1:-1::0;;;41018:78:0::1;;;;;;;:::i;:::-;41107:13;:32:::0;40936:211::o;41155:::-;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;41275:4:::1;41265:7;;:14;;;;:::i;:::-;41245:16;:34;;41237:78;;;;-1:-1:-1::0;;;41237:78:0::1;;;;;;;:::i;:::-;41326:13;:32:::0;41155:211::o;38603:110::-;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38670:27:0::1;38700:5;38670:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;38670:35:0::1;::::0;;38603:110::o;40503:207::-;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;40617:4:::1;40607:7;;:14;;;;:::i;:::-;40589;:32;;40581:76;;;;-1:-1:-1::0;;;40581:76:0::1;;;;;;;:::i;:::-;40668:17;:34:::0;40503:207::o;40355:140::-;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;40446:29:::1;:41:::0;40355:140::o;17998:281::-;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18101:22:0;::::1;18079:110;;;::::0;-1:-1:-1;;;18079:110:0;;11918:2:1;18079:110:0::1;::::0;::::1;11900:21:1::0;11957:2;11937:18;;;11930:30;11996:34;11976:18;;;11969:62;-1:-1:-1;;;12047:18:1;;;12040:36;12093:19;;18079:110:0::1;11716:402:1::0;18079:110:0::1;18226:6;::::0;;18205:38:::1;::::0;-1:-1:-1;;;;;18205:38:0;;::::1;::::0;18226:6;::::1;::::0;-1:-1:-1;;;;;;;;;;;18205:38:0;::::1;18254:6;:17:::0;;-1:-1:-1;;;;;;18254:17:0::1;-1:-1:-1::0;;;;;18254:17:0;;;::::1;::::0;;;::::1;::::0;;17998:281::o;40722:206::-;17267:6;;-1:-1:-1;;;;;17267:6:0;9120:10;17267:22;17259:67;;;;-1:-1:-1;;;17259:67:0;;;;;;;:::i;:::-;40839:4:::1;40829:7;;:14;;;;:::i;:::-;40810:15;:33;;40802:77;;;;-1:-1:-1::0;;;40802:77:0::1;;;;;;;:::i;:::-;40890:12;:30:::0;40722:206::o;46572:371::-;-1:-1:-1;;;;;46699:19:0;;46691:68;;;;-1:-1:-1;;;46691:68:0;;12325:2:1;46691:68:0;;;12307:21:1;12364:2;12344:18;;;12337:30;12403:34;12383:18;;;12376:62;-1:-1:-1;;;12454:18:1;;;12447:34;12498:19;;46691:68:0;12123:400:1;46691:68:0;-1:-1:-1;;;;;46778:21:0;;46770:68;;;;-1:-1:-1;;;46770:68:0;;12730:2:1;46770:68:0;;;12712:21:1;12769:2;12749:18;;;12742:30;12808:34;12788:18;;;12781:62;-1:-1:-1;;;12859:18:1;;;12852:32;12901:19;;46770:68:0;12528:398:1;46770:68:0;-1:-1:-1;;;;;46851:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;46903:32;;2655:25:1;;;46903:32:0;;2628:18:1;46903:32:0;;;;;;;46572:371;;;:::o;46951:2583::-;-1:-1:-1;;;;;47073:18:0;;47065:68;;;;-1:-1:-1;;;47065:68:0;;13133:2:1;47065:68:0;;;13115:21:1;13172:2;13152:18;;;13145:30;13211:34;13191:18;;;13184:62;-1:-1:-1;;;13262:18:1;;;13255:35;13307:19;;47065:68:0;12931:401:1;47065:68:0;-1:-1:-1;;;;;47152:16:0;;47144:64;;;;-1:-1:-1;;;47144:64:0;;13539:2:1;47144:64:0;;;13521:21:1;13578:2;13558:18;;;13551:30;13617:34;13597:18;;;13590:62;-1:-1:-1;;;13668:18:1;;;13661:33;13711:19;;47144:64:0;13337:399:1;47144:64:0;47236:1;47227:6;:10;47219:64;;;;-1:-1:-1;;;47219:64:0;;13943:2:1;47219:64:0;;;13925:21:1;13982:2;13962:18;;;13955:30;14021:34;14001:18;;;13994:62;-1:-1:-1;;;14072:18:1;;;14065:39;14121:19;;47219:64:0;13741:405:1;47219:64:0;47578:28;47609:24;47627:4;47609:9;:24::i;:::-;47578:55;;47674:17;;47650:20;:41;47646:114;;-1:-1:-1;47731:17:0;;47646:114;47836:29;;47799:66;;;;;;;47894:53;;-1:-1:-1;47931:16:0;;-1:-1:-1;;;47931:16:0;;;;47930:17;47894:53;:91;;;;;47972:13;-1:-1:-1;;;;;47964:21:0;:4;-1:-1:-1;;;;;47964:21:0;;;47894:91;:129;;;;-1:-1:-1;48002:21:0;;-1:-1:-1;;;48002:21:0;;;;47894:129;47876:318;;;48073:29;;48050:52;;48146:36;48161:20;48146:14;:36::i;:::-;-1:-1:-1;;;;;48387:24:0;;48267:12;48387:24;;;:18;:24;;;;;;48282:4;;48387:24;;;:50;;-1:-1:-1;;;;;;48415:22:0;;;;;;:18;:22;;;;;;;;48387:50;48383:98;;;-1:-1:-1;48464:5:0;48383:98;48497:7;48493:914;;;-1:-1:-1;;;;;48526:26:0;;;;;;:20;:26;;;;;;;;48525:27;:56;;;;-1:-1:-1;;;;;;48557:24:0;;;;;;:20;:24;;;;;;;;48556:25;48525:56;48521:875;;;48642:17;;48632:6;:27;;48602:147;;;;-1:-1:-1;;;48602:147:0;;14353:2:1;48602:147:0;;;14335:21:1;14392:2;14372:18;;;14365:30;14431:34;14411:18;;;14404:62;-1:-1:-1;;;14482:18:1;;;14475:44;14536:19;;48602:147:0;14151:410:1;48602:147:0;48782:13;-1:-1:-1;;;;;48774:21:0;:4;-1:-1:-1;;;;;48774:21:0;;48770:396;;;48880:13;;48863;48873:2;48863:9;:13::i;:::-;48854:22;;:6;:22;:::i;:::-;:39;;48820:159;;;;-1:-1:-1;;;48820:159:0;;14768:2:1;48820:159:0;;;14750:21:1;14807:2;14787:18;;;14780:30;14846:34;14826:18;;;14819:62;-1:-1:-1;;;14897:18:1;;;14890:32;14939:19;;48820:159:0;14566:398:1;48820:159:0;49046:12;;49036:6;:22;;49002:144;;;;-1:-1:-1;;;49002:144:0;;15171:2:1;49002:144:0;;;15153:21:1;15210:2;15190:18;;;15183:30;15249:34;15229:18;;;15222:62;-1:-1:-1;;;15300:18:1;;;15293:34;15344:19;;49002:144:0;14969:400:1;49002:144:0;49177:13;-1:-1:-1;;;;;49171:19:0;:2;-1:-1:-1;;;;;49171:19:0;;49167:214;;;49259:13;;49249:6;:23;;49215:146;;;;-1:-1:-1;;;49215:146:0;;15576:2:1;49215:146:0;;;15558:21:1;15615:2;15595:18;;;15588:30;15654:34;15634:18;;;15627:62;-1:-1:-1;;;15705:18:1;;;15698:35;15750:19;;49215:146:0;15374:401:1;49215:146:0;49485:41;49500:4;49506:2;49510:6;49518:7;49485:14;:41::i;:::-;47054:2480;;;46951:2583;;;:::o;5337:226::-;5457:7;5493:12;5485:6;;;;5477:29;;;;-1:-1:-1;;;5477:29:0;;;;;;;;:::i;:::-;-1:-1:-1;5517:9:0;5529:5;5533:1;5529;:5;:::i;:::-;5517:17;5337:226;-1:-1:-1;;;;;5337:226:0:o;43135:164::-;43177:7;43198:15;43215;43234:19;:17;:19::i;:::-;43197:56;;-1:-1:-1;43197:56:0;-1:-1:-1;43271:20:0;43197:56;;43271:11;:20::i;:::-;43264:27;;;;43135:164;:::o;6767:132::-;6825:7;6852:39;6856:1;6859;6852:39;;;;;;;;;;;;;;;;;:3;:39::i;4436:181::-;4494:7;;4526:5;4530:1;4526;:5;:::i;:::-;4514:17;;4555:1;4550;:6;;4542:46;;;;-1:-1:-1;;;4542:46:0;;15982:2:1;4542:46:0;;;15964:21:1;16021:2;16001:18;;;15994:30;16060:29;16040:18;;;16033:57;16107:18;;4542:46:0;15780:351:1;41802:629:0;41903:7;41925;41947;41969;42004:12;42019:24;42035:7;42019:15;:24::i;:::-;42004:39;;42054:18;42075:30;42097:7;42075:21;:30::i;:::-;42054:51;;42116:15;42207:25;42224:7;42207:16;:25::i;:::-;42180:24;42196:7;42180:15;:24::i;:::-;42134:30;42156:7;42134:21;:30::i;:::-;:70;;;;:::i;:::-;:98;;;;:::i;:::-;42116:116;-1:-1:-1;42243:23:0;42269:33;42291:10;42269:17;:7;42281:4;42269:11;:17::i;:::-;:21;;:33::i;:::-;42243:59;-1:-1:-1;42331:28:0;42243:59;42351:7;42331:19;:28::i;:::-;42313:46;42397:4;;-1:-1:-1;42403:10:0;;-1:-1:-1;42403:10:0;-1:-1:-1;41802:629:0;;-1:-1:-1;;;41802:629:0:o;42439:688::-;42664:7;;;;42761:24;:7;42773:11;42761;:24::i;:::-;42743:42;-1:-1:-1;42796:12:0;42811:21;:4;42820:11;42811:8;:21::i;:::-;42796:36;-1:-1:-1;42843:18:0;42864:27;:10;42879:11;42864:14;:27::i;:::-;42843:48;-1:-1:-1;42902:15:0;42920:24;:7;42932:11;42920;:24::i;:::-;42902:42;-1:-1:-1;42955:23:0;42981:88;42902:42;42981:61;43031:10;42981:61;:7;43007:4;42981:25;:31::i;:88::-;43088:7;;;;-1:-1:-1;43114:4:0;;-1:-1:-1;42439:688:0;;-1:-1:-1;;;;;;;;;42439:688:0:o;4899:136::-;4957:7;4984:43;4988:1;4991;4984:43;;;;;;;;;;;;;;;;;:3;:43::i;49542:1896::-;31273:16;:23;;-1:-1:-1;;;;31273:23:0;-1:-1:-1;;;31273:23:0;;;49904:7:::1;:11:::0;49878:6:::1;:10:::0;31273:23;;49904:11:::1;-1:-1:-1::0;;;49904:11:0;;::::1;::::0;::::1;::::0;49878:10;;::::1;::::0;::::1;::::0;-1:-1:-1;;;49845:17:0;;::::1;::::0;::::1;::::0;49813:16;;::::1;::::0;::::1;::::0;-1:-1:-1;;;49782:15:0;;::::1;::::0;::::1;::::0;49752:14;;::::1;::::0;::::1;::::0;49687:49:::1;::::0;49719:17;;;;::::1;::::0;::::1;::::0;49687:16;::::1;;:49;:::i;:::-;:79;;;;:::i;:::-;:110;;;;:::i;:::-;:142;;;;:::i;:::-;:175;;;;:::i;:::-;:201;;;;:::i;:::-;:228;;;;:::i;:::-;49686:234;::::0;49919:1:::1;49686:234;:::i;:::-;50009:7;:17:::0;49990:6:::1;:16:::0;49664:256:::1;::::0;;::::1;::::0;-1:-1:-1;49931:32:0::1;::::0;49664:256;;49990:36:::1;::::0;50009:17;;;;::::1;::::0;::::1;::::0;49990:16;;::::1;;:36;:::i;:::-;49967:60;::::0;::::1;;:6:::0;:60:::1;:::i;:::-;49966:76;;;;:::i;:::-;50121:7;:15:::0;50104:6:::1;:14:::0;49931:111;;-1:-1:-1;50053:23:0::1;::::0;50146:11;;50104:32:::1;::::0;50121:15:::1;-1:-1:-1::0;;;50121:15:0;;;::::1;::::0;::::1;::::0;50104:14;;::::1;;:32;:::i;:::-;50081:56;::::0;::::1;;:6:::0;:56:::1;:::i;:::-;50080:62;::::0;50141:1:::1;50080:62;:::i;:::-;50079:78;;;;:::i;:::-;50205:13;::::0;50053:104;;-1:-1:-1;50168:68:0::1;::::0;50198:4:::1;::::0;-1:-1:-1;;;;;50205:13:0::1;50053:104:::0;50168:21:::1;:68::i;:::-;50247:14;50274:42;50301:15:::0;50274:24;:42:::1;:::i;:::-;50264:53;::::0;:6;:53:::1;:::i;:::-;50247:70:::0;-1:-1:-1;50363:21:0::1;50397:24;50247:70:::0;50397:16:::1;:24::i;:::-;50434:20;50457:38;50481:14:::0;50457:21:::1;:38;:::i;:::-;50591:7;:17:::0;50572:6:::1;:16:::0;50434:61;;-1:-1:-1;50506:19:0::1;::::0;50572:36:::1;::::0;50591:17:::1;::::0;;;;::::1;::::0;::::1;::::0;50572:16;;;::::1;;:36;:::i;:::-;50557:52;::::0;::::1;;:11:::0;:52:::1;:::i;:::-;50528:82;::::0;:12;:82:::1;:::i;:::-;50700:7;:17:::0;50681:6:::1;:16:::0;50506:104;;-1:-1:-1;50621:29:0::1;::::0;50681:36:::1;::::0;50700:17:::1;::::0;;;;::::1;::::0;::::1;::::0;50681:16;;;::::1;;:36;:::i;:::-;50653:65;::::0;::::1;;:11:::0;:65:::1;:::i;:::-;50621:97:::0;-1:-1:-1;50735:25:0;;50731:160:::1;;50818:61;50831:24;50857:21;50818:12;:61::i;:::-;51024:7;:17:::0;51005:6:::1;:16:::0;50937:20:::1;::::0;51005:36:::1;::::0;51024:17:::1;-1:-1:-1::0;;;51024:17:0;;;::::1;::::0;::::1;::::0;51005:16;;::::1;;:36;:::i;:::-;50960:82;;:28;:11:::0;50987:1:::1;50960:28;:::i;:::-;:82;;;;:::i;:::-;51102:7;:11:::0;51089:6:::1;:10:::0;50937:105;;-1:-1:-1;51053:14:0::1;::::0;51130:21:::1;::::0;51089:24:::1;::::0;51102:11:::1;-1:-1:-1::0;;;51102:11:0;;;::::1;::::0;::::1;::::0;51089:10;;::::1;;:24;:::i;:::-;51070:44;;:15;:11:::0;51084:1:::1;51070:15;:::i;:::-;:44;;;;:::i;:::-;:81;:178;;51236:7;:11:::0;51223:6:::1;:10:::0;:24:::1;::::0;51236:11:::1;-1:-1:-1::0;;;51236:11:0;;;::::1;::::0;::::1;::::0;51223:10;;;::::1;;:24;:::i;:::-;51204:44;;:15;:11:::0;51218:1:::1;51204:15;:::i;:::-;:44;;;;:::i;:::-;51070:178;;;51167:21;51070:178;51053:195:::0;-1:-1:-1;51265:16:0;;51261:89:::1;;51299:15;::::0;51298:40:::1;::::0;-1:-1:-1;;;;;51299:15:0;;::::1;::::0;51298:40;::::1;;;::::0;51325:12;;51299:15:::1;51298:40:::0;51299:15;51298:40;51325:12;51299:15;51298:40;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;51261:89;51366:10:::0;;51362:69:::1;;51393:9;::::0;:26:::1;::::0;-1:-1:-1;;;;;51393:9:0;;::::1;::::0;:26;::::1;;;::::0;51412:6;;51393:9:::1;:26:::0;:9;:26;51412:6;51393:9;:26;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;51362:69;-1:-1:-1::0;;31319:16:0;:24;;-1:-1:-1;;;;31319:24:0;;;-1:-1:-1;;;;;;;;;49542:1896:0:o;52653:1094::-;52808:7;52804:302;;;52832:14;45454:7;:11;;-1:-1:-1;;45555:11:0;;;45411:163;52832:14;52875:13;-1:-1:-1;;;;;52865:23:0;:6;-1:-1:-1;;;;;52865:23:0;;52861:234;;;45889:6;:10;45879:7;:20;;45889:10;;;;-1:-1:-1;;45910:32:0;;;;;;;45926:16;;;;;;45910:32;;-1:-1:-1;;45989:32:0;-1:-1:-1;;;45964:14:0;;;;;45953:25;-1:-1:-1;;;;45989:32:0;;-1:-1:-1;;;46005:16:0;;;;;45989:32;;-1:-1:-1;;;;46032:20:0;-1:-1:-1;;;46042:10:0;;;;;;;;46032:20;;;;;;;;;52861:234;;;52969:13;-1:-1:-1;;;;;52956:26:0;:9;-1:-1:-1;;;;;52956:26:0;;52952:143;;;46120:7;:11;46110:7;:21;;46120:11;;;;-1:-1:-1;;46142:33:0;;;;;;;46158:17;;;;;;46142:33;;-1:-1:-1;;46223:33:0;-1:-1:-1;;;46197:15:0;;;;;46186:26;-1:-1:-1;;;;46223:33:0;;-1:-1:-1;;;46239:17:0;;;;;46223:33;;-1:-1:-1;;;;46267:21:0;-1:-1:-1;;;46277:11:0;;;;;;;;46267:21;;;;;;;;;52861:234;;52952:143;45638:11;:15;45628:7;:25;;45638:15;;;;-1:-1:-1;;45664:37:0;;;;;;;45680:21;;;;;;45664:37;;-1:-1:-1;;45753:37:0;-1:-1:-1;;;45723:19:0;;;;;45712:30;-1:-1:-1;;;;45753:37:0;;-1:-1:-1;;;45769:21:0;;;;;45753:37;;-1:-1:-1;;;;45801:25:0;-1:-1:-1;;;45811:15:0;;;;;;;;45801:25;;;;;;;;;53066:13;-1:-1:-1;;;;;53122:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;53146:22:0;;;;;;:11;:22;;;;;;;;53145:23;53122:46;53118:597;;;53185:48;53207:6;53215:9;53226:6;53185:21;:48::i;:::-;53118:597;;;-1:-1:-1;;;;;53256:19:0;;;;;;:11;:19;;;;;;;;53255:20;:46;;;;-1:-1:-1;;;;;;53279:22:0;;;;;;:11;:22;;;;;;;;53255:46;53251:464;;;53318:46;53338:6;53346:9;53357:6;53318:19;:46::i;53251:464::-;-1:-1:-1;;;;;53387:19:0;;;;;;:11;:19;;;;;;;;53386:20;:47;;;;-1:-1:-1;;;;;;53411:22:0;;;;;;:11;:22;;;;;;;;53410:23;53386:47;53382:333;;;53450:44;53468:6;53476:9;53487:6;53450:17;:44::i;53382:333::-;-1:-1:-1;;;;;53516:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;53539:22:0;;;;;;:11;:22;;;;;;;;53516:45;53512:203;;;53578:48;53600:6;53608:9;53619:6;53578:21;:48::i;53512:203::-;53659:44;53677:6;53685:9;53696:6;53659:17;:44::i;:::-;53725:14;45454:7;:11;;-1:-1:-1;;45555:11:0;;;45411:163;53725:14;52653:1094;;;;:::o;43307:605::-;43405:7;;43441;;43358;;;;;43459:338;43483:9;:16;43479:20;;43459:338;;;43567:7;43543;:21;43551:9;43561:1;43551:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;43551:12:0;43543:21;;;;;;;;;;;;;:31;;:83;;;43619:7;43595;:21;43603:9;43613:1;43603:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;43603:12:0;43595:21;;;;;;;;;;;;;:31;43543:83;43521:146;;;43650:7;;43659;;43642:25;;;;;;;43307:605;;:::o;43521:146::-;43692:34;43704:7;:21;43712:9;43722:1;43712:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;43712:12:0;43704:21;;;;;;;;;;;;;43692:7;;:11;:34::i;:::-;43682:44;;43751:34;43763:7;:21;43771:9;43781:1;43771:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;43771:12:0;43763:21;;;;;;;;;;;;;43751:7;;:11;:34::i;:::-;43741:44;-1:-1:-1;43501:3:0;;;;:::i;:::-;;;;43459:338;;;-1:-1:-1;43833:7:0;;43821;;:20;;:11;:20::i;:::-;43811:7;:30;43807:61;;;43851:7;;43860;;43843:25;;;;;;43307:605;;:::o;43807:61::-;43887:7;;43896;;-1:-1:-1;43307:605:0;-1:-1:-1;43307:605:0:o;7394:312::-;7514:7;7549:12;7542:5;7534:28;;;;-1:-1:-1;;;7534:28:0;;;;;;;;:::i;:::-;-1:-1:-1;7573:9:0;7585:5;7589:1;7585;:5;:::i;44631:130::-;44734:7;;44695;;44722:31;;44747:5;;44722:20;;:7;;44734;;44722:11;:20::i;:::-;:24;;:31::i;44769:174::-;44910:13;;44866:7;;44898:37;;44929:5;;44898:26;;:7;;44910:13;;;;;44898:11;:26::i;45271:132::-;45375:8;;45336:7;;45363:32;;45389:5;;45363:21;;:7;;-1:-1:-1;;;45375:8:0;;;;45363:11;:21::i;45133:130::-;45236:7;;45197;;45224:31;;45249:5;;45224:20;;:7;;-1:-1:-1;;;45236:7:0;;;;45224:11;:20::i;44951:174::-;45092:13;;45048:7;;45080:37;;45111:5;;45080:26;;:7;;-1:-1:-1;;;45092:13:0;;;;5821:471;5879:7;6124:6;6120:47;;-1:-1:-1;6154:1:0;6147:8;;6120:47;6179:9;6191:5;6195:1;6191;:5;:::i;:::-;6179:17;-1:-1:-1;6224:1:0;6215:5;6219:1;6179:17;6215:5;:::i;:::-;:10;6207:56;;;;-1:-1:-1;;;6207:56:0;;16774:2:1;6207:56:0;;;16756:21:1;16813:2;16793:18;;;16786:30;16852:34;16832:18;;;16825:62;-1:-1:-1;;;16903:18:1;;;16896:31;16944:19;;6207:56:0;16572:397:1;56321:934:0;56472:23;56510:12;56537:18;56570:15;56599:20;56611:7;56599:11;:20::i;:::-;56457:162;;;;;;;;56631:15;56648:23;56673:12;56689:135;56715:7;56737:4;56756:10;56781:7;56803:10;:8;:10::i;56689:135::-;-1:-1:-1;;;;;56855:15:0;;;;;;:7;:15;;;;;;56630:194;;-1:-1:-1;56630:194:0;;-1:-1:-1;56630:194:0;-1:-1:-1;56855:28:0;;56875:7;56855:19;:28::i;:::-;-1:-1:-1;;;;;56837:15:0;;;;;;:7;:15;;;;;;;;:46;;;;56912:7;:15;;;;:28;;56932:7;56912:19;:28::i;:::-;-1:-1:-1;;;;;56894:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;56972:18;;;;;:7;:18;;;;;:39;;56995:15;56972:22;:39::i;:::-;-1:-1:-1;;;;;56951:18:0;;;;;;:7;:18;;;;;;;;:60;;;;57043:7;:18;;;;:39;;57066:15;57043:22;:39::i;:::-;-1:-1:-1;;;;;57022:18:0;;;;;;:7;:18;;;;;:60;57093:26;57108:10;57093:14;:26::i;:::-;57130:23;57145:7;57130:14;:23::i;:::-;57164;57176:4;57182;57164:11;:23::i;:::-;57220:9;-1:-1:-1;;;;;57203:44:0;57212:6;-1:-1:-1;;;;;57203:44:0;;57231:15;57203:44;;;;2655:25:1;;2643:2;2628:18;;2509:177;57203:44:0;;;;;;;;56446:809;;;;;;;56321:934;;;:::o;51446:589::-;51596:16;;;51610:1;51596:16;;;;;;;;51572:21;;51596:16;;;;;;;;;;-1:-1:-1;51596:16:0;51572:40;;51641:4;51623;51628:1;51623:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;51623:23:0;;;-1:-1:-1;;;;;51623:23:0;;;;;51667:15;-1:-1:-1;;;;;51667:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51657:4;51662:1;51657:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;51657:32:0;;;-1:-1:-1;;;;;51657:32:0;;;;;51702:62;51719:4;51734:15;51752:11;51702:8;:62::i;:::-;51803:224;;-1:-1:-1;;;51803:224:0;;-1:-1:-1;;;;;51803:15:0;:66;;;;:224;;51884:11;;51910:1;;51954:4;;51981;;52001:15;;51803:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52043:529;52191:62;52208:4;52223:15;52241:11;52191:8;:62::i;:::-;52508:14;;52296:268;;-1:-1:-1;;;52296:268:0;;52368:4;52296:268;;;18696:34:1;18746:18;;;18739:34;;;52414:1:0;18789:18:1;;;18782:34;;;18832:18;;;18825:34;-1:-1:-1;;;;;52508:14:0;;;18875:19:1;;;18868:44;52538:15:0;18928:19:1;;;18921:35;52296:15:0;:31;;;;;;52335:9;;18630:19:1;;52296:268:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;55450:863::-;55601:23;55639:12;55666:18;55699:15;55728:20;55740:7;55728:11;:20::i;:::-;55586:162;;;;;;;;55760:15;55777:23;55802:12;55818:135;55844:7;55866:4;55885:10;55910:7;55932:10;:8;:10::i;55818:135::-;-1:-1:-1;;;;;55984:15:0;;;;;;:7;:15;;;;;;55759:194;;-1:-1:-1;55759:194:0;;-1:-1:-1;55759:194:0;-1:-1:-1;55984:28:0;;56004:7;55984:19;:28::i;:::-;-1:-1:-1;;;;;55966:15:0;;;;;;:7;:15;;;;;;;;:46;;;;56041:7;:15;;;;:28;;56061:7;56041:19;:28::i;:::-;-1:-1:-1;;;;;56023:15:0;;;;;;;:7;:15;;;;;;:46;;;;56101:18;;;;;;;:39;;56124:15;56101:22;:39::i;54567:875::-;54716:23;54754:12;54781:18;54814:15;54843:20;54855:7;54843:11;:20::i;:::-;54701:162;;;;;;;;54875:15;54892:23;54917:12;54933:135;54959:7;54981:4;55000:10;55025:7;55047:10;:8;:10::i;54933:135::-;-1:-1:-1;;;;;55099:15:0;;;;;;:7;:15;;;;;;54874:194;;-1:-1:-1;54874:194:0;;-1:-1:-1;54874:194:0;-1:-1:-1;55099:28:0;;54874:194;55099:19;:28::i;53755:802::-;53902:23;53940:12;53967:18;54000:15;54029:20;54041:7;54029:11;:20::i;:::-;53887:162;;;;;;;;54061:15;54078:23;54103:12;54119:135;54145:7;54167:4;54186:10;54211:7;54233:10;:8;:10::i;54119:135::-;-1:-1:-1;;;;;54285:15:0;;;;;;:7;:15;;;;;;54060:194;;-1:-1:-1;54060:194:0;;-1:-1:-1;54060:194:0;-1:-1:-1;54285:28:0;;54060:194;54285:19;:28::i;43920:355::-;43983:19;44005:10;:8;:10::i;:::-;43983:32;-1:-1:-1;44026:18:0;44047:27;:10;43983:32;44047:14;:27::i;:::-;44126:4;44110:22;;;;:7;:22;;;;;;44026:48;;-1:-1:-1;44110:38:0;;44026:48;44110:26;:38::i;:::-;44101:4;44085:22;;;;:7;:22;;;;;;;;:63;;;;44163:11;:26;;;;;;44159:108;;;44245:4;44229:22;;;;:7;:22;;;;;;:38;;44256:10;44229:26;:38::i;:::-;44220:4;44204:22;;;;:7;:22;;;;;:63;44159:108;43972:303;;43920:355;:::o;41647:147::-;41725:7;;:17;;41737:4;41725:11;:17::i;:::-;41715:7;:27;41766:10;;:20;;41781:4;41766:14;:20::i;:::-;41753:10;:33;-1:-1:-1;;41647:147:0:o;14:139:1:-;-1:-1:-1;;;;;97:31:1;;87:42;;77:70;;143:1;140;133:12;77:70;14:139;:::o;158:263::-;225:6;278:2;266:9;257:7;253:23;249:32;246:52;;;294:1;291;284:12;246:52;333:9;320:23;352:39;385:5;352:39;:::i;426:472::-;503:6;511;519;572:2;560:9;551:7;547:23;543:32;540:52;;;588:1;585;578:12;540:52;627:9;614:23;646:39;679:5;646:39;:::i;:::-;704:5;-1:-1:-1;761:2:1;746:18;;733:32;774:41;733:32;774:41;:::i;:::-;426:472;;834:7;;-1:-1:-1;;;888:2:1;873:18;;;;860:32;;426:472::o;1127:597::-;1239:4;1268:2;1297;1286:9;1279:21;1329:6;1323:13;1372:6;1367:2;1356:9;1352:18;1345:34;1397:1;1407:140;1421:6;1418:1;1415:13;1407:140;;;1516:14;;;1512:23;;1506:30;1482:17;;;1501:2;1478:26;1471:66;1436:10;;1407:140;;;1565:6;1562:1;1559:13;1556:91;;;1635:1;1630:2;1621:6;1610:9;1606:22;1602:31;1595:42;1556:91;-1:-1:-1;1708:2:1;1687:15;-1:-1:-1;;1683:29:1;1668:45;;;;1715:2;1664:54;;1127:597;-1:-1:-1;;;1127:597:1:o;1729:323::-;1797:6;1805;1858:2;1846:9;1837:7;1833:23;1829:32;1826:52;;;1874:1;1871;1864:12;1826:52;1913:9;1900:23;1932:39;1965:5;1932:39;:::i;:::-;1990:5;2042:2;2027:18;;;;2014:32;;-1:-1:-1;;;1729:323:1:o;2691:159::-;2758:20;;2818:6;2807:18;;2797:29;;2787:57;;2840:1;2837;2830:12;2787:57;2691:159;;;:::o;2855:474::-;2945:6;2953;2961;2969;2977;3030:3;3018:9;3009:7;3005:23;3001:33;2998:53;;;3047:1;3044;3037:12;2998:53;3070:28;3088:9;3070:28;:::i;:::-;3060:38;;3117:37;3150:2;3139:9;3135:18;3117:37;:::i;:::-;3107:47;;3173:37;3206:2;3195:9;3191:18;3173:37;:::i;:::-;3163:47;;3229:37;3262:2;3251:9;3247:18;3229:37;:::i;:::-;3219:47;;3285:38;3318:3;3307:9;3303:19;3285:38;:::i;:::-;3275:48;;2855:474;;;;;;;;:::o;4097:180::-;4156:6;4209:2;4197:9;4188:7;4184:23;4180:32;4177:52;;;4225:1;4222;4215:12;4177:52;-1:-1:-1;4248:23:1;;4097:180;-1:-1:-1;4097:180:1:o;4471:118::-;4557:5;4550:13;4543:21;4536:5;4533:32;4523:60;;4579:1;4576;4569:12;4594:309;4659:6;4667;4720:2;4708:9;4699:7;4695:23;4691:32;4688:52;;;4736:1;4733;4726:12;4688:52;4772:9;4759:23;4749:33;;4832:2;4821:9;4817:18;4804:32;4845:28;4867:5;4845:28;:::i;:::-;4892:5;4882:15;;;4594:309;;;;;:::o;5116:241::-;5172:6;5225:2;5213:9;5204:7;5200:23;5196:32;5193:52;;;5241:1;5238;5231:12;5193:52;5280:9;5267:23;5299:28;5321:5;5299:28;:::i;5362:404::-;5430:6;5438;5491:2;5479:9;5470:7;5466:23;5462:32;5459:52;;;5507:1;5504;5497:12;5459:52;5546:9;5533:23;5565:39;5598:5;5565:39;:::i;:::-;5623:5;-1:-1:-1;5680:2:1;5665:18;;5652:32;5693:41;5652:32;5693:41;:::i;5771:356::-;5973:2;5955:21;;;5992:18;;;5985:30;6051:34;6046:2;6031:18;;6024:62;6118:2;6103:18;;5771:356::o;6411:245::-;6478:6;6531:2;6519:9;6510:7;6506:23;6502:32;6499:52;;;6547:1;6544;6537:12;6499:52;6579:9;6573:16;6598:28;6620:5;6598:28;:::i;6661:380::-;6740:1;6736:12;;;;6783;;;6804:61;;6858:4;6850:6;6846:17;6836:27;;6804:61;6911:2;6903:6;6900:14;6880:18;6877:38;6874:161;;;6957:10;6952:3;6948:20;6945:1;6938:31;6992:4;6989:1;6982:15;7020:4;7017:1;7010:15;6874:161;;6661:380;;;:::o;7046:127::-;7107:10;7102:3;7098:20;7095:1;7088:31;7138:4;7135:1;7128:15;7162:4;7159:1;7152:15;7178:224;7217:3;7245:6;7278:2;7275:1;7271:10;7308:2;7305:1;7301:10;7339:3;7335:2;7331:12;7326:3;7323:21;7320:47;;;7347:18;;:::i;:::-;7383:13;;7178:224;-1:-1:-1;;;;7178:224:1:o;7407:353::-;7609:2;7591:21;;;7648:2;7628:18;;;7621:30;7687:31;7682:2;7667:18;;7660:59;7751:2;7736:18;;7407:353::o;8528:127::-;8589:10;8584:3;8580:20;8577:1;8570:31;8620:4;8617:1;8610:15;8644:4;8641:1;8634:15;8660:125;8700:4;8728:1;8725;8722:8;8719:34;;;8733:18;;:::i;:::-;-1:-1:-1;8770:9:1;;8660:125::o;8790:127::-;8851:10;8846:3;8842:20;8839:1;8832:31;8882:4;8879:1;8872:15;8906:4;8903:1;8896:15;8922:135;8961:3;-1:-1:-1;;8982:17:1;;8979:43;;;9002:18;;:::i;:::-;-1:-1:-1;9049:1:1;9038:13;;8922:135::o;11001:128::-;11041:3;11072:1;11068:6;11065:1;11062:13;11059:39;;;11078:18;;:::i;:::-;-1:-1:-1;11114:9:1;;11001:128::o;11134:217::-;11174:1;11200;11190:132;;11244:10;11239:3;11235:20;11232:1;11225:31;11279:4;11276:1;11269:15;11307:4;11304:1;11297:15;11190:132;-1:-1:-1;11336:9:1;;11134:217::o;11356:355::-;11558:2;11540:21;;;11597:2;11577:18;;;11570:30;11636:33;11631:2;11616:18;;11609:61;11702:2;11687:18;;11356:355::o;16136:258::-;16175:7;16207:6;16240:2;16237:1;16233:10;16270:2;16267:1;16263:10;16326:3;16322:2;16318:12;16313:3;16310:21;16303:3;16296:11;16289:19;16285:47;16282:73;;;16335:18;;:::i;:::-;16375:13;;16136:258;-1:-1:-1;;;;16136:258:1:o;16399:168::-;16439:7;16505:1;16501;16497:6;16493:14;16490:1;16487:21;16482:1;16475:9;16468:17;16464:45;16461:71;;;16512:18;;:::i;:::-;-1:-1:-1;16552:9:1;;16399:168::o;17106:259::-;17176:6;17229:2;17217:9;17208:7;17204:23;17200:32;17197:52;;;17245:1;17242;17235:12;17197:52;17277:9;17271:16;17296:39;17329:5;17296:39;:::i;17370:980::-;17632:4;17680:3;17669:9;17665:19;17711:6;17700:9;17693:25;17737:2;17775:6;17770:2;17759:9;17755:18;17748:34;17818:3;17813:2;17802:9;17798:18;17791:31;17842:6;17877;17871:13;17908:6;17900;17893:22;17946:3;17935:9;17931:19;17924:26;;17985:2;17977:6;17973:15;17959:29;;18006:1;18016:195;18030:6;18027:1;18024:13;18016:195;;;18095:13;;-1:-1:-1;;;;;18091:39:1;18079:52;;18186:15;;;;18151:12;;;;18127:1;18045:9;18016:195;;;-1:-1:-1;;;;;;;18267:32:1;;;;18262:2;18247:18;;18240:60;-1:-1:-1;;;18331:3:1;18316:19;18309:35;18228:3;17370:980;-1:-1:-1;;;17370:980:1:o;18967:306::-;19055:6;19063;19071;19124:2;19112:9;19103:7;19099:23;19095:32;19092:52;;;19140:1;19137;19130:12;19092:52;19169:9;19163:16;19153:26;;19219:2;19208:9;19204:18;19198:25;19188:35;;19263:2;19252:9;19248:18;19242:25;19232:35;;18967:306;;;;;:::o

Swarm Source

ipfs://77801296e0742bc96d19c892bdca3d228f34b5b887b47d9cc3ee1cbc8f4c0f7b
Loading