ETH Price: $2,511.71 (-1.14%)

Token

LuckyApe (LUCKY)
 

Overview

Max Total Supply

16,282,748.86700362 LUCKY

Holders

164 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

Balance
0.00000001 LUCKY

Value
$0.00
0xa099bd34d0d7bbc9db653ac6ee7d1c5786195f13
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

LuckyApe is a built-in jackpot contract which gives buyers the chance to win tokens on each buy transaction.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
LuckyApe

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-07-06
*/

pragma solidity 0.8.18;

// SPDX-License-Identifier: Unlicensed
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) {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 {
        _transferOwnership(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"
        );
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


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


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

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

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

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

interface Randomizer {
    function generateRandomNumber(
        address buyer
    ) external returns (uint256 result);
}

contract LuckyApe 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) public _isExcludedMaxTransactionAmount;
    mapping(address => uint256) private _winnerCooldowns; // address -> cooldown end time
    address[] public eligibleHolders;

    struct BuyerData {
    uint256 lastWinTime;
    bool tokensWon;
    uint256 rewardAmount;
    uint256 lastReward;
    uint256 winCount;
    uint256 totalBnbWinnings;
    bool eligibleHolder;
    uint256 x2Count;
    uint256 x5Count;
    uint256 x10Count;
  
}

    mapping(address => BuyerData) public buyerData;
    mapping(address => bool) private _isExcluded;
    mapping(address => bool) public presaleWallet;
    address[] private _excluded;

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

    address public burnAddress = 0x000000000000000000000000000000000000dEaD;
    address public marketingWallet = 0xBeF33373aB62C33083D2Bb3A311177022728320e;

    string private _name = "LuckyApe";
    string private _symbol = "LUCKY";
    uint8 private _decimals = 8;

    uint256 private _taxFee;
    uint256 private _liquidityFee;
    uint256 private _marketingFee;
    uint256 private _burnFee;
    uint256 private _winningFee;

    address public pendingWinner;
    bool public isWinnerSelected;
    uint256 public minTokenHolding = 10000 * 10**8; // minimum token holding required to be eligible

    uint256 public buyTaxFee = 2;
    uint256 public buyLiquidityFee = 2;
    uint256 public buyMarketingFee = 3;
    uint256 public buyBurnFee = 3;
    uint256 public buyWinningFee = 0;
    uint256 public totalBuyFee =
        buyTaxFee + buyLiquidityFee + buyMarketingFee + buyBurnFee + buyWinningFee;

    uint256 public sellTaxFee = 0;
    uint256 public sellLiquidityFee = 0;
    uint256 public sellMarketingFee = 3;
    uint256 public sellBurnFee = 5;
    uint256 public sellWinningFee = 2;
    uint256 public totalSellFee =
        sellTaxFee + sellMarketingFee + sellBurnFee + sellWinningFee;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public randomizerCA;

    bool internal inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;

    uint256 public _maxTxAmount = 200000 * 10**8;
    uint256 public numTokensSellToAddToLiquidity = 50000 * 10**8;

    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    event winnerSelected(address winner);
    event tokenWon(address winner, uint256 multiple, uint256 tokenamount);
    event winnerPaid(address winner, uint256 ethForWinner);
    event excludedFromFee(address account, bool _enabled);
    event newMaxTxAmount(uint256 amount);
    event includedInReward(address account);
    event excludedFromReward(address account);
    event newMarketingWalletSet(address account);
    event newRandomizerCA(address account);

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

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

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); //Mainnet ETH
        //IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); //Testnet PCS Goerli

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

        //exclude owner and this contract from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;

        //exclude owner and this contract from max transaction
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
       
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function updateMinTokenHolding(uint256 _amount) external onlyOwner {
        minTokenHolding = _amount;
    }

    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 _reward(address account, uint256 amount) internal {
        require(account != address(0), "BEP20: mint to the zero address");
        uint256 currentRate =  _getRate();
        uint256 rAmount = amount.mul(currentRate);
        _tTotal = _tTotal.add(amount);
        _rOwned[account] = _rOwned[account].add(rAmount);
        emit Transfer(address(0), account, amount);
    }

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

    function excludeFromMaxTransaction(address account, bool _enabled) public onlyOwner {
        _isExcludedMaxTransactionAmount[account] = _enabled;
    }

    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 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);
        emit excludedFromReward(account);
    }

    function includeInReward(address account) public onlyOwner {
        require(_isExcluded[account], "Account is already 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;
            }
        }
        emit includedInReward(account);
    }
   function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
            (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
            _tOwned[sender] = _tOwned[sender].sub(tAmount);
            _rOwned[sender] = _rOwned[sender].sub(rAmount);
            _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
            _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);           
            _reflectFee(rFee, tFee);
            emit Transfer(sender, recipient, tTransferAmount);
        }

    function excludeFromFee(address account, bool _enabled) public onlyOwner {
        _isExcludedFromFee[account] = _enabled;
        emit excludedFromFee(account, _enabled);
    }

    function setMaxTxAmount(uint256 maxTxAmount) external onlyOwner {
        require(
            maxTxAmount >= 100000,
            "Amount must be more than 100k tokens"
        );
        _maxTxAmount = maxTxAmount * 10**8;
        emit newMaxTxAmount(_maxTxAmount);
    }

    
    function setBuyFee(uint256 _buyTaxFee, uint256 _buyLiquidityFee, uint256 _buyMarketingFee, uint256 _buyBurnFee, uint256 _buyWinningFee)
        external
        onlyOwner
    {
        buyTaxFee = _buyTaxFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyMarketingFee = _buyMarketingFee;
        buyBurnFee = _buyBurnFee;
        buyWinningFee = _buyWinningFee;
        totalBuyFee = buyTaxFee + buyLiquidityFee + buyMarketingFee + buyBurnFee + buyWinningFee;
        require(totalBuyFee <= 20, "Buy Tax limit exceeded!!");
    }

    function setSellFee(
        uint256 _sellTaxFee,
        uint256 _sellLiquidityFee,
        uint256 _sellMarketingFee,
        uint256 _sellBurnFee,
        uint256 _sellWinningFee
    ) external onlyOwner {
        sellTaxFee = _sellTaxFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellMarketingFee = _sellMarketingFee;
        sellBurnFee = _sellBurnFee;
        sellWinningFee = _sellWinningFee;
        totalSellFee = sellTaxFee + sellLiquidityFee + sellMarketingFee + sellBurnFee + sellWinningFee;
        require(totalSellFee <= 20, "Sell Tax limit exceeded!!");
    }

    function setSwapThresholdAmount(uint256 SwapThresholdAmount)
        external
        onlyOwner
    {
        numTokensSellToAddToLiquidity = SwapThresholdAmount * 10**8;
    }

    function setMarketingWallet(address marketingAddress) external onlyOwner {
        require(marketingAddress != address(0), "BEP20: Marketing wallet cannot the zero address");
        marketingWallet = marketingAddress;
        emit newMarketingWalletSet(marketingAddress);
    }

    function claimOtherTokens(IERC20 tokenAddress, address walletaddress)
        external
        onlyOwner
    {
        tokenAddress.transfer(
            walletaddress,
            tokenAddress.balanceOf(address(this))
        );
    }

    function clearStuckBalance(address payable walletaddress)
        external
        onlyOwner
    {
        walletaddress.transfer(address(this).balance);
    }

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

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

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

     function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256) {
            (uint256 tTransferAmount, uint256 tFee) = _getTValues(tAmount, _taxFee);
            uint256 currentRate =  _getRate();
            (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, currentRate);
            return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee);
        }

      function _getTValues(uint256 tAmount, uint256 taxFee) private pure returns (uint256, uint256) {
            uint256 tFee = tAmount.mul(taxFee).div(100);
            uint256 tTransferAmount = tAmount.sub(tFee);
            return (tTransferAmount, tFee);
        }

        function _getRValues(uint256 tAmount, uint256 tFee, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
            uint256 rAmount = tAmount.mul(currentRate);
            uint256 rFee = tFee.mul(currentRate);
            uint256 rTransferAmount = rAmount.sub(rFee);
            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 calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(10**2);
    }

   

    function isExcludedFromFee(address account) public view returns (bool) {
        return _isExcludedFromFee[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");
        if (from != owner() && to != owner() && !_isExcludedMaxTransactionAmount[from] && !_isExcludedMaxTransactionAmount[to])
            require(
                amount <= _maxTxAmount,
                "Transfer amount exceeds the maxTxAmount."
            );
           

        uint256 contractTokenBalance = balanceOf(address(this));

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

        bool overMinTokenBalance = contractTokenBalance >=
            numTokensSellToAddToLiquidity;
        if (
            overMinTokenBalance &&
            !inSwapAndLiquify &&
            from != uniswapV2Pair &&
            swapAndLiquifyEnabled
        ) {
            contractTokenBalance = numTokensSellToAddToLiquidity;
          
            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 (from != uniswapV2Pair && to != uniswapV2Pair) {
            takeFee = false;
        }

        if (takeFee) {
            if(from == uniswapV2Pair){
                _taxFee = buyTaxFee;
                _liquidityFee = buyLiquidityFee;
                _marketingFee = buyMarketingFee;
                _burnFee = buyBurnFee;
                _winningFee = buyWinningFee;
            }
            else if (to == uniswapV2Pair) {
                if (buyerData[from].tokensWon) {
                    bool cooled = _checkWinnerCooldown(from);
                    if (cooled) {
                        require(
                            amount <= balanceOf(from) - buyerData[from].lastReward,
                            "You can not sell reward amount until cooldown"
                        );
                    }
                }
                _taxFee = sellTaxFee;
                _liquidityFee = sellLiquidityFee;
                _marketingFee = sellMarketingFee;
                _burnFee = sellBurnFee;
                _winningFee = sellWinningFee;

                if(!isWinnerSelected){
                    pendingWinner = selectWinner();
                    isWinnerSelected = true;
                }
            }
            uint256 taxAmount =  (_liquidityFee+_marketingFee+_winningFee) * amount / 100;
            uint256 burnAmount = 0;

            if(_burnFee > 0){
            burnAmount = _burnFee * amount / 100;
            _transferStandard(from, burnAddress, burnAmount);
            }
            
            _transferStandard(from, address(this), taxAmount);
            uint256 totalTaxToken = taxAmount + burnAmount;
            amount -= totalTaxToken; 

        }

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

        if (presaleWallet[from] && to != uniswapV2Pair) {
            if (balanceOf(to) >= minTokenHolding) {
                buyerData[to].eligibleHolder = true;
                eligibleHolders.push(to);
            }
        }

        if (takeFee && from == uniswapV2Pair) {
            if (balanceOf(to) >= minTokenHolding) {
                setReward(to, amount);
                buyerData[to].eligibleHolder = true;
                eligibleHolders.push(to);
            }
        }

        if (takeFee && to == uniswapV2Pair) {
            if (balanceOf(from) < minTokenHolding) {
            buyerData[to].eligibleHolder = false;
            for (uint256 i = 0; i < eligibleHolders.length; i++) {
                    if (eligibleHolders[i] == to) {
                        eligibleHolders[i] = eligibleHolders[eligibleHolders.length - 1];
                        eligibleHolders.pop();
                        break;
                    }
                }

            }
        }
    }

    function _checkWinnerCooldown(address account) private view returns (bool) {
        uint256 cooldown = _winnerCooldowns[account];
        if (block.timestamp >= buyerData[account].lastWinTime + cooldown){
            return false;
        }else{
            return true;
        }

    }

    function remainingCooldown(address account) public view returns (int256) {
        if (buyerData[account].tokensWon) {
            int256 remainingTime = 0;
            uint256 cooldownTime = buyerData[account].lastWinTime + _winnerCooldowns[account];
            if (cooldownTime > block.timestamp) {
                remainingTime = int256(cooldownTime) - int256(block.timestamp);
                return remainingTime;
            } else {
                return 0;
            }
        } else {
            return 0;
        }
    }

    function setReward(address buyer, uint256 amount)
    private
    {
        uint256 seed = 0;
        uint256 reward;
        uint256 multiplier = 0;
        seed = getRandomNumber();
        if (seed % 17 == 1) {
            multiplier = 2;
            reward = amount * 1;
            _winnerCooldowns[buyer] = 2 minutes;
            buyerData[buyer].tokensWon = true;
            buyerData[buyer].lastWinTime = block.timestamp;
            buyerData[buyer].rewardAmount += reward;
            buyerData[buyer].lastReward = reward;
            buyerData[buyer].winCount++;
            buyerData[buyer].x2Count++;
        } else if (seed % 97 == 1) {
            multiplier = 5;
            reward = amount * 4;
            _winnerCooldowns[buyer] = 5 minutes;
            buyerData[buyer].tokensWon = true;
            buyerData[buyer].lastWinTime = block.timestamp;
            buyerData[buyer].rewardAmount += reward;
            buyerData[buyer].lastReward = reward;           
            buyerData[buyer].winCount++;
            buyerData[buyer].x5Count++;
        } else if (seed % 197 == 1) {
            multiplier = 10;
            reward = amount * 9;
            _winnerCooldowns[buyer] = 10 minutes;
            buyerData[buyer].tokensWon = true;
            buyerData[buyer].lastWinTime = block.timestamp;
            buyerData[buyer].rewardAmount += reward;
            buyerData[buyer].lastReward = reward;
            buyerData[buyer].winCount++;
            buyerData[buyer].x10Count++;
        }
        if(reward > 0)
        {
            _reward(buyer,reward);
            emit tokenWon(buyer, multiplier, reward);
        }
    }

    function selectWinner() internal returns(address){
            require(eligibleHolders.length > 0, "No eligible holders");
            uint256 index = getRandomNumber() % eligibleHolders.length;
            emit winnerSelected(eligibleHolders[index]);
            return eligibleHolders[index];
        
    }

    function getRandomNumber() private returns (uint256 randomnum) {
        Randomizer randomCA = Randomizer(randomizerCA);
        randomnum = randomCA.generateRandomNumber(tx.origin);
    }
   
    function swapAndLiquify(uint256 tokensToLiquify) private lockTheSwap{
        uint256 totalLiquidityFee = buyLiquidityFee + sellLiquidityFee;
        uint256 totalmarketingFee = buyMarketingFee + sellMarketingFee;
        uint256 totalWinningFee = buyWinningFee + sellWinningFee;
        uint256 totalFee = totalLiquidityFee + totalmarketingFee + totalWinningFee;
        uint256 tokensToLP = tokensToLiquify.mul(totalLiquidityFee).div(totalFee).div(2);
        uint256 amountToSwap = tokensToLiquify.sub(tokensToLP);

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), amountToSwap);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp + 300
        );

        uint256 ethBalance = address(this).balance;
        uint256 ethFeeFactor = totalFee.sub((totalLiquidityFee).div(2));
        uint256 ethForLiquidity = ethBalance.mul(totalLiquidityFee).div(ethFeeFactor).div(2);
        uint256 ethForWinner = ethBalance.mul(totalWinningFee).div(ethFeeFactor);
        uint256 ethForMarketing = address(this).balance - (ethForLiquidity + ethForWinner);
     
        addLiquidity(tokensToLP, ethForLiquidity);

        payable(marketingWallet).transfer(ethForMarketing);
        if(isWinnerSelected){
        isWinnerSelected = false;
        buyerData[pendingWinner].totalBnbWinnings += ethForWinner;
        payable(pendingWinner).transfer(ethForWinner);
        emit winnerPaid(pendingWinner, ethForWinner);
       }

    }

    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
            owner(),
            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 (_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);
        }

    }

    function setPresaleWallet(address account, bool _enabled) public onlyOwner {
        require(account != address(0), "BEP20: Presale cannot be zero address");
        presaleWallet[account] = _enabled;
        if (_enabled) {
            excludeFromReward(account);
        } else {
            includeInReward(account);
        }
        excludeFromFee(account,_enabled);
        excludeFromMaxTransaction(account, _enabled);
    }

    function setRandomizerCA(address randomizer) public onlyOwner {
        require(randomizer != address(0), "BEP20: Randomizer cannot be zero address");
        randomizerCA = randomizer;
        emit newRandomizerCA(randomizer);
    }
 
    function removeAllFee() private {
        
        _taxFee = 0;
        _liquidityFee = 0;
        _marketingFee = 0;
        _winningFee = 0;
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); 
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);         
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); 
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

 
}

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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"_enabled","type":"bool"}],"name":"excludedFromFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"excludedFromReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"includedInReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"newMarketingWalletSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"newMaxTxAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"newRandomizerCA","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"multiple","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenamount","type":"uint256"}],"name":"tokenWon","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethForWinner","type":"uint256"}],"name":"winnerPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"winner","type":"address"}],"name":"winnerSelected","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTaxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyWinningFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"buyerData","outputs":[{"internalType":"uint256","name":"lastWinTime","type":"uint256"},{"internalType":"bool","name":"tokensWon","type":"bool"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"uint256","name":"lastReward","type":"uint256"},{"internalType":"uint256","name":"winCount","type":"uint256"},{"internalType":"uint256","name":"totalBnbWinnings","type":"uint256"},{"internalType":"bool","name":"eligibleHolder","type":"bool"},{"internalType":"uint256","name":"x2Count","type":"uint256"},{"internalType":"uint256","name":"x5Count","type":"uint256"},{"internalType":"uint256","name":"x10Count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"tokenAddress","type":"address"},{"internalType":"address","name":"walletaddress","type":"address"}],"name":"claimOtherTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"walletaddress","type":"address"}],"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":"","type":"uint256"}],"name":"eligibleHolders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","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":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWinnerSelected","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTokenHolding","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":[],"name":"pendingWinner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomizerCA","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"remainingCooldown","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTaxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellWinningFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyTaxFee","type":"uint256"},{"internalType":"uint256","name":"_buyLiquidityFee","type":"uint256"},{"internalType":"uint256","name":"_buyMarketingFee","type":"uint256"},{"internalType":"uint256","name":"_buyBurnFee","type":"uint256"},{"internalType":"uint256","name":"_buyWinningFee","type":"uint256"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"marketingAddress","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxAmount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setPresaleWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"randomizer","type":"address"}],"name":"setRandomizerCA","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellTaxFee","type":"uint256"},{"internalType":"uint256","name":"_sellLiquidityFee","type":"uint256"},{"internalType":"uint256","name":"_sellMarketingFee","type":"uint256"},{"internalType":"uint256","name":"_sellBurnFee","type":"uint256"},{"internalType":"uint256","name":"_sellWinningFee","type":"uint256"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SwapThresholdAmount","type":"uint256"}],"name":"setSwapThresholdAmount","outputs":[],"stateMutability":"nonpayable","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":"totalBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateMinTokenHolding","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405266038d7ea4c68000600c8190556200001f90600019620004ed565b6200002d9060001962000526565b600d55600f80546001600160a01b031990811661dead179091556010805490911673bef33373ab62c33083d2bb3a311177022728320e1790556040805180820190915260088152674c75636b7941706560c01b6020820152601190620000949082620005e7565b506040805180820190915260058152644c55434b5960d81b6020820152601290620000c09082620005e7565b506013805460ff1916600817905564e8d4a51000601a556002601b819055601c8190556003601d819055601e8190556000601f819055918190620001059080620006b3565b620001119190620006b3565b6200011d9190620006b3565b620001299190620006b3565b602055600060215560006022556003602355600560245560026025556025546024546023546021546200015d9190620006b3565b620001699190620006b3565b620001759190620006b3565b6026556027805460ff60a81b1916600160a81b1790556512309ce5400060285565048c27395000602955348015620001ac57600080fd5b50620001b83362000407565b600d543360009081526001602090815260409182902092909255805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d92839263c45a015592600480830193928290030181865afa1580156200021f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002459190620006c9565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000293573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b99190620006c9565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000307573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200032d9190620006c9565b6001600160a01b0390811660a0528116608052600160046000620003596000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526004909252902080549091166001179055620003b8620003b06000546001600160a01b031690565b600162000457565b620003c530600162000457565b600c5460405190815233906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350620006fb565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620004616200048c565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314620004eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b565b6000826200050b57634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052601160045260246000fd5b818103818111156200053c576200053c62000510565b92915050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200056d57607f821691505b6020821081036200058e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620005e257600081815260208120601f850160051c81016020861015620005bd5750805b601f850160051c820191505b81811015620005de57828155600101620005c9565b5050505b505050565b81516001600160401b0381111562000603576200060362000542565b6200061b8162000614845462000558565b8462000594565b602080601f8311600181146200065357600084156200063a5750858301515b600019600386901b1c1916600185901b178555620005de565b600085815260208120601f198616915b82811015620006845788860151825594840194600190910190840162000663565b5085821015620006a35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200053c576200053c62000510565b600060208284031215620006dc57600080fd5b81516001600160a01b0381168114620006f457600080fd5b9392505050565b60805160a051613b836200077c6000396000818161068a01528181611ce701528181611d9101528181611dce01528181611e1401528181611e70015281816120a501528181612163015261222a01526000818161047c0152818161263b015281816126f40152818161272301528181613235015261325c0152613b836000f3fe60806040526004361061039b5760003560e01c80637ab6d036116101dc578063bfdf8b1211610102578063e71dc3f5116100a0578063f63743421161006f578063f637434214610b86578063f8a25a9414610b9c578063f8cca59914610bb2578063f992f81c14610bd257600080fd5b8063e71dc3f514610b1a578063ec28438a14610b30578063f11a24d314610b50578063f2fde38b14610b6657600080fd5b8063d12a7688116100dc578063d12a768814610a88578063dd62ed3e14610a9e578063df8408fe14610ae4578063e5fb474614610b0457600080fd5b8063bfdf8b1214610a27578063c49b9a8014610a48578063c5bc8df514610a6857600080fd5b806395d89b411161017a578063a71e061811610149578063a71e0618146109b1578063a9059cbb146109d1578063abcd3a5c146109f1578063adb873bd14610a1157600080fd5b806395d89b41146109365780639d9241ec1461094b578063a457c2d714610961578063a61db3231461098157600080fd5b806388f82020116101b657806388f82020146108b35780638da5cb5b146108ec578063921369131461090a578063941fa5cd1461092057600080fd5b80637ab6d036146108715780637bce5a04146108875780637d1db4a51461089d57600080fd5b806349bd5a5e116102c15780635ea4a8dd1161025f5780637347fb311161022e5780637347fb31146107f15780637571336a1461081157806375f0a87414610831578063764d72bf1461085157600080fd5b80635ea4a8dd1461077c57806370a082311461079c57806370d5ae05146107bc578063715018a6146107dc57600080fd5b80635342acb41161029b5780635342acb4146106ed5780635908f26f1461072657806359b107b9146107465780635d098b381461075c57600080fd5b806349bd5a5e146106785780634a74bb02146106ac57806352390c02146106cd57600080fd5b806329e04b4a116103395780633685d419116103085780633685d4191461055757806339509351146105775780633ae7dc20146105975780633b17a320146105b757600080fd5b806329e04b4a146104dd5780632af4d953146104ff5780632d83811914610515578063313ce5671461053557600080fd5b806310efbc291161037557806310efbc29146104325780631694505e1461046a57806318160ddd1461049e57806323b872dd146104bd57600080fd5b806306fdde03146103a7578063095ea7b3146103d257806310d5de531461040257600080fd5b366103a257005b600080fd5b3480156103b357600080fd5b506103bc610bf2565b6040516103c9919061370a565b60405180910390f35b3480156103de57600080fd5b506103f26103ed36600461376d565b610c84565b60405190151581526020016103c9565b34801561040e57600080fd5b506103f261041d366004613799565b60056020526000908152604090205460ff1681565b34801561043e57600080fd5b50601954610452906001600160a01b031681565b6040516001600160a01b0390911681526020016103c9565b34801561047657600080fd5b506104527f000000000000000000000000000000000000000000000000000000000000000081565b3480156104aa57600080fd5b50600c545b6040519081526020016103c9565b3480156104c957600080fd5b506103f26104d83660046137b6565b610c9b565b3480156104e957600080fd5b506104fd6104f83660046137f7565b610d04565b005b34801561050b57600080fd5b506104af601f5481565b34801561052157600080fd5b506104af6105303660046137f7565b610d20565b34801561054157600080fd5b5060135460405160ff90911681526020016103c9565b34801561056357600080fd5b506104fd610572366004613799565b610da9565b34801561058357600080fd5b506103f261059236600461376d565b610f7b565b3480156105a357600080fd5b506104fd6105b2366004613810565b610fb1565b3480156105c357600080fd5b5061062c6105d2366004613799565b60086020819052600091825260409091208054600182015460028301546003840154600485015460058601546006870154600788015498880154600990980154969860ff968716989597949693959294919093169291908a565b604080519a8b5298151560208b0152978901969096526060880194909452608087019290925260a0860152151560c085015260e0840152610100830152610120820152610140016103c9565b34801561068457600080fd5b506104527f000000000000000000000000000000000000000000000000000000000000000081565b3480156106b857600080fd5b506027546103f290600160a81b900460ff1681565b3480156106d957600080fd5b506104fd6106e8366004613799565b61109f565b3480156106f957600080fd5b506103f2610708366004613799565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561073257600080fd5b50602754610452906001600160a01b031681565b34801561075257600080fd5b506104af60205481565b34801561076857600080fd5b506104fd610777366004613799565b611200565b34801561078857600080fd5b506104fd610797366004613849565b6112c4565b3480156107a857600080fd5b506104af6107b7366004613799565b61136c565b3480156107c857600080fd5b50600f54610452906001600160a01b031681565b3480156107e857600080fd5b506104fd6113cb565b3480156107fd57600080fd5b506104fd61080c366004613892565b6113df565b34801561081d57600080fd5b506104fd61082c366004613892565b6114a7565b34801561083d57600080fd5b50601054610452906001600160a01b031681565b34801561085d57600080fd5b506104fd61086c366004613799565b6114da565b34801561087d57600080fd5b506104af601a5481565b34801561089357600080fd5b506104af601d5481565b3480156108a957600080fd5b506104af60285481565b3480156108bf57600080fd5b506103f26108ce366004613799565b6001600160a01b031660009081526009602052604090205460ff1690565b3480156108f857600080fd5b506000546001600160a01b0316610452565b34801561091657600080fd5b506104af60235481565b34801561092c57600080fd5b506104af601b5481565b34801561094257600080fd5b506103bc611517565b34801561095757600080fd5b506104af60265481565b34801561096d57600080fd5b506103f261097c36600461376d565b611526565b34801561098d57600080fd5b506103f261099c366004613799565b600a6020526000908152604090205460ff1681565b3480156109bd57600080fd5b506104fd6109cc366004613849565b611575565b3480156109dd57600080fd5b506103f26109ec36600461376d565b611616565b3480156109fd57600080fd5b506104fd610a0c366004613799565b611623565b348015610a1d57600080fd5b506104af60245481565b348015610a3357600080fd5b506019546103f290600160a01b900460ff1681565b348015610a5457600080fd5b506104fd610a633660046138c0565b6116e0565b348015610a7457600080fd5b506104fd610a833660046137f7565b611735565b348015610a9457600080fd5b506104af60295481565b348015610aaa57600080fd5b506104af610ab9366004613810565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b348015610af057600080fd5b506104fd610aff366004613892565b611742565b348015610b1057600080fd5b506104af60255481565b348015610b2657600080fd5b506104af601e5481565b348015610b3c57600080fd5b506104fd610b4b3660046137f7565b6117ad565b348015610b5c57600080fd5b506104af601c5481565b348015610b7257600080fd5b506104fd610b81366004613799565b611857565b348015610b9257600080fd5b506104af60225481565b348015610ba857600080fd5b506104af60215481565b348015610bbe57600080fd5b50610452610bcd3660046137f7565b6118d0565b348015610bde57600080fd5b506104af610bed366004613799565b6118fa565b606060118054610c01906138dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2d906138dd565b8015610c7a5780601f10610c4f57610100808354040283529160200191610c7a565b820191906000526020600020905b815481529060010190602001808311610c5d57829003601f168201915b5050505050905090565b6000610c9133848461197b565b5060015b92915050565b6000610ca8848484611a9f565b610cfa8433610cf585604051806060016040528060288152602001613b01602891396001600160a01b038a16600090815260036020908152604080832033845290915290205491906123a8565b61197b565b5060019392505050565b610d0c6123e2565b610d1a816305f5e100613927565b60295550565b6000600d54821115610d8c5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084015b60405180910390fd5b6000610d9661243c565b9050610da2838261245f565b9392505050565b610db16123e2565b6001600160a01b03811660009081526009602052604090205460ff16610e195760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610d83565b60005b600b54811015610f3a57816001600160a01b0316600b8281548110610e4357610e4361393e565b6000918252602090912001546001600160a01b031603610f2857600b8054610e6d90600190613954565b81548110610e7d57610e7d61393e565b600091825260209091200154600b80546001600160a01b039092169183908110610ea957610ea961393e565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600990925220805460ff19169055600b805480610f0157610f01613967565b600082815260209020810160001990810180546001600160a01b0319169055019055610f3a565b80610f328161397d565b915050610e1c565b506040516001600160a01b03821681527fb5cb89dffbcb5ab9899127c4fa08550bc12152ec67d8a60d6eef1f53ff28de1d906020015b60405180910390a150565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610c91918590610cf590866124a1565b610fb96123e2565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa158015611007573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102b9190613996565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611076573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109a91906139af565b505050565b6110a76123e2565b6001600160a01b03811660009081526009602052604090205460ff16156111105760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610d83565b6001600160a01b0381166000908152600160205260409020541561116a576001600160a01b03811660009081526001602052604090205461115090610d20565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b0381166000818152600960209081526040808320805460ff19166001908117909155600b805491820181559093527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db990920180546001600160a01b0319168417905590519182527f1af41e5d0a29f48e42c4b0fd6708807d18756226226a8cb539076e78312d1d149101610f70565b6112086123e2565b6001600160a01b0381166112765760405162461bcd60e51b815260206004820152602f60248201527f42455032303a204d61726b6574696e672077616c6c65742063616e6e6f74207460448201526e6865207a65726f206164647265737360881b6064820152608401610d83565b601080546001600160a01b0319166001600160a01b0383169081179091556040519081527f15630e5b9ff3d692866b1a3699c892e9fd786cb6d6e4a776ed5386dfb7effa9590602001610f70565b6112cc6123e2565b602185905560228490556023839055602482905560258190558082846112f287896139cc565b6112fc91906139cc565b61130691906139cc565b61131091906139cc565b6026819055601410156113655760405162461bcd60e51b815260206004820152601960248201527f53656c6c20546178206c696d69742065786365656465642121000000000000006044820152606401610d83565b5050505050565b6001600160a01b03811660009081526009602052604081205460ff16156113a957506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610c9590610d20565b6113d36123e2565b6113dd6000612500565b565b6113e76123e2565b6001600160a01b03821661144b5760405162461bcd60e51b815260206004820152602560248201527f42455032303a2050726573616c652063616e6e6f74206265207a65726f206164604482015264647265737360d81b6064820152608401610d83565b6001600160a01b0382166000908152600a60205260409020805460ff19168215801591909117909155611486576114818261109f565b61148f565b61148f82610da9565b6114998282611742565b6114a382826114a7565b5050565b6114af6123e2565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6114e26123e2565b6040516001600160a01b038216904780156108fc02916000818181858888f193505050501580156114a3573d6000803e3d6000fd5b606060128054610c01906138dd565b6000610c913384610cf585604051806060016040528060258152602001613b29602591393360009081526003602090815260408083206001600160a01b038d16845290915290205491906123a8565b61157d6123e2565b601b859055601c849055601d839055601e829055601f8190558082846115a387896139cc565b6115ad91906139cc565b6115b791906139cc565b6115c191906139cc565b6020819055601410156113655760405162461bcd60e51b815260206004820152601860248201527f42757920546178206c696d6974206578636565646564212100000000000000006044820152606401610d83565b6000610c91338484611a9f565b61162b6123e2565b6001600160a01b0381166116925760405162461bcd60e51b815260206004820152602860248201527f42455032303a2052616e646f6d697a65722063616e6e6f74206265207a65726f604482015267206164647265737360c01b6064820152608401610d83565b602780546001600160a01b0319166001600160a01b0383169081179091556040519081527f030d6e377f4b676dc88e42dd51deb6aafd0e29327c41f417aeb25c900244428190602001610f70565b6116e86123e2565b60278054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610f7090831515815260200190565b61173d6123e2565b601a55565b61174a6123e2565b6001600160a01b038216600081815260046020908152604091829020805460ff19168515159081179091558251938452908301527f6b7cadbf6051d0bc8ccf16052682ffb97181438c85ecbce856fc185b1d07dd0e910160405180910390a15050565b6117b56123e2565b620186a08110156118145760405162461bcd60e51b8152602060048201526024808201527f416d6f756e74206d757374206265206d6f7265207468616e203130306b20746f6044820152636b656e7360e01b6064820152608401610d83565b611822816305f5e100613927565b60288190556040519081527f159e7d0d4ece10d438c16951d3b9b383c9b003f699ad639f43e755016a3e568890602001610f70565b61185f6123e2565b6001600160a01b0381166118c45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d83565b6118cd81612500565b50565b600781815481106118e057600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b03811660009081526008602052604081206001015460ff1615611973576001600160a01b0382166000908152600660209081526040808320546008909252822054829161194d916139cc565b9050428111156119695761196142826139df565b949350505050565b5060009392505050565b506000919050565b6001600160a01b0383166119dd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d83565b6001600160a01b038216611a3e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d83565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611b035760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610d83565b6001600160a01b038216611b655760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610d83565b60008111611bc75760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610d83565b6000546001600160a01b03848116911614801590611bf357506000546001600160a01b03838116911614155b8015611c1857506001600160a01b03831660009081526005602052604090205460ff16155b8015611c3d57506001600160a01b03821660009081526005602052604090205460ff16155b15611ca557602854811115611ca55760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610d83565b6000611cb03061136c565b90506028548110611cc057506028545b60295481108015908190611cde5750602754600160a01b900460ff16155b8015611d1c57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b8015611d315750602754600160a81b900460ff165b15611d44576029549150611d4482612550565b6001600160a01b03851660009081526004602052604090205460019060ff1680611d8657506001600160a01b03851660009081526004602052604090205460ff165b15611d8f575060005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614158015611e0357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b15611e0c575060005b8015612074577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031603611e6e57601b54601455601c54601555601d54601655601e54601755601f54601855611fd2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031603611fd2576001600160a01b03861660009081526008602052604090206001015460ff1615611f74576000611ed68761293a565b90508015611f72576001600160a01b038716600090815260086020526040902060030154611f038861136c565b611f0d9190613954565b851115611f725760405162461bcd60e51b815260206004820152602d60248201527f596f752063616e206e6f742073656c6c2072657761726420616d6f756e74207560448201526c373a34b61031b7b7b63237bbb760991b6064820152608401610d83565b505b602154601455602254601555602354601655602454601755602554601855601954600160a01b900460ff16611fd257611fab61297e565b601980546001600160a81b0319166001600160a01b039290921691909117600160a01b1790555b6000606485601854601654601554611fea91906139cc565b611ff491906139cc565b611ffe9190613927565b6120089190613a1c565b9050600080601754111561204b576064866017546120269190613927565b6120309190613a1c565b600f5490915061204b9089906001600160a01b031683612a68565b612056883084612a68565b600061206282846139cc565b905061206e8188613954565b96505050505b61208086868684612b52565b6001600160a01b0386166000908152600a602052604090205460ff1680156120da57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b1561215957601a546120eb8661136c565b10612159576001600160a01b0385166000818152600860205260408120600601805460ff191660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b03191690911790555b80801561219757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b0316145b1561222057601a546121a88661136c565b10612220576121b78585612cca565b6001600160a01b0385166000818152600860205260408120600601805460ff191660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b03191690911790555b80801561225e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b0316145b156123a057601a5461226f8761136c565b10156123a0576001600160a01b0385166000908152600860205260408120600601805460ff191690555b60075481101561239e57856001600160a01b0316600782815481106122c0576122c061393e565b6000918252602090912001546001600160a01b03160361238c57600780546122ea90600190613954565b815481106122fa576122fa61393e565b600091825260209091200154600780546001600160a01b0390921691839081106123265761232661393e565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600780548061236557612365613967565b600082815260209020810160001990810180546001600160a01b031916905501905561239e565b806123968161397d565b915050612299565b505b505050505050565b600081848411156123cc5760405162461bcd60e51b8152600401610d83919061370a565b5060006123d98486613954565b95945050505050565b6000546001600160a01b031633146113dd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d83565b6000806000612449612fbb565b9092509050612458828261245f565b9250505090565b6000610da283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061313d565b6000806124ae83856139cc565b905083811015610da25760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610d83565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6027805460ff60a01b1916600160a01b179055602254601c54600091612575916139cc565b90506000602354601d5461258991906139cc565b90506000602554601f5461259d91906139cc565b90506000816125ac84866139cc565b6125b691906139cc565b905060006125d160026125cb84818a8a61316b565b9061245f565b905060006125df87836131ed565b604080516002808252606082018352929350600092909160208301908036833701905050905030816000815181106126195761261961393e565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126bb9190613a30565b816001815181106126ce576126ce61393e565b60200260200101906001600160a01b031690816001600160a01b031681525050612719307f00000000000000000000000000000000000000000000000000000000000000008461197b565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663791ac94783600084306127594261012c6139cc565b6040518663ffffffff1660e01b8152600401612779959493929190613a4d565b600060405180830381600087803b15801561279357600080fd5b505af11580156127a7573d6000803e3d6000fd5b50479250600091506127c690506127bf8a600261245f565b87906131ed565b905060006127db60026125cb8481878f61316b565b905060006127ed836125cb868c61316b565b905060006127fb82846139cc565b6128059047613954565b9050612811888461322f565b6010546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561284b573d6000803e3d6000fd5b50601954600160a01b900460ff161561291e576019805460ff60a01b1981169091556001600160a01b0316600090815260086020526040812060050180548492906128979084906139cc565b90915550506019546040516001600160a01b039091169083156108fc029084906000818181858888f193505050501580156128d6573d6000803e3d6000fd5b50601954604080516001600160a01b039092168252602082018490527f1f637eaa9a6ac5aa52627c5b42f785f7ce3bfc1cc23de840750eeb024a57c9cc910160405180910390a15b50506027805460ff60a01b191690555050505050505050505050565b6001600160a01b03811660009081526006602090815260408083205460089092528220546129699082906139cc565b4210610c915750600092915050565b50919050565b6007546000906129c65760405162461bcd60e51b81526020600482015260136024820152724e6f20656c696769626c6520686f6c6465727360681b6044820152606401610d83565b6007546000906129d461332e565b6129de9190613abe565b90507fe68021786913c099ef3624c6901077fae5528aa314995830faa797bd04787f1960078281548110612a1457612a1461393e565b600091825260209182902001546040516001600160a01b0390911681520160405180910390a160078181548110612a4d57612a4d61393e565b6000918252602090912001546001600160a01b031692915050565b6000806000806000612a79866133a5565b6001600160a01b038d1660009081526001602052604090205494995092975090955093509150612aa990866131ed565b6001600160a01b03808a166000908152600160205260408082209390935590891681522054612ad890856124a1565b6001600160a01b038816600090815260016020526040902055612afb83826133f4565b866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b4091815260200190565b60405180910390a35050505050505050565b80612b7057612b706000601481905560158190556016819055601855565b6001600160a01b03841660009081526009602052604090205460ff168015612bb157506001600160a01b03831660009081526009602052604090205460ff16155b15612bc657612bc1848484613418565b612cc4565b6001600160a01b03841660009081526009602052604090205460ff16158015612c0757506001600160a01b03831660009081526009602052604090205460ff165b15612c1757612bc1848484613488565b6001600160a01b03841660009081526009602052604090205460ff16158015612c5957506001600160a01b03831660009081526009602052604090205460ff16155b15612c6957612bc1848484612a68565b6001600160a01b03841660009081526009602052604090205460ff168015612ca957506001600160a01b03831660009081526009602052604090205460ff165b15612cb957612bc184848461352e565b612cc4848484612a68565b50505050565b60008080612cd661332e565b9250612ce3601184613abe565b600103612db257506002612cf8846001613927565b6001600160a01b038616600090815260066020908152604080832060789055600890915281206001818101805460ff1916909117905542815560020180549294508492909190612d499084906139cc565b90915550506001600160a01b038516600090815260086020526040812060038101849055600401805491612d7c8361397d565b90915550506001600160a01b0385166000908152600860205260408120600701805491612da88361397d565b9190505550612f5a565b612dbd606184613abe565b600103612e8357506005612dd2846004613927565b6001600160a01b038616600090815260066020908152604080832061012c9055600890915281206001818101805460ff1916909117905542815560020180549294508492909190612e249084906139cc565b90915550506001600160a01b038516600090815260086020526040812060038101849055600401805491612e578361397d565b90915550506001600160a01b0385166000908152600860208190526040822001805491612da88361397d565b612e8e60c584613abe565b600103612f5a5750600a612ea3846009613927565b6001600160a01b03861660009081526006602090815260408083206102589055600890915281206001818101805460ff1916909117905542815560020180549294508492909190612ef59084906139cc565b90915550506001600160a01b038516600090815260086020526040812060038101849055600401805491612f288361397d565b90915550506001600160a01b0385166000908152600860205260408120600901805491612f548361397d565b91905055505b811561136557612f6a858361359e565b604080516001600160a01b0387168152602081018390529081018390527f1aa496dfd2ab16a589f559ab4ac58a1d849b029c5ebdb72a848e5c63da10a0e29060600160405180910390a15050505050565b600d54600c546000918291825b600b5481101561310d578260016000600b8481548110612fea57612fea61393e565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061305557508160026000600b848154811061302e5761302e61393e565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561306b57600d54600c54945094505050509091565b6130b160016000600b84815481106130855761308561393e565b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906131ed565b92506130f960026000600b84815481106130cd576130cd61393e565b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906131ed565b9150806131058161397d565b915050612fc8565b50600c54600d5461311d9161245f565b82101561313457600d54600c549350935050509091565b90939092509050565b6000818361315e5760405162461bcd60e51b8152600401610d83919061370a565b5060006123d98486613a1c565b60008260000361317d57506000610c95565b60006131898385613927565b9050826131968583613a1c565b14610da25760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610d83565b6000610da283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506123a8565b61325a307f00000000000000000000000000000000000000000000000000000000000000008461197b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d7198230856000806132a16000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015613309573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906113659190613ad2565b602754604051637439ba1b60e11b81523260048201526000916001600160a01b031690819063e8737436906024016020604051808303816000875af115801561337b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339f9190613996565b91505090565b60008060008060008060006133bc886014546136a1565b9150915060006133ca61243c565b905060008060006133dc8c86866136ce565b919e909d50909b509599509397509395505050505050565b600d5461340190836131ed565b600d55600e5461341190826124a1565b600e555050565b6000806000806000613429866133a5565b6001600160a01b038d166000908152600260205260409020549499509297509095509350915061345990876131ed565b6001600160a01b038916600090815260026020908152604080832093909355600190522054612aa990866131ed565b6000806000806000613499866133a5565b6001600160a01b038d16600090815260016020526040902054949950929750909550935091506134c990866131ed565b6001600160a01b03808a16600090815260016020908152604080832094909455918a168152600290915220546134ff90836124a1565b6001600160a01b038816600090815260026020908152604080832093909355600190522054612ad890856124a1565b600080600080600061353f866133a5565b6001600160a01b038d166000908152600260205260409020549499509297509095509350915061356f90876131ed565b6001600160a01b0389166000908152600260209081526040808320939093556001905220546134c990866131ed565b6001600160a01b0382166135f45760405162461bcd60e51b815260206004820152601f60248201527f42455032303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610d83565b60006135fe61243c565b9050600061360c838361316b565b600c5490915061361c90846124a1565b600c556001600160a01b03841660009081526001602052604090205461364290826124a1565b6001600160a01b0385166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906136939087815260200190565b60405180910390a350505050565b600080806136b460646125cb878761316b565b905060006136c286836131ed565b96919550909350505050565b60008080806136dd878661316b565b905060006136eb878761316b565b905060006136f983836131ed565b929992985090965090945050505050565b600060208083528351808285015260005b818110156137375785810183015185820160400152820161371b565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146118cd57600080fd5b6000806040838503121561378057600080fd5b823561378b81613758565b946020939093013593505050565b6000602082840312156137ab57600080fd5b8135610da281613758565b6000806000606084860312156137cb57600080fd5b83356137d681613758565b925060208401356137e681613758565b929592945050506040919091013590565b60006020828403121561380957600080fd5b5035919050565b6000806040838503121561382357600080fd5b823561382e81613758565b9150602083013561383e81613758565b809150509250929050565b600080600080600060a0868803121561386157600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b80151581146118cd57600080fd5b600080604083850312156138a557600080fd5b82356138b081613758565b9150602083013561383e81613884565b6000602082840312156138d257600080fd5b8135610da281613884565b600181811c908216806138f157607f821691505b60208210810361297857634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610c9557610c95613911565b634e487b7160e01b600052603260045260246000fd5b81810381811115610c9557610c95613911565b634e487b7160e01b600052603160045260246000fd5b60006001820161398f5761398f613911565b5060010190565b6000602082840312156139a857600080fd5b5051919050565b6000602082840312156139c157600080fd5b8151610da281613884565b80820180821115610c9557610c95613911565b81810360008312801583831316838312821617156139ff576139ff613911565b5092915050565b634e487b7160e01b600052601260045260246000fd5b600082613a2b57613a2b613a06565b500490565b600060208284031215613a4257600080fd5b8151610da281613758565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613a9d5784516001600160a01b031683529383019391830191600101613a78565b50506001600160a01b03969096166060850152505050608001529392505050565b600082613acd57613acd613a06565b500690565b600080600060608486031215613ae757600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122069bce2bfc40cd2256bb6e8ccae69e63257e453f304933eebf48516f9bd29597f64736f6c63430008120033

Deployed Bytecode

0x60806040526004361061039b5760003560e01c80637ab6d036116101dc578063bfdf8b1211610102578063e71dc3f5116100a0578063f63743421161006f578063f637434214610b86578063f8a25a9414610b9c578063f8cca59914610bb2578063f992f81c14610bd257600080fd5b8063e71dc3f514610b1a578063ec28438a14610b30578063f11a24d314610b50578063f2fde38b14610b6657600080fd5b8063d12a7688116100dc578063d12a768814610a88578063dd62ed3e14610a9e578063df8408fe14610ae4578063e5fb474614610b0457600080fd5b8063bfdf8b1214610a27578063c49b9a8014610a48578063c5bc8df514610a6857600080fd5b806395d89b411161017a578063a71e061811610149578063a71e0618146109b1578063a9059cbb146109d1578063abcd3a5c146109f1578063adb873bd14610a1157600080fd5b806395d89b41146109365780639d9241ec1461094b578063a457c2d714610961578063a61db3231461098157600080fd5b806388f82020116101b657806388f82020146108b35780638da5cb5b146108ec578063921369131461090a578063941fa5cd1461092057600080fd5b80637ab6d036146108715780637bce5a04146108875780637d1db4a51461089d57600080fd5b806349bd5a5e116102c15780635ea4a8dd1161025f5780637347fb311161022e5780637347fb31146107f15780637571336a1461081157806375f0a87414610831578063764d72bf1461085157600080fd5b80635ea4a8dd1461077c57806370a082311461079c57806370d5ae05146107bc578063715018a6146107dc57600080fd5b80635342acb41161029b5780635342acb4146106ed5780635908f26f1461072657806359b107b9146107465780635d098b381461075c57600080fd5b806349bd5a5e146106785780634a74bb02146106ac57806352390c02146106cd57600080fd5b806329e04b4a116103395780633685d419116103085780633685d4191461055757806339509351146105775780633ae7dc20146105975780633b17a320146105b757600080fd5b806329e04b4a146104dd5780632af4d953146104ff5780632d83811914610515578063313ce5671461053557600080fd5b806310efbc291161037557806310efbc29146104325780631694505e1461046a57806318160ddd1461049e57806323b872dd146104bd57600080fd5b806306fdde03146103a7578063095ea7b3146103d257806310d5de531461040257600080fd5b366103a257005b600080fd5b3480156103b357600080fd5b506103bc610bf2565b6040516103c9919061370a565b60405180910390f35b3480156103de57600080fd5b506103f26103ed36600461376d565b610c84565b60405190151581526020016103c9565b34801561040e57600080fd5b506103f261041d366004613799565b60056020526000908152604090205460ff1681565b34801561043e57600080fd5b50601954610452906001600160a01b031681565b6040516001600160a01b0390911681526020016103c9565b34801561047657600080fd5b506104527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b3480156104aa57600080fd5b50600c545b6040519081526020016103c9565b3480156104c957600080fd5b506103f26104d83660046137b6565b610c9b565b3480156104e957600080fd5b506104fd6104f83660046137f7565b610d04565b005b34801561050b57600080fd5b506104af601f5481565b34801561052157600080fd5b506104af6105303660046137f7565b610d20565b34801561054157600080fd5b5060135460405160ff90911681526020016103c9565b34801561056357600080fd5b506104fd610572366004613799565b610da9565b34801561058357600080fd5b506103f261059236600461376d565b610f7b565b3480156105a357600080fd5b506104fd6105b2366004613810565b610fb1565b3480156105c357600080fd5b5061062c6105d2366004613799565b60086020819052600091825260409091208054600182015460028301546003840154600485015460058601546006870154600788015498880154600990980154969860ff968716989597949693959294919093169291908a565b604080519a8b5298151560208b0152978901969096526060880194909452608087019290925260a0860152151560c085015260e0840152610100830152610120820152610140016103c9565b34801561068457600080fd5b506104527f000000000000000000000000d4c45c75e93f0b1f3b3b0331ab141236b01f8ab781565b3480156106b857600080fd5b506027546103f290600160a81b900460ff1681565b3480156106d957600080fd5b506104fd6106e8366004613799565b61109f565b3480156106f957600080fd5b506103f2610708366004613799565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561073257600080fd5b50602754610452906001600160a01b031681565b34801561075257600080fd5b506104af60205481565b34801561076857600080fd5b506104fd610777366004613799565b611200565b34801561078857600080fd5b506104fd610797366004613849565b6112c4565b3480156107a857600080fd5b506104af6107b7366004613799565b61136c565b3480156107c857600080fd5b50600f54610452906001600160a01b031681565b3480156107e857600080fd5b506104fd6113cb565b3480156107fd57600080fd5b506104fd61080c366004613892565b6113df565b34801561081d57600080fd5b506104fd61082c366004613892565b6114a7565b34801561083d57600080fd5b50601054610452906001600160a01b031681565b34801561085d57600080fd5b506104fd61086c366004613799565b6114da565b34801561087d57600080fd5b506104af601a5481565b34801561089357600080fd5b506104af601d5481565b3480156108a957600080fd5b506104af60285481565b3480156108bf57600080fd5b506103f26108ce366004613799565b6001600160a01b031660009081526009602052604090205460ff1690565b3480156108f857600080fd5b506000546001600160a01b0316610452565b34801561091657600080fd5b506104af60235481565b34801561092c57600080fd5b506104af601b5481565b34801561094257600080fd5b506103bc611517565b34801561095757600080fd5b506104af60265481565b34801561096d57600080fd5b506103f261097c36600461376d565b611526565b34801561098d57600080fd5b506103f261099c366004613799565b600a6020526000908152604090205460ff1681565b3480156109bd57600080fd5b506104fd6109cc366004613849565b611575565b3480156109dd57600080fd5b506103f26109ec36600461376d565b611616565b3480156109fd57600080fd5b506104fd610a0c366004613799565b611623565b348015610a1d57600080fd5b506104af60245481565b348015610a3357600080fd5b506019546103f290600160a01b900460ff1681565b348015610a5457600080fd5b506104fd610a633660046138c0565b6116e0565b348015610a7457600080fd5b506104fd610a833660046137f7565b611735565b348015610a9457600080fd5b506104af60295481565b348015610aaa57600080fd5b506104af610ab9366004613810565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b348015610af057600080fd5b506104fd610aff366004613892565b611742565b348015610b1057600080fd5b506104af60255481565b348015610b2657600080fd5b506104af601e5481565b348015610b3c57600080fd5b506104fd610b4b3660046137f7565b6117ad565b348015610b5c57600080fd5b506104af601c5481565b348015610b7257600080fd5b506104fd610b81366004613799565b611857565b348015610b9257600080fd5b506104af60225481565b348015610ba857600080fd5b506104af60215481565b348015610bbe57600080fd5b50610452610bcd3660046137f7565b6118d0565b348015610bde57600080fd5b506104af610bed366004613799565b6118fa565b606060118054610c01906138dd565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2d906138dd565b8015610c7a5780601f10610c4f57610100808354040283529160200191610c7a565b820191906000526020600020905b815481529060010190602001808311610c5d57829003601f168201915b5050505050905090565b6000610c9133848461197b565b5060015b92915050565b6000610ca8848484611a9f565b610cfa8433610cf585604051806060016040528060288152602001613b01602891396001600160a01b038a16600090815260036020908152604080832033845290915290205491906123a8565b61197b565b5060019392505050565b610d0c6123e2565b610d1a816305f5e100613927565b60295550565b6000600d54821115610d8c5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084015b60405180910390fd5b6000610d9661243c565b9050610da2838261245f565b9392505050565b610db16123e2565b6001600160a01b03811660009081526009602052604090205460ff16610e195760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610d83565b60005b600b54811015610f3a57816001600160a01b0316600b8281548110610e4357610e4361393e565b6000918252602090912001546001600160a01b031603610f2857600b8054610e6d90600190613954565b81548110610e7d57610e7d61393e565b600091825260209091200154600b80546001600160a01b039092169183908110610ea957610ea961393e565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600990925220805460ff19169055600b805480610f0157610f01613967565b600082815260209020810160001990810180546001600160a01b0319169055019055610f3a565b80610f328161397d565b915050610e1c565b506040516001600160a01b03821681527fb5cb89dffbcb5ab9899127c4fa08550bc12152ec67d8a60d6eef1f53ff28de1d906020015b60405180910390a150565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610c91918590610cf590866124a1565b610fb96123e2565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa158015611007573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102b9190613996565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611076573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109a91906139af565b505050565b6110a76123e2565b6001600160a01b03811660009081526009602052604090205460ff16156111105760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610d83565b6001600160a01b0381166000908152600160205260409020541561116a576001600160a01b03811660009081526001602052604090205461115090610d20565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b0381166000818152600960209081526040808320805460ff19166001908117909155600b805491820181559093527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db990920180546001600160a01b0319168417905590519182527f1af41e5d0a29f48e42c4b0fd6708807d18756226226a8cb539076e78312d1d149101610f70565b6112086123e2565b6001600160a01b0381166112765760405162461bcd60e51b815260206004820152602f60248201527f42455032303a204d61726b6574696e672077616c6c65742063616e6e6f74207460448201526e6865207a65726f206164647265737360881b6064820152608401610d83565b601080546001600160a01b0319166001600160a01b0383169081179091556040519081527f15630e5b9ff3d692866b1a3699c892e9fd786cb6d6e4a776ed5386dfb7effa9590602001610f70565b6112cc6123e2565b602185905560228490556023839055602482905560258190558082846112f287896139cc565b6112fc91906139cc565b61130691906139cc565b61131091906139cc565b6026819055601410156113655760405162461bcd60e51b815260206004820152601960248201527f53656c6c20546178206c696d69742065786365656465642121000000000000006044820152606401610d83565b5050505050565b6001600160a01b03811660009081526009602052604081205460ff16156113a957506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610c9590610d20565b6113d36123e2565b6113dd6000612500565b565b6113e76123e2565b6001600160a01b03821661144b5760405162461bcd60e51b815260206004820152602560248201527f42455032303a2050726573616c652063616e6e6f74206265207a65726f206164604482015264647265737360d81b6064820152608401610d83565b6001600160a01b0382166000908152600a60205260409020805460ff19168215801591909117909155611486576114818261109f565b61148f565b61148f82610da9565b6114998282611742565b6114a382826114a7565b5050565b6114af6123e2565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6114e26123e2565b6040516001600160a01b038216904780156108fc02916000818181858888f193505050501580156114a3573d6000803e3d6000fd5b606060128054610c01906138dd565b6000610c913384610cf585604051806060016040528060258152602001613b29602591393360009081526003602090815260408083206001600160a01b038d16845290915290205491906123a8565b61157d6123e2565b601b859055601c849055601d839055601e829055601f8190558082846115a387896139cc565b6115ad91906139cc565b6115b791906139cc565b6115c191906139cc565b6020819055601410156113655760405162461bcd60e51b815260206004820152601860248201527f42757920546178206c696d6974206578636565646564212100000000000000006044820152606401610d83565b6000610c91338484611a9f565b61162b6123e2565b6001600160a01b0381166116925760405162461bcd60e51b815260206004820152602860248201527f42455032303a2052616e646f6d697a65722063616e6e6f74206265207a65726f604482015267206164647265737360c01b6064820152608401610d83565b602780546001600160a01b0319166001600160a01b0383169081179091556040519081527f030d6e377f4b676dc88e42dd51deb6aafd0e29327c41f417aeb25c900244428190602001610f70565b6116e86123e2565b60278054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610f7090831515815260200190565b61173d6123e2565b601a55565b61174a6123e2565b6001600160a01b038216600081815260046020908152604091829020805460ff19168515159081179091558251938452908301527f6b7cadbf6051d0bc8ccf16052682ffb97181438c85ecbce856fc185b1d07dd0e910160405180910390a15050565b6117b56123e2565b620186a08110156118145760405162461bcd60e51b8152602060048201526024808201527f416d6f756e74206d757374206265206d6f7265207468616e203130306b20746f6044820152636b656e7360e01b6064820152608401610d83565b611822816305f5e100613927565b60288190556040519081527f159e7d0d4ece10d438c16951d3b9b383c9b003f699ad639f43e755016a3e568890602001610f70565b61185f6123e2565b6001600160a01b0381166118c45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d83565b6118cd81612500565b50565b600781815481106118e057600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b03811660009081526008602052604081206001015460ff1615611973576001600160a01b0382166000908152600660209081526040808320546008909252822054829161194d916139cc565b9050428111156119695761196142826139df565b949350505050565b5060009392505050565b506000919050565b6001600160a01b0383166119dd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d83565b6001600160a01b038216611a3e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d83565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611b035760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610d83565b6001600160a01b038216611b655760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610d83565b60008111611bc75760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610d83565b6000546001600160a01b03848116911614801590611bf357506000546001600160a01b03838116911614155b8015611c1857506001600160a01b03831660009081526005602052604090205460ff16155b8015611c3d57506001600160a01b03821660009081526005602052604090205460ff16155b15611ca557602854811115611ca55760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610d83565b6000611cb03061136c565b90506028548110611cc057506028545b60295481108015908190611cde5750602754600160a01b900460ff16155b8015611d1c57507f000000000000000000000000d4c45c75e93f0b1f3b3b0331ab141236b01f8ab76001600160a01b0316856001600160a01b031614155b8015611d315750602754600160a81b900460ff165b15611d44576029549150611d4482612550565b6001600160a01b03851660009081526004602052604090205460019060ff1680611d8657506001600160a01b03851660009081526004602052604090205460ff165b15611d8f575060005b7f000000000000000000000000d4c45c75e93f0b1f3b3b0331ab141236b01f8ab76001600160a01b0316866001600160a01b031614158015611e0357507f000000000000000000000000d4c45c75e93f0b1f3b3b0331ab141236b01f8ab76001600160a01b0316856001600160a01b031614155b15611e0c575060005b8015612074577f000000000000000000000000d4c45c75e93f0b1f3b3b0331ab141236b01f8ab76001600160a01b0316866001600160a01b031603611e6e57601b54601455601c54601555601d54601655601e54601755601f54601855611fd2565b7f000000000000000000000000d4c45c75e93f0b1f3b3b0331ab141236b01f8ab76001600160a01b0316856001600160a01b031603611fd2576001600160a01b03861660009081526008602052604090206001015460ff1615611f74576000611ed68761293a565b90508015611f72576001600160a01b038716600090815260086020526040902060030154611f038861136c565b611f0d9190613954565b851115611f725760405162461bcd60e51b815260206004820152602d60248201527f596f752063616e206e6f742073656c6c2072657761726420616d6f756e74207560448201526c373a34b61031b7b7b63237bbb760991b6064820152608401610d83565b505b602154601455602254601555602354601655602454601755602554601855601954600160a01b900460ff16611fd257611fab61297e565b601980546001600160a81b0319166001600160a01b039290921691909117600160a01b1790555b6000606485601854601654601554611fea91906139cc565b611ff491906139cc565b611ffe9190613927565b6120089190613a1c565b9050600080601754111561204b576064866017546120269190613927565b6120309190613a1c565b600f5490915061204b9089906001600160a01b031683612a68565b612056883084612a68565b600061206282846139cc565b905061206e8188613954565b96505050505b61208086868684612b52565b6001600160a01b0386166000908152600a602052604090205460ff1680156120da57507f000000000000000000000000d4c45c75e93f0b1f3b3b0331ab141236b01f8ab76001600160a01b0316856001600160a01b031614155b1561215957601a546120eb8661136c565b10612159576001600160a01b0385166000818152600860205260408120600601805460ff191660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b03191690911790555b80801561219757507f000000000000000000000000d4c45c75e93f0b1f3b3b0331ab141236b01f8ab76001600160a01b0316866001600160a01b0316145b1561222057601a546121a88661136c565b10612220576121b78585612cca565b6001600160a01b0385166000818152600860205260408120600601805460ff191660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b03191690911790555b80801561225e57507f000000000000000000000000d4c45c75e93f0b1f3b3b0331ab141236b01f8ab76001600160a01b0316856001600160a01b0316145b156123a057601a5461226f8761136c565b10156123a0576001600160a01b0385166000908152600860205260408120600601805460ff191690555b60075481101561239e57856001600160a01b0316600782815481106122c0576122c061393e565b6000918252602090912001546001600160a01b03160361238c57600780546122ea90600190613954565b815481106122fa576122fa61393e565b600091825260209091200154600780546001600160a01b0390921691839081106123265761232661393e565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600780548061236557612365613967565b600082815260209020810160001990810180546001600160a01b031916905501905561239e565b806123968161397d565b915050612299565b505b505050505050565b600081848411156123cc5760405162461bcd60e51b8152600401610d83919061370a565b5060006123d98486613954565b95945050505050565b6000546001600160a01b031633146113dd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d83565b6000806000612449612fbb565b9092509050612458828261245f565b9250505090565b6000610da283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061313d565b6000806124ae83856139cc565b905083811015610da25760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610d83565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6027805460ff60a01b1916600160a01b179055602254601c54600091612575916139cc565b90506000602354601d5461258991906139cc565b90506000602554601f5461259d91906139cc565b90506000816125ac84866139cc565b6125b691906139cc565b905060006125d160026125cb84818a8a61316b565b9061245f565b905060006125df87836131ed565b604080516002808252606082018352929350600092909160208301908036833701905050905030816000815181106126195761261961393e565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126bb9190613a30565b816001815181106126ce576126ce61393e565b60200260200101906001600160a01b031690816001600160a01b031681525050612719307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461197b565b6001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1663791ac94783600084306127594261012c6139cc565b6040518663ffffffff1660e01b8152600401612779959493929190613a4d565b600060405180830381600087803b15801561279357600080fd5b505af11580156127a7573d6000803e3d6000fd5b50479250600091506127c690506127bf8a600261245f565b87906131ed565b905060006127db60026125cb8481878f61316b565b905060006127ed836125cb868c61316b565b905060006127fb82846139cc565b6128059047613954565b9050612811888461322f565b6010546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561284b573d6000803e3d6000fd5b50601954600160a01b900460ff161561291e576019805460ff60a01b1981169091556001600160a01b0316600090815260086020526040812060050180548492906128979084906139cc565b90915550506019546040516001600160a01b039091169083156108fc029084906000818181858888f193505050501580156128d6573d6000803e3d6000fd5b50601954604080516001600160a01b039092168252602082018490527f1f637eaa9a6ac5aa52627c5b42f785f7ce3bfc1cc23de840750eeb024a57c9cc910160405180910390a15b50506027805460ff60a01b191690555050505050505050505050565b6001600160a01b03811660009081526006602090815260408083205460089092528220546129699082906139cc565b4210610c915750600092915050565b50919050565b6007546000906129c65760405162461bcd60e51b81526020600482015260136024820152724e6f20656c696769626c6520686f6c6465727360681b6044820152606401610d83565b6007546000906129d461332e565b6129de9190613abe565b90507fe68021786913c099ef3624c6901077fae5528aa314995830faa797bd04787f1960078281548110612a1457612a1461393e565b600091825260209182902001546040516001600160a01b0390911681520160405180910390a160078181548110612a4d57612a4d61393e565b6000918252602090912001546001600160a01b031692915050565b6000806000806000612a79866133a5565b6001600160a01b038d1660009081526001602052604090205494995092975090955093509150612aa990866131ed565b6001600160a01b03808a166000908152600160205260408082209390935590891681522054612ad890856124a1565b6001600160a01b038816600090815260016020526040902055612afb83826133f4565b866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b4091815260200190565b60405180910390a35050505050505050565b80612b7057612b706000601481905560158190556016819055601855565b6001600160a01b03841660009081526009602052604090205460ff168015612bb157506001600160a01b03831660009081526009602052604090205460ff16155b15612bc657612bc1848484613418565b612cc4565b6001600160a01b03841660009081526009602052604090205460ff16158015612c0757506001600160a01b03831660009081526009602052604090205460ff165b15612c1757612bc1848484613488565b6001600160a01b03841660009081526009602052604090205460ff16158015612c5957506001600160a01b03831660009081526009602052604090205460ff16155b15612c6957612bc1848484612a68565b6001600160a01b03841660009081526009602052604090205460ff168015612ca957506001600160a01b03831660009081526009602052604090205460ff165b15612cb957612bc184848461352e565b612cc4848484612a68565b50505050565b60008080612cd661332e565b9250612ce3601184613abe565b600103612db257506002612cf8846001613927565b6001600160a01b038616600090815260066020908152604080832060789055600890915281206001818101805460ff1916909117905542815560020180549294508492909190612d499084906139cc565b90915550506001600160a01b038516600090815260086020526040812060038101849055600401805491612d7c8361397d565b90915550506001600160a01b0385166000908152600860205260408120600701805491612da88361397d565b9190505550612f5a565b612dbd606184613abe565b600103612e8357506005612dd2846004613927565b6001600160a01b038616600090815260066020908152604080832061012c9055600890915281206001818101805460ff1916909117905542815560020180549294508492909190612e249084906139cc565b90915550506001600160a01b038516600090815260086020526040812060038101849055600401805491612e578361397d565b90915550506001600160a01b0385166000908152600860208190526040822001805491612da88361397d565b612e8e60c584613abe565b600103612f5a5750600a612ea3846009613927565b6001600160a01b03861660009081526006602090815260408083206102589055600890915281206001818101805460ff1916909117905542815560020180549294508492909190612ef59084906139cc565b90915550506001600160a01b038516600090815260086020526040812060038101849055600401805491612f288361397d565b90915550506001600160a01b0385166000908152600860205260408120600901805491612f548361397d565b91905055505b811561136557612f6a858361359e565b604080516001600160a01b0387168152602081018390529081018390527f1aa496dfd2ab16a589f559ab4ac58a1d849b029c5ebdb72a848e5c63da10a0e29060600160405180910390a15050505050565b600d54600c546000918291825b600b5481101561310d578260016000600b8481548110612fea57612fea61393e565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118061305557508160026000600b848154811061302e5761302e61393e565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561306b57600d54600c54945094505050509091565b6130b160016000600b84815481106130855761308561393e565b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906131ed565b92506130f960026000600b84815481106130cd576130cd61393e565b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906131ed565b9150806131058161397d565b915050612fc8565b50600c54600d5461311d9161245f565b82101561313457600d54600c549350935050509091565b90939092509050565b6000818361315e5760405162461bcd60e51b8152600401610d83919061370a565b5060006123d98486613a1c565b60008260000361317d57506000610c95565b60006131898385613927565b9050826131968583613a1c565b14610da25760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610d83565b6000610da283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506123a8565b61325a307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461197b565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d7198230856000806132a16000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015613309573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906113659190613ad2565b602754604051637439ba1b60e11b81523260048201526000916001600160a01b031690819063e8737436906024016020604051808303816000875af115801561337b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339f9190613996565b91505090565b60008060008060008060006133bc886014546136a1565b9150915060006133ca61243c565b905060008060006133dc8c86866136ce565b919e909d50909b509599509397509395505050505050565b600d5461340190836131ed565b600d55600e5461341190826124a1565b600e555050565b6000806000806000613429866133a5565b6001600160a01b038d166000908152600260205260409020549499509297509095509350915061345990876131ed565b6001600160a01b038916600090815260026020908152604080832093909355600190522054612aa990866131ed565b6000806000806000613499866133a5565b6001600160a01b038d16600090815260016020526040902054949950929750909550935091506134c990866131ed565b6001600160a01b03808a16600090815260016020908152604080832094909455918a168152600290915220546134ff90836124a1565b6001600160a01b038816600090815260026020908152604080832093909355600190522054612ad890856124a1565b600080600080600061353f866133a5565b6001600160a01b038d166000908152600260205260409020549499509297509095509350915061356f90876131ed565b6001600160a01b0389166000908152600260209081526040808320939093556001905220546134c990866131ed565b6001600160a01b0382166135f45760405162461bcd60e51b815260206004820152601f60248201527f42455032303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610d83565b60006135fe61243c565b9050600061360c838361316b565b600c5490915061361c90846124a1565b600c556001600160a01b03841660009081526001602052604090205461364290826124a1565b6001600160a01b0385166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906136939087815260200190565b60405180910390a350505050565b600080806136b460646125cb878761316b565b905060006136c286836131ed565b96919550909350505050565b60008080806136dd878661316b565b905060006136eb878761316b565b905060006136f983836131ed565b929992985090965090945050505050565b600060208083528351808285015260005b818110156137375785810183015185820160400152820161371b565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146118cd57600080fd5b6000806040838503121561378057600080fd5b823561378b81613758565b946020939093013593505050565b6000602082840312156137ab57600080fd5b8135610da281613758565b6000806000606084860312156137cb57600080fd5b83356137d681613758565b925060208401356137e681613758565b929592945050506040919091013590565b60006020828403121561380957600080fd5b5035919050565b6000806040838503121561382357600080fd5b823561382e81613758565b9150602083013561383e81613758565b809150509250929050565b600080600080600060a0868803121561386157600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b80151581146118cd57600080fd5b600080604083850312156138a557600080fd5b82356138b081613758565b9150602083013561383e81613884565b6000602082840312156138d257600080fd5b8135610da281613884565b600181811c908216806138f157607f821691505b60208210810361297857634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610c9557610c95613911565b634e487b7160e01b600052603260045260246000fd5b81810381811115610c9557610c95613911565b634e487b7160e01b600052603160045260246000fd5b60006001820161398f5761398f613911565b5060010190565b6000602082840312156139a857600080fd5b5051919050565b6000602082840312156139c157600080fd5b8151610da281613884565b80820180821115610c9557610c95613911565b81810360008312801583831316838312821617156139ff576139ff613911565b5092915050565b634e487b7160e01b600052601260045260246000fd5b600082613a2b57613a2b613a06565b500490565b600060208284031215613a4257600080fd5b8151610da281613758565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613a9d5784516001600160a01b031683529383019391830191600101613a78565b50506001600160a01b03969096166060850152505050608001529392505050565b600082613acd57613acd613a06565b500690565b600080600060608486031215613ae757600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122069bce2bfc40cd2256bb6e8ccae69e63257e453f304933eebf48516f9bd29597f64736f6c63430008120033

Deployed Bytecode Sourcemap

27275:28206:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32058:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33043:193;;;;;;;;;;-1:-1:-1;33043:193:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;33043:193:0;1023:187:1;27627:64:0;;;;;;;;;;-1:-1:-1;27627:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;28936:28;;;;;;;;;;-1:-1:-1;28936:28:0;;;;-1:-1:-1;;;;;28936:28:0;;;;;;-1:-1:-1;;;;;1631:32:1;;;1613:51;;1601:2;1586:18;28936:28:0;1467:203:1;29728:51:0;;;;;;;;;;;;;;;32335:95;;;;;;;;;;-1:-1:-1;32415:7:0;;32335:95;;;2056:25:1;;;2044:2;2029:18;32335:95:0;1910:177:1;33244:446:0;;;;;;;;;;-1:-1:-1;33244:446:0;;;;;:::i;:::-;;:::i;38613:181::-;;;;;;;;;;-1:-1:-1;38613:181:0;;;;;:::i;:::-;;:::i;:::-;;29263:32;;;;;;;;;;;;;;;;35103:322;;;;;;;;;;-1:-1:-1;35103:322:0;;;;;:::i;:::-;;:::i;32244:83::-;;;;;;;;;;-1:-1:-1;32310:9:0;;32244:83;;32310:9;;;;2880:36:1;;2868:2;2853:18;32244:83:0;2738:184:1;35816:516:0;;;;;;;;;;-1:-1:-1;35816:516:0;;;;;:::i;:::-;;:::i;33698:300::-;;;;;;;;;;-1:-1:-1;33698:300:0;;;;;:::i;:::-;;:::i;39092:243::-;;;;;;;;;;-1:-1:-1;39092:243:0;;;;;:::i;:::-;;:::i;28109:46::-;;;;;;;;;;-1:-1:-1;28109:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3720:25:1;;;3788:14;;3781:22;3776:2;3761:18;;3754:50;3820:18;;;3813:34;;;;3878:2;3863:18;;3856:34;;;;3921:3;3906:19;;3899:35;;;;3965:3;3950:19;;3943:35;4022:14;4015:22;4009:3;3994:19;;3987:51;4069:3;4054:19;;4047:35;4113:3;4098:19;;4091:35;4157:3;4142:19;;4135:35;3707:3;3692:19;28109:46:0;3333:843:1;29786:38:0;;;;;;;;;;;;;;;29904:40;;;;;;;;;;-1:-1:-1;29904:40:0;;;;-1:-1:-1;;;29904:40:0;;;;;;35433:375;;;;;;;;;;-1:-1:-1;35433:375:0;;;;;:::i;:::-;;:::i;41976:124::-;;;;;;;;;;-1:-1:-1;41976:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;42065:27:0;42041:4;42065:27;;;:18;:27;;;;;;;;;41976:124;29831:27;;;;;;;;;;-1:-1:-1;29831:27:0;;;;-1:-1:-1;;;;;29831:27:0;;;29302:112;;;;;;;;;;;;;;;;38802:282;;;;;;;;;;-1:-1:-1;38802:282:0;;;;;:::i;:::-;;:::i;38003:602::-;;;;;;;;;;-1:-1:-1;38003:602:0;;;;;:::i;:::-;;:::i;32438:198::-;;;;;;;;;;-1:-1:-1;32438:198:0;;;;;:::i;:::-;;:::i;28490:71::-;;;;;;;;;;-1:-1:-1;28490:71:0;;;;-1:-1:-1;;;;;28490:71:0;;;9848:103;;;;;;;;;;;;;:::i;53120:441::-;;;;;;;;;;-1:-1:-1;53120:441:0;;;;;:::i;:::-;;:::i;34941:154::-;;;;;;;;;;-1:-1:-1;34941:154:0;;;;;:::i;:::-;;:::i;28568:75::-;;;;;;;;;;-1:-1:-1;28568:75:0;;;;-1:-1:-1;;;;;28568:75:0;;;39343:164;;;;;;;;;;-1:-1:-1;39343:164:0;;;;;:::i;:::-;;:::i;29006:46::-;;;;;;;;;;;;;;;;29186:34;;;;;;;;;;;;;;;;29953:44;;;;;;;;;;;;;;;;34813:120;;;;;;;;;;-1:-1:-1;34813:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;34905:20:0;34881:4;34905:20;;;:11;:20;;;;;;;;;34813:120;9200:87;;;;;;;;;;-1:-1:-1;9246:7:0;9273:6;-1:-1:-1;;;;;9273:6:0;9200:87;;29501:35;;;;;;;;;;;;;;;;29110:28;;;;;;;;;;;;;;;;32149:87;;;;;;;;;;;;;:::i;29620:99::-;;;;;;;;;;;;;;;;34006:400;;;;;;;;;;-1:-1:-1;34006:400:0;;;;;:::i;:::-;;:::i;28213:45::-;;;;;;;;;;-1:-1:-1;28213:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;37446:549;;;;;;;;;;-1:-1:-1;37446:549:0;;;;;:::i;:::-;;:::i;32644:199::-;;;;;;;;;;-1:-1:-1;32644:199:0;;;;;:::i;:::-;;:::i;53569:237::-;;;;;;;;;;-1:-1:-1;53569:237:0;;;;;:::i;:::-;;:::i;29543:30::-;;;;;;;;;;;;;;;;28971:28;;;;;;;;;;-1:-1:-1;28971:28:0;;;;-1:-1:-1;;;28971:28:0;;;;;;39515:171;;;;;;;;;;-1:-1:-1;39515:171:0;;;;;:::i;:::-;;:::i;31939:111::-;;;;;;;;;;-1:-1:-1;31939:111:0;;;;;:::i;:::-;;:::i;30004:60::-;;;;;;;;;;;;;;;;32851:184;;;;;;;;;;-1:-1:-1;32851:184:0;;;;;:::i;:::-;-1:-1:-1;;;;;33000:18:0;;;32968:7;33000:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;32851:184;36965:180;;;;;;;;;;-1:-1:-1;36965:180:0;;;;;:::i;:::-;;:::i;29580:33::-;;;;;;;;;;;;;;;;29227:29;;;;;;;;;;;;;;;;37153:279;;;;;;;;;;-1:-1:-1;37153:279:0;;;;;:::i;:::-;;:::i;29145:34::-;;;;;;;;;;;;;;;;10106:238;;;;;;;;;;-1:-1:-1;10106:238:0;;;;;:::i;:::-;;:::i;29459:35::-;;;;;;;;;;;;;;;;29423:29;;;;;;;;;;;;;;;;27789:32;;;;;;;;;;-1:-1:-1;27789:32:0;;;;;:::i;:::-;;:::i;47196:548::-;;;;;;;;;;-1:-1:-1;47196:548:0;;;;;:::i;:::-;;:::i;32058:83::-;32095:13;32128:5;32121:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32058:83;:::o;33043:193::-;33145:4;33167:39;8339:10;33190:7;33199:6;33167:8;:39::i;:::-;-1:-1:-1;33224:4:0;33043:193;;;;;:::o;33244:446::-;33376:4;33393:36;33403:6;33411:9;33422:6;33393:9;:36::i;:::-;33440:220;33463:6;8339:10;33511:138;33567:6;33511:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33511:19:0;;;;;;:11;:19;;;;;;;;8339:10;33511:33;;;;;;;;;;:37;:138::i;:::-;33440:8;:220::i;:::-;-1:-1:-1;33678:4:0;33244:446;;;;;:::o;38613:181::-;9086:13;:11;:13::i;:::-;38759:27:::1;:19:::0;38781:5:::1;38759:27;:::i;:::-;38727:29;:59:::0;-1:-1:-1;38613:181:0:o;35103:322::-;35197:7;35255;;35244;:18;;35222:110;;;;-1:-1:-1;;;35222:110:0;;7121:2:1;35222:110:0;;;7103:21:1;7160:2;7140:18;;;7133:30;7199:34;7179:18;;;7172:62;-1:-1:-1;;;7250:18:1;;;7243:40;7300:19;;35222:110:0;;;;;;;;;35343:19;35365:10;:8;:10::i;:::-;35343:32;-1:-1:-1;35393:24:0;:7;35343:32;35393:11;:24::i;:::-;35386:31;35103:322;-1:-1:-1;;;35103:322:0:o;35816:516::-;9086:13;:11;:13::i;:::-;-1:-1:-1;;;;;35894:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;35886:60;;;::::0;-1:-1:-1;;;35886:60:0;;7532:2:1;35886:60:0::1;::::0;::::1;7514:21:1::0;7571:2;7551:18;;;7544:30;7610:29;7590:18;;;7583:57;7657:18;;35886:60:0::1;7330:351:1::0;35886:60:0::1;35962:9;35957:327;35981:9;:16:::0;35977:20;::::1;35957:327;;;36039:7;-1:-1:-1::0;;;;;36023:23:0::1;:9;36033:1;36023:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;36023:12:0::1;:23:::0;36019:254:::1;;36082:9;36092:16:::0;;:20:::1;::::0;36111:1:::1;::::0;36092:20:::1;:::i;:::-;36082:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;36067:9:::1;:12:::0;;-1:-1:-1;;;;;36082:31:0;;::::1;::::0;36077:1;;36067:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;36067:46:0::1;-1:-1:-1::0;;;;;36067:46:0;;::::1;;::::0;;36132:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;36171:11:::1;:20:::0;;;;:28;;-1:-1:-1;;36171:28:0::1;::::0;;36218:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;36218:15:0;;;;;-1:-1:-1;;;;;;36218:15:0::1;::::0;;;;;36252:5:::1;;36019:254;35999:3:::0;::::1;::::0;::::1;:::i;:::-;;;;35957:327;;;-1:-1:-1::0;36299:25:0::1;::::0;-1:-1:-1;;;;;1631:32:1;;1613:51;;36299:25:0::1;::::0;1601:2:1;1586:18;36299:25:0::1;;;;;;;;35816:516:::0;:::o;33698:300::-;8339:10;33813:4;33907:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;33907:34:0;;;;;;;;;;33813:4;;33835:133;;33885:7;;33907:50;;33946:10;33907:38;:50::i;39092:243::-;9086:13;:11;:13::i;:::-;39279:37:::1;::::0;-1:-1:-1;;;39279:37:0;;39310:4:::1;39279:37;::::0;::::1;1613:51:1::0;-1:-1:-1;;;;;39215:21:0;::::1;::::0;::::1;::::0;39251:13;;39215:21;;39279:22:::1;::::0;1586:18:1;;39279:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39215:112;::::0;-1:-1:-1;;;;;;39215:112:0::1;::::0;;;;;;-1:-1:-1;;;;;8604:32:1;;;39215:112:0::1;::::0;::::1;8586:51:1::0;8653:18;;;8646:34;8559:18;;39215:112:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39092:243:::0;;:::o;35433:375::-;9086:13;:11;:13::i;:::-;-1:-1:-1;;;;;35514:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;35513:21;35505:61;;;::::0;-1:-1:-1;;;35505:61:0;;7532:2:1;35505:61:0::1;::::0;::::1;7514:21:1::0;7571:2;7551:18;;;7544:30;7610:29;7590:18;;;7583:57;7657:18;;35505:61:0::1;7330:351:1::0;35505:61:0::1;-1:-1:-1::0;;;;;35581:16:0;::::1;35600:1;35581:16:::0;;;:7:::1;:16;::::0;;;;;:20;35577:109:::1;;-1:-1:-1::0;;;;;35657:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;35637:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;35618:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;35577:109:::1;-1:-1:-1::0;;;;;35696:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;;;:27;;-1:-1:-1;;35696:27:0::1;35719:4;35696:27:::0;;::::1;::::0;;;35734:9:::1;:23:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;35734:23:0::1;::::0;::::1;::::0;;35773:27;;1613:51:1;;;35773:27:0::1;::::0;1586:18:1;35773:27:0::1;1467:203:1::0;38802:282:0;9086:13;:11;:13::i;:::-;-1:-1:-1;;;;;38894:30:0;::::1;38886:90;;;::::0;-1:-1:-1;;;38886:90:0;;9143:2:1;38886:90:0::1;::::0;::::1;9125:21:1::0;9182:2;9162:18;;;9155:30;9221:34;9201:18;;;9194:62;-1:-1:-1;;;9272:18:1;;;9265:45;9327:19;;38886:90:0::1;8941:411:1::0;38886:90:0::1;38987:15;:34:::0;;-1:-1:-1;;;;;;38987:34:0::1;-1:-1:-1::0;;;;;38987:34:0;::::1;::::0;;::::1;::::0;;;39037:39:::1;::::0;1613:51:1;;;39037:39:0::1;::::0;1601:2:1;1586:18;39037:39:0::1;1467:203:1::0;38003:602:0;9086:13;:11;:13::i;:::-;38227:10:::1;:24:::0;;;38262:16:::1;:36:::0;;;38309:16:::1;:36:::0;;;38356:11:::1;:26:::0;;;38393:14:::1;:32:::0;;;38410:15;38370:12;38328:17;38451:29:::1;38281:17:::0;38240:11;38451:29:::1;:::i;:::-;:48;;;;:::i;:::-;:62;;;;:::i;:::-;:79;;;;:::i;:::-;38436:12;:94:::0;;;38565:2:::1;-1:-1:-1::0;38549:18:0::1;38541:56;;;::::0;-1:-1:-1;;;38541:56:0;;9689:2:1;38541:56:0::1;::::0;::::1;9671:21:1::0;9728:2;9708:18;;;9701:30;9767:27;9747:18;;;9740:55;9812:18;;38541:56:0::1;9487:349:1::0;38541:56:0::1;38003:602:::0;;;;;:::o;32438:198::-;-1:-1:-1;;;;;32528:20:0;;32504:7;32528:20;;;:11;:20;;;;;;;;32524:49;;;-1:-1:-1;;;;;;32557:16:0;;;;;:7;:16;;;;;;;32438:198::o;32524:49::-;-1:-1:-1;;;;;32611:16:0;;;;;;:7;:16;;;;;;32591:37;;:19;:37::i;9848:103::-;9086:13;:11;:13::i;:::-;9913:30:::1;9940:1;9913:18;:30::i;:::-;9848:103::o:0;53120:441::-;9086:13;:11;:13::i;:::-;-1:-1:-1;;;;;53214:21:0;::::1;53206:71;;;::::0;-1:-1:-1;;;53206:71:0;;10043:2:1;53206:71:0::1;::::0;::::1;10025:21:1::0;10082:2;10062:18;;;10055:30;10121:34;10101:18;;;10094:62;-1:-1:-1;;;10172:18:1;;;10165:35;10217:19;;53206:71:0::1;9841:401:1::0;53206:71:0::1;-1:-1:-1::0;;;;;53288:22:0;::::1;;::::0;;;:13:::1;:22;::::0;;;;:33;;-1:-1:-1;;53288:33:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;53332:124:::1;;53361:26;53379:7;53361:17;:26::i;:::-;53332:124;;;53420:24;53436:7;53420:15;:24::i;:::-;53466:32;53481:7;53489:8;53466:14;:32::i;:::-;53509:44;53535:7;53544:8;53509:25;:44::i;:::-;53120:441:::0;;:::o;34941:154::-;9086:13;:11;:13::i;:::-;-1:-1:-1;;;;;35036:40:0;;;::::1;;::::0;;;:31:::1;:40;::::0;;;;:51;;-1:-1:-1;;35036:51:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34941:154::o;39343:164::-;9086:13;:11;:13::i;:::-;39454:45:::1;::::0;-1:-1:-1;;;;;39454:22:0;::::1;::::0;39477:21:::1;39454:45:::0;::::1;;;::::0;::::1;::::0;;;39477:21;39454:22;:45;::::1;;;;;;;;;;;;;::::0;::::1;;;;32149:87:::0;32188:13;32221:7;32214:14;;;;;:::i;34006:400::-;34126:4;34148:228;8339:10;34198:7;34220:145;34277:15;34220:145;;;;;;;;;;;;;;;;;8339:10;34220:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;34220:34:0;;;;;;;;;;;;:38;:145::i;37446:549::-;9086:13;:11;:13::i;:::-;37635:9:::1;:22:::0;;;37668:15:::1;:34:::0;;;37713:15:::1;:34:::0;;;37758:10:::1;:24:::0;;;37793:13:::1;:30:::0;;;37809:14;37771:11;37731:16;37848:27:::1;37686:16:::0;37647:10;37848:27:::1;:::i;:::-;:45;;;;:::i;:::-;:58;;;;:::i;:::-;:74;;;;:::i;:::-;37834:11;:88:::0;;;37956:2:::1;-1:-1:-1::0;37941:17:0::1;37933:54;;;::::0;-1:-1:-1;;;37933:54:0;;10449:2:1;37933:54:0::1;::::0;::::1;10431:21:1::0;10488:2;10468:18;;;10461:30;10527:26;10507:18;;;10500:54;10571:18;;37933:54:0::1;10247:348:1::0;32644:199:0;32749:4;32771:42;8339:10;32795:9;32806:6;32771:9;:42::i;53569:237::-;9086:13;:11;:13::i;:::-;-1:-1:-1;;;;;53650:24:0;::::1;53642:77;;;::::0;-1:-1:-1;;;53642:77:0;;10802:2:1;53642:77:0::1;::::0;::::1;10784:21:1::0;10841:2;10821:18;;;10814:30;10880:34;10860:18;;;10853:62;-1:-1:-1;;;10931:18:1;;;10924:38;10979:19;;53642:77:0::1;10600:404:1::0;53642:77:0::1;53730:12;:25:::0;;-1:-1:-1;;;;;;53730:25:0::1;-1:-1:-1::0;;;;;53730:25:0;::::1;::::0;;::::1;::::0;;;53771:27:::1;::::0;1613:51:1;;;53771:27:0::1;::::0;1601:2:1;1586:18;53771:27:0::1;1467:203:1::0;39515:171:0;9086:13;:11;:13::i;:::-;39592:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;39592:32:0::1;-1:-1:-1::0;;;;39592:32:0;;::::1;;::::0;;39640:38:::1;::::0;::::1;::::0;::::1;::::0;39616:8;1188:14:1;1181:22;1163:41;;1151:2;1136:18;;1023:187;31939:111:0;9086:13;:11;:13::i;:::-;32017:15:::1;:25:::0;31939:111::o;36965:180::-;9086:13;:11;:13::i;:::-;-1:-1:-1;;;;;37049:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:38;;-1:-1:-1;;37049:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;37103:34;;11177:51:1;;;11244:18;;;11237:50;37103:34:0::1;::::0;11150:18:1;37103:34:0::1;;;;;;;36965:180:::0;;:::o;37153:279::-;9086:13;:11;:13::i;:::-;37265:6:::1;37250:11;:21;;37228:107;;;::::0;-1:-1:-1;;;37228:107:0;;11500:2:1;37228:107:0::1;::::0;::::1;11482:21:1::0;11539:2;11519:18;;;11512:30;11578:34;11558:18;;;11551:62;-1:-1:-1;;;11629:18:1;;;11622:34;11673:19;;37228:107:0::1;11298:400:1::0;37228:107:0::1;37361:19;:11:::0;37375:5:::1;37361:19;:::i;:::-;37346:12;:34:::0;;;37396:28:::1;::::0;2056:25:1;;;37396:28:0::1;::::0;2044:2:1;2029:18;37396:28:0::1;1910:177:1::0;10106:238:0;9086:13;:11;:13::i;:::-;-1:-1:-1;;;;;10209:22:0;::::1;10187:110;;;::::0;-1:-1:-1;;;10187:110:0;;11905:2:1;10187:110:0::1;::::0;::::1;11887:21:1::0;11944:2;11924:18;;;11917:30;11983:34;11963:18;;;11956:62;-1:-1:-1;;;12034:18:1;;;12027:36;12080:19;;10187:110:0::1;11703:402:1::0;10187:110:0::1;10308:28;10327:8;10308:18;:28::i;:::-;10106:238:::0;:::o;27789:32::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27789:32:0;;-1:-1:-1;27789:32:0;:::o;47196:548::-;-1:-1:-1;;;;;47284:18:0;;47261:6;47284:18;;;:9;:18;;;;;:28;;;;;47280:457;;;-1:-1:-1;;;;;47424:25:0;;47329:20;47424:25;;;:16;:25;;;;;;;;;47391:9;:18;;;;;:30;47329:20;;47391:58;;;:::i;:::-;47368:81;;47483:15;47468:12;:30;47464:221;;;47535:46;47565:15;47542:12;47535:46;:::i;:::-;47519:62;47196:548;-1:-1:-1;;;;47196:548:0:o;47464:221::-;-1:-1:-1;47668:1:0;;47196:548;-1:-1:-1;;;47196:548:0:o;47280:457::-;-1:-1:-1;47724:1:0;;47196:548;-1:-1:-1;47196:548:0:o;42108:371::-;-1:-1:-1;;;;;42235:19:0;;42227:68;;;;-1:-1:-1;;;42227:68:0;;12517:2:1;42227:68:0;;;12499:21:1;12556:2;12536:18;;;12529:30;12595:34;12575:18;;;12568:62;-1:-1:-1;;;12646:18:1;;;12639:34;12690:19;;42227:68:0;12315:400:1;42227:68:0;-1:-1:-1;;;;;42314:21:0;;42306:68;;;;-1:-1:-1;;;42306:68:0;;12922:2:1;42306:68:0;;;12904:21:1;12961:2;12941:18;;;12934:30;13000:34;12980:18;;;12973:62;-1:-1:-1;;;13051:18:1;;;13044:32;13093:19;;42306:68:0;12720:398:1;42306:68:0;-1:-1:-1;;;;;42387:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;42439:32;;2056:25:1;;;42439:32:0;;2029:18:1;42439:32:0;;;;;;;42108:371;;;:::o;42487:4397::-;-1:-1:-1;;;;;42609:18:0;;42601:68;;;;-1:-1:-1;;;42601:68:0;;13325:2:1;42601:68:0;;;13307:21:1;13364:2;13344:18;;;13337:30;13403:34;13383:18;;;13376:62;-1:-1:-1;;;13454:18:1;;;13447:35;13499:19;;42601:68:0;13123:401:1;42601:68:0;-1:-1:-1;;;;;42688:16:0;;42680:64;;;;-1:-1:-1;;;42680:64:0;;13731:2:1;42680:64:0;;;13713:21:1;13770:2;13750:18;;;13743:30;13809:34;13789:18;;;13782:62;-1:-1:-1;;;13860:18:1;;;13853:33;13903:19;;42680:64:0;13529:399:1;42680:64:0;42772:1;42763:6;:10;42755:64;;;;-1:-1:-1;;;42755:64:0;;14135:2:1;42755:64:0;;;14117:21:1;14174:2;14154:18;;;14147:30;14213:34;14193:18;;;14186:62;-1:-1:-1;;;14264:18:1;;;14257:39;14313:19;;42755:64:0;13933:405:1;42755:64:0;9246:7;9273:6;-1:-1:-1;;;;;42834:15:0;;;9273:6;;42834:15;;;;:32;;-1:-1:-1;9246:7:0;9273:6;-1:-1:-1;;;;;42853:13:0;;;9273:6;;42853:13;;42834:32;:74;;;;-1:-1:-1;;;;;;42871:37:0;;;;;;:31;:37;;;;;;;;42870:38;42834:74;:114;;;;-1:-1:-1;;;;;;42913:35:0;;;;;;:31;:35;;;;;;;;42912:36;42834:114;42830:257;;;42999:12;;42989:6;:22;;42963:124;;;;-1:-1:-1;;;42963:124:0;;14545:2:1;42963:124:0;;;14527:21:1;14584:2;14564:18;;;14557:30;14623:34;14603:18;;;14596:62;-1:-1:-1;;;14674:18:1;;;14667:38;14722:19;;42963:124:0;14343:404:1;42963:124:0;43113:28;43144:24;43162:4;43144:9;:24::i;:::-;43113:55;;43209:12;;43185:20;:36;43181:104;;-1:-1:-1;43261:12:0;;43181:104;43361:29;;43324:66;;;;;;;43419:53;;-1:-1:-1;43456:16:0;;-1:-1:-1;;;43456:16:0;;;;43455:17;43419:53;:91;;;;;43497:13;-1:-1:-1;;;;;43489:21:0;:4;-1:-1:-1;;;;;43489:21:0;;;43419:91;:129;;;;-1:-1:-1;43527:21:0;;-1:-1:-1;;;43527:21:0;;;;43419:129;43401:301;;;43598:29;;43575:52;;43654:36;43669:20;43654:14;:36::i;:::-;-1:-1:-1;;;;;43895:24:0;;43775:12;43895:24;;;:18;:24;;;;;;43790:4;;43895:24;;;:50;;-1:-1:-1;;;;;;43923:22:0;;;;;;:18;:22;;;;;;;;43895:50;43891:98;;;-1:-1:-1;43972:5:0;43891:98;44013:13;-1:-1:-1;;;;;44005:21:0;:4;-1:-1:-1;;;;;44005:21:0;;;:44;;;;;44036:13;-1:-1:-1;;;;;44030:19:0;:2;-1:-1:-1;;;;;44030:19:0;;;44005:44;44001:92;;;-1:-1:-1;44076:5:0;44001:92;44109:7;44105:1638;;;44144:13;-1:-1:-1;;;;;44136:21:0;:4;-1:-1:-1;;;;;44136:21:0;;44133:1128;;44187:9;;44177:7;:19;44231:15;;44215:13;:31;44281:15;;44265:13;:31;44326:10;;44315:8;:21;44369:13;;44355:11;:27;44133:1128;;;44427:13;-1:-1:-1;;;;;44421:19:0;:2;-1:-1:-1;;;;;44421:19:0;;44417:844;;-1:-1:-1;;;;;44465:15:0;;;;;;:9;:15;;;;;:25;;;;;44461:396;;;44515:11;44529:26;44550:4;44529:20;:26::i;:::-;44515:40;;44582:6;44578:260;;;-1:-1:-1;;;;;44683:15:0;;;;;;:9;:15;;;;;:26;;;44665:15;44693:4;44665:9;:15::i;:::-;:44;;;;:::i;:::-;44655:6;:54;;44617:197;;;;-1:-1:-1;;;44617:197:0;;14954:2:1;44617:197:0;;;14936:21:1;14993:2;14973:18;;;14966:30;15032:34;15012:18;;;15005:62;-1:-1:-1;;;15083:18:1;;;15076:43;15136:19;;44617:197:0;14752:409:1;44617:197:0;44492:365;44461:396;44885:10;;44875:7;:20;44930:16;;44914:13;:32;44981:16;;44965:13;:32;45027:11;;45016:8;:22;45071:14;;45057:11;:28;45110:16;;-1:-1:-1;;;45110:16:0;;;;45106:140;;45166:14;:12;:14::i;:::-;45150:13;:30;;-1:-1:-1;;;;;;45203:23:0;-1:-1:-1;;;;;45150:30:0;;;;45203:23;;;;-1:-1:-1;;;45203:23:0;;;45106:140;45275:17;45349:3;45340:6;45325:11;;45311:13;;45297;;:27;;;;:::i;:::-;:39;;;;:::i;:::-;45296:50;;;;:::i;:::-;:56;;;;:::i;:::-;45275:77;;45367:18;45420:1;45409:8;;:12;45406:146;;;45470:3;45461:6;45450:8;;:17;;;;:::i;:::-;:23;;;;:::i;:::-;45512:11;;45437:36;;-1:-1:-1;45488:48:0;;45506:4;;-1:-1:-1;;;;;45512:11:0;45437:36;45488:17;:48::i;:::-;45580:49;45598:4;45612;45619:9;45580:17;:49::i;:::-;45644:21;45668:22;45680:10;45668:9;:22;:::i;:::-;45644:46;-1:-1:-1;45705:23:0;45644:46;45705:23;;:::i;:::-;;;44118:1625;;;44105:1638;45815:41;45830:4;45836:2;45840:6;45848:7;45815:14;:41::i;:::-;-1:-1:-1;;;;;45873:19:0;;;;;;:13;:19;;;;;;;;:42;;;;;45902:13;-1:-1:-1;;;;;45896:19:0;:2;-1:-1:-1;;;;;45896:19:0;;;45873:42;45869:225;;;45953:15;;45936:13;45946:2;45936:9;:13::i;:::-;:32;45932:151;;-1:-1:-1;;;;;45989:13:0;;;;;;:9;:13;;;;;:28;;:35;;-1:-1:-1;;45989:35:0;46020:4;45989:35;;;;;;46043:15;:24;;;;;;;;;;;;;;-1:-1:-1;;;;;;46043:24:0;;;;;;45932:151;46110:7;:32;;;;;46129:13;-1:-1:-1;;;;;46121:21:0;:4;-1:-1:-1;;;;;46121:21:0;;46110:32;46106:255;;;46180:15;;46163:13;46173:2;46163:9;:13::i;:::-;:32;46159:191;;46216:21;46226:2;46230:6;46216:9;:21::i;:::-;-1:-1:-1;;;;;46256:13:0;;;;;;:9;:13;;;;;:28;;:35;;-1:-1:-1;;46256:35:0;46287:4;46256:35;;;;;;46310:15;:24;;;;;;;;;;;;;;-1:-1:-1;;;;;;46310:24:0;;;;;;46159:191;46377:7;:30;;;;;46394:13;-1:-1:-1;;;;;46388:19:0;:2;-1:-1:-1;;;;;46388:19:0;;46377:30;46373:504;;;46446:15;;46428;46438:4;46428:9;:15::i;:::-;:33;46424:442;;;-1:-1:-1;;;;;46478:13:0;;46509:5;46478:13;;;:9;:13;;;;;:28;;:36;;-1:-1:-1;;46478:36:0;;;46529:320;46553:15;:22;46549:26;;46529:320;;;46631:2;-1:-1:-1;;;;;46609:24:0;:15;46625:1;46609:18;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;46609:18:0;:24;46605:225;;46683:15;46699:22;;:26;;46724:1;;46699:26;:::i;:::-;46683:43;;;;;;;;:::i;:::-;;;;;;;;;;;46662:15;:18;;-1:-1:-1;;;;;46683:43:0;;;;46678:1;;46662:18;;;;;;:::i;:::-;;;;;;;;;:64;;;;;-1:-1:-1;;;;;46662:64:0;;;;;-1:-1:-1;;;;;46662:64:0;;;;;;46753:15;:21;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;46753:21:0;;;;;-1:-1:-1;;;;;;46753:21:0;;;;;;46801:5;;46605:225;46577:3;;;;:::i;:::-;;;;46529:320;;;;46424:442;42590:4294;;;42487:4397;;;:::o;4490:226::-;4610:7;4646:12;4638:6;;;;4630:29;;;;-1:-1:-1;;;4630:29:0;;;;;;;;:::i;:::-;-1:-1:-1;4670:9:0;4682:5;4686:1;4682;:5;:::i;:::-;4670:17;4490:226;-1:-1:-1;;;;;4490:226:0:o;9365:132::-;9246:7;9273:6;-1:-1:-1;;;;;9273:6:0;8339:10;9429:23;9421:68;;;;-1:-1:-1;;;9421:68:0;;15625:2:1;9421:68:0;;;15607:21:1;;;15644:18;;;15637:30;15703:34;15683:18;;;15676:62;15755:18;;9421:68:0;15423:356:1;41035:175:0;41076:7;41101:15;41118;41137:19;:17;:19::i;:::-;41100:56;;-1:-1:-1;41100:56:0;-1:-1:-1;41178:20:0;41100:56;;41178:11;:20::i;:::-;41171:27;;;;41035:175;:::o;5922:132::-;5980:7;6007:39;6011:1;6014;6007:39;;;;;;;;;;;;;;;;;:3;:39::i;3587:181::-;3645:7;;3677:5;3681:1;3677;:5;:::i;:::-;3665:17;;3706:1;3701;:6;;3693:46;;;;-1:-1:-1;;;3693:46:0;;15986:2:1;3693:46:0;;;15968:21:1;16025:2;16005:18;;;15998:30;16064:29;16044:18;;;16037:57;16111:18;;3693:46:0;15784:351:1;10504:191:0;10578:16;10597:6;;-1:-1:-1;;;;;10614:17:0;;;-1:-1:-1;;;;;;10614:17:0;;;;;;10647:40;;10597:6;;;;;;;10647:40;;10578:16;10647:40;10567:128;10504:191;:::o;49981:1729::-;30838:16;:23;;-1:-1:-1;;;;30838:23:0;-1:-1:-1;;;30838:23:0;;;50106:16:::1;::::0;50088:15:::1;::::0;30838:23;;50088:34:::1;::::0;::::1;:::i;:::-;50060:62;;50133:25;50179:16;;50161:15;;:34;;;;:::i;:::-;50133:62;;50206:23;50248:14;;50232:13;;:30;;;;:::i;:::-;50206:56:::0;-1:-1:-1;50273:16:0::1;50206:56:::0;50292:37:::1;50312:17:::0;50292;:37:::1;:::i;:::-;:55;;;;:::i;:::-;50273:74:::0;-1:-1:-1;50358:18:0::1;50379:59;50436:1;50379:52;50273:74:::0;50379:52;:15;50399:17;50379:19:::1;:38::i;:::-;:42:::0;::::1;:52::i;:59::-;50358:80:::0;-1:-1:-1;50449:20:0::1;50472:31;:15:::0;50358:80;50472:19:::1;:31::i;:::-;50540:16;::::0;;50554:1:::1;50540:16:::0;;;;;::::1;::::0;;50449:54;;-1:-1:-1;50516:21:0::1;::::0;50540:16;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;50540:16:0::1;50516:40;;50585:4;50567;50572:1;50567:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;50567:23:0::1;;;-1:-1:-1::0;;;;;50567:23:0::1;;;::::0;::::1;50611:15;-1:-1:-1::0;;;;;50611:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50601:4;50606:1;50601:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1::0;;;;;50601:32:0::1;;;-1:-1:-1::0;;;;;50601:32:0::1;;;::::0;::::1;50646:63;50663:4;50678:15;50696:12;50646:8;:63::i;:::-;-1:-1:-1::0;;;;;50720:15:0::1;:66;;50801:12:::0;50828:1:::1;50844:4:::0;50871::::1;50891:21;:15;50909:3;50891:21;:::i;:::-;50720:203;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;50957:21:0::1;::::0;-1:-1:-1;50936:18:0::1;::::0;-1:-1:-1;51012:40:0::1;::::0;-1:-1:-1;51025:26:0::1;51026:17:::0;51049:1:::1;51025:23;:26::i;:::-;51012:8:::0;;:12:::1;:40::i;:::-;50989:63:::0;-1:-1:-1;51063:23:0::1;51089:58;51145:1;51089:51;50989:63:::0;51089:51;:10;51104:17;51089:14:::1;:33::i;:58::-;51063:84:::0;-1:-1:-1;51158:20:0::1;51181:49;51217:12:::0;51181:31:::1;:10:::0;51196:15;51181:14:::1;:31::i;:49::-;51158:72:::0;-1:-1:-1;51241:23:0::1;51292:30;51158:72:::0;51292:15;:30:::1;:::i;:::-;51267:56;::::0;:21:::1;:56;:::i;:::-;51241:82;;51341:41;51354:10;51366:15;51341:12;:41::i;:::-;51403:15;::::0;51395:50:::1;::::0;-1:-1:-1;;;;;51403:15:0;;::::1;::::0;51395:50;::::1;;;::::0;51429:15;;51403::::1;51395:50:::0;51403:15;51395:50;51429:15;51403;51395:50;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;51459:16:0::1;::::0;-1:-1:-1;;;51459:16:0;::::1;;;51456:245;;;51487:16;:24:::0;;-1:-1:-1;;;;51487:24:0;::::1;::::0;;;-1:-1:-1;;;;;51532:13:0;51506:5:::1;51522:24:::0;;;:9:::1;:24;::::0;;;;:41:::1;;:57:::0;;51567:12;;51506:5;51522:57:::1;::::0;51567:12;;51522:57:::1;:::i;:::-;::::0;;;-1:-1:-1;;51598:13:0::1;::::0;51590:45:::1;::::0;-1:-1:-1;;;;;51598:13:0;;::::1;::::0;51590:45;::::1;;;::::0;51622:12;;51598:13:::1;51590:45:::0;51598:13;51590:45;51622:12;51598:13;51590:45;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;51662:13:0::1;::::0;51651:39:::1;::::0;;-1:-1:-1;;;;;51662:13:0;;::::1;8586:51:1::0;;8668:2;8653:18;;8646:34;;;51651:39:0::1;::::0;8559:18:1;51651:39:0::1;;;;;;;51456:245;-1:-1:-1::0;;30884:16:0;:24;;-1:-1:-1;;;;30884:24:0;;;-1:-1:-1;;;;;;;;;;;49981:1729:0:o;46892:296::-;-1:-1:-1;;;;;46997:25:0;;46961:4;46997:25;;;:16;:25;;;;;;;;;47056:9;:18;;;;;:30;:41;;46997:25;;47056:41;:::i;:::-;47037:15;:60;47033:146;;-1:-1:-1;47120:5:0;;46892:296;-1:-1:-1;;46892:296:0:o;47033:146::-;46967:221;46892:296;;;:::o;49456:315::-;49528:15;:22;49497:7;;49520:58;;;;-1:-1:-1;;;49520:58:0;;17715:2:1;49520:58:0;;;17697:21:1;17754:2;17734:18;;;17727:30;-1:-1:-1;;;17773:18:1;;;17766:49;17832:18;;49520:58:0;17513:343:1;49520:58:0;49629:15;:22;49593:13;;49609:17;:15;:17::i;:::-;:42;;;;:::i;:::-;49593:58;;49671:38;49686:15;49702:5;49686:22;;;;;;;;:::i;:::-;;;;;;;;;;;;49671:38;;-1:-1:-1;;;;;49686:22:0;;;1613:51:1;;1586:18;49671:38:0;;;;;;;49731:15;49747:5;49731:22;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;49731:22:0;;49456:315;-1:-1:-1;;49456:315:0:o;53977:446::-;54076:15;54093:23;54118:12;54132:23;54157:12;54173:19;54184:7;54173:10;:19::i;:::-;-1:-1:-1;;;;;54221:15:0;;;;;;:7;:15;;;;;;54075:117;;-1:-1:-1;54075:117:0;;-1:-1:-1;54075:117:0;;-1:-1:-1;54075:117:0;-1:-1:-1;54075:117:0;-1:-1:-1;54221:28:0;;54075:117;54221:19;:28::i;:::-;-1:-1:-1;;;;;54203:15:0;;;;;;;:7;:15;;;;;;:46;;;;54281:18;;;;;;;:39;;54304:15;54281:22;:39::i;:::-;-1:-1:-1;;;;;54260:18:0;;;;;;:7;:18;;;;;:60;54332:23;54344:4;54350;54332:11;:23::i;:::-;54388:9;-1:-1:-1;;;;;54371:44:0;54380:6;-1:-1:-1;;;;;54371:44:0;;54399:15;54371:44;;;;2056:25:1;;2044:2;2029:18;;1910:177;54371:44:0;;;;;;;;54064:359;;;;;53977:446;;;:::o;52312:800::-;52468:7;52463:31;;52478:14;53878:1;53868:7;:11;;;53890:13;:17;;;53918:13;:17;;;53946:11;:15;53815:154;52478:14;-1:-1:-1;;;;;52510:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;52534:22:0;;;;;;:11;:22;;;;;;;;52533:23;52510:46;52506:597;;;52573:48;52595:6;52603:9;52614:6;52573:21;:48::i;:::-;52506:597;;;-1:-1:-1;;;;;52644:19:0;;;;;;:11;:19;;;;;;;;52643:20;:46;;;;-1:-1:-1;;;;;;52667:22:0;;;;;;:11;:22;;;;;;;;52643:46;52639:464;;;52706:46;52726:6;52734:9;52745:6;52706:19;:46::i;52639:464::-;-1:-1:-1;;;;;52775:19:0;;;;;;:11;:19;;;;;;;;52774:20;:47;;;;-1:-1:-1;;;;;;52799:22:0;;;;;;:11;:22;;;;;;;;52798:23;52774:47;52770:333;;;52838:44;52856:6;52864:9;52875:6;52838:17;:44::i;52770:333::-;-1:-1:-1;;;;;52904:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;52927:22:0;;;;;;:11;:22;;;;;;;;52904:45;52900:203;;;52966:48;52988:6;52996:9;53007:6;52966:21;:48::i;52900:203::-;53047:44;53065:6;53073:9;53084:6;53047:17;:44::i;:::-;52312:800;;;;:::o;47752:1696::-;47831:12;;;47923:17;:15;:17::i;:::-;47916:24;-1:-1:-1;47955:9:0;47962:2;47916:24;47955:9;:::i;:::-;47968:1;47955:14;47951:1353;;-1:-1:-1;47999:1:0;48024:10;:6;48033:1;48024:10;:::i;:::-;-1:-1:-1;;;;;48049:23:0;;;;;;:16;:23;;;;;;;;48075:9;48049:35;;48099:9;:16;;;;;48128:4;48099:26;;;:33;;-1:-1:-1;;48099:33:0;;;;;;48178:15;48147:46;;48208:29;;:39;;48015:19;;-1:-1:-1;48015:19:0;;48208:29;;48049:23;48208:39;;48015:19;;48208:39;:::i;:::-;;;;-1:-1:-1;;;;;;;48262:16:0;;;;;;:9;:16;;;;;:27;;;:36;;;48313:25;;:27;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;48355:16:0;;;;;;:9;:16;;;;;:24;;:26;;;;;;:::i;:::-;;;;;;47951:1353;;;48403:9;48410:2;48403:4;:9;:::i;:::-;48416:1;48403:14;48399:905;;-1:-1:-1;48447:1:0;48472:10;:6;48481:1;48472:10;:::i;:::-;-1:-1:-1;;;;;48497:23:0;;;;;;:16;:23;;;;;;;;48523:9;48497:35;;48547:9;:16;;;;;48576:4;48547:26;;;:33;;-1:-1:-1;;48547:33:0;;;;;;48626:15;48595:46;;48656:29;;:39;;48463:19;;-1:-1:-1;48463:19:0;;48656:29;;48497:23;48656:39;;48463:19;;48656:39;:::i;:::-;;;;-1:-1:-1;;;;;;;48710:16:0;;;;;;:9;:16;;;;;:27;;;:36;;;48772:25;;:27;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;48814:16:0;;;;;;:9;:16;;;;;;;:24;:26;;;;;;:::i;48399:905::-;48862:10;48869:3;48862:4;:10;:::i;:::-;48876:1;48862:15;48858:446;;-1:-1:-1;48907:2:0;48933:10;:6;48942:1;48933:10;:::i;:::-;-1:-1:-1;;;;;48958:23:0;;;;;;:16;:23;;;;;;;;48984:10;48958:36;;49009:9;:16;;;;;49038:4;49009:26;;;:33;;-1:-1:-1;;49009:33:0;;;;;;49088:15;49057:46;;49118:29;;:39;;48924:19;;-1:-1:-1;48924:19:0;;49118:29;;48958:23;49118:39;;48924:19;;49118:39;:::i;:::-;;;;-1:-1:-1;;;;;;;49172:16:0;;;;;;:9;:16;;;;;:27;;;:36;;;49223:25;;:27;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;49265:16:0;;;;;;:9;:16;;;;;:25;;:27;;;;;;:::i;:::-;;;;;;48858:446;49317:10;;49314:127;;49353:21;49361:5;49367:6;49353:7;:21::i;:::-;49394:35;;;-1:-1:-1;;;;;18198:32:1;;18180:51;;18262:2;18247:18;;18240:34;;;18290:18;;;18283:34;;;49394:35:0;;18168:2:1;18153:18;49394:35:0;;;;;;;47820:1628;;;47752:1696;;:::o;41222:601::-;41323:7;;41363;;41272;;;;;41391:305;41415:9;:16;41411:20;;41391:305;;;41485:7;41461;:21;41469:9;41479:1;41469:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;41469:12:0;41461:21;;;;;;;;;;;;;:31;;:66;;;41520:7;41496;:21;41504:9;41514:1;41504:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;41504:12:0;41496:21;;;;;;;;;;;;;:31;41461:66;41457:97;;;41537:7;;41546;;41529:25;;;;;;;41222:601;;:::o;41457:97::-;41583:34;41595:7;:21;41603:9;41613:1;41603:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;41603:12:0;41595:21;;;;;;;;;;;;;41583:7;;:11;:34::i;:::-;41573:44;;41646:34;41658:7;:21;41666:9;41676:1;41666:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;41666:12:0;41658:21;;;;;;;;;;;;;41646:7;;:11;:34::i;:::-;41636:44;-1:-1:-1;41433:3:0;;;;:::i;:::-;;;;41391:305;;;-1:-1:-1;41736:7:0;;41724;;:20;;:11;:20::i;:::-;41714:7;:30;41710:61;;;41754:7;;41763;;41746:25;;;;;;41222:601;;:::o;41710:61::-;41794:7;;41803;;-1:-1:-1;41222:601:0;-1:-1:-1;41222:601:0:o;6550:312::-;6670:7;6705:12;6698:5;6690:28;;;;-1:-1:-1;;;6690:28:0;;;;;;;;:::i;:::-;-1:-1:-1;6729:9:0;6741:5;6745:1;6741;:5;:::i;4975:471::-;5033:7;5278:1;5283;5278:6;5274:47;;-1:-1:-1;5308:1:0;5301:8;;5274:47;5333:9;5345:5;5349:1;5345;:5;:::i;:::-;5333:17;-1:-1:-1;5378:1:0;5369:5;5373:1;5333:17;5369:5;:::i;:::-;:10;5361:56;;;;-1:-1:-1;;;5361:56:0;;18530:2:1;5361:56:0;;;18512:21:1;18569:2;18549:18;;;18542:30;18608:34;18588:18;;;18581:62;-1:-1:-1;;;18659:18:1;;;18652:31;18700:19;;5361:56:0;18328:397:1;4051:136:0;4109:7;4136:43;4140:1;4143;4136:43;;;;;;;;;;;;;;;;;:3;:43::i;51718:513::-;51866:62;51883:4;51898:15;51916:11;51866:8;:62::i;:::-;51971:15;-1:-1:-1;;;;;51971:31:0;;52010:9;52043:4;52063:11;52089:1;52132;52175:7;9246;9273:6;-1:-1:-1;;;;;9273:6:0;;9200:87;52175:7;51971:252;;;;;;-1:-1:-1;;;;;;51971:252:0;;;-1:-1:-1;;;;;19089:15:1;;;51971:252:0;;;19071:34:1;19121:18;;;19114:34;;;;19164:18;;;19157:34;;;;19207:18;;;19200:34;19271:15;;;19250:19;;;19243:44;52197:15:0;19303:19:1;;;19296:35;19005:19;;51971:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;49779:191::-;49886:12;;49922:40;;-1:-1:-1;;;49922:40:0;;49952:9;49922:40;;;1613:51:1;49823:17:0;;-1:-1:-1;;;;;49886:12:0;;;;49922:29;;1586:18:1;;49922:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49910:52;;49842:128;49779:191;:::o;39943:440::-;40002:7;40011;40020;40029;40038;40063:23;40088:12;40104:29;40116:7;40125;;40104:11;:29::i;:::-;40062:71;;;;40148:19;40171:10;:8;:10::i;:::-;40148:33;;40197:15;40214:23;40239:12;40255:39;40267:7;40276:4;40282:11;40255;:39::i;:::-;40196:98;;;;-1:-1:-1;40196:98:0;;-1:-1:-1;40349:15:0;;-1:-1:-1;40366:4:0;;-1:-1:-1;39943:440:0;;-1:-1:-1;;;;;;39943:440:0:o;39787:147::-;39865:7;;:17;;39877:4;39865:11;:17::i;:::-;39855:7;:27;39906:10;;:20;;39921:4;39906:14;:20::i;:::-;39893:10;:33;-1:-1:-1;;39787:147:0:o;54966:507::-;55069:15;55086:23;55111:12;55125:23;55150:12;55166:19;55177:7;55166:10;:19::i;:::-;-1:-1:-1;;;;;55214:15:0;;;;;;:7;:15;;;;;;55068:117;;-1:-1:-1;55068:117:0;;-1:-1:-1;55068:117:0;;-1:-1:-1;55068:117:0;-1:-1:-1;55068:117:0;-1:-1:-1;55214:28:0;;55234:7;55214:19;:28::i;:::-;-1:-1:-1;;;;;55196:15:0;;;;;;:7;:15;;;;;;;;:46;;;;55271:7;:15;;;;:28;;55291:7;55271:19;:28::i;54431:527::-;54532:15;54549:23;54574:12;54588:23;54613:12;54629:19;54640:7;54629:10;:19::i;:::-;-1:-1:-1;;;;;54677:15:0;;;;;;:7;:15;;;;;;54531:117;;-1:-1:-1;54531:117:0;;-1:-1:-1;54531:117:0;;-1:-1:-1;54531:117:0;-1:-1:-1;54531:117:0;-1:-1:-1;54677:28:0;;54531:117;54677:19;:28::i;:::-;-1:-1:-1;;;;;54659:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;54737:18;;;;;:7;:18;;;;;:39;;54760:15;54737:22;:39::i;:::-;-1:-1:-1;;;;;54716:18:0;;;;;;:7;:18;;;;;;;;:60;;;;54808:7;:18;;;;:39;;54831:15;54808:22;:39::i;36337:620::-;36444:15;36461:23;36486:12;36500:23;36525:12;36541:19;36552:7;36541:10;:19::i;:::-;-1:-1:-1;;;;;36593:15:0;;;;;;:7;:15;;;;;;36443:117;;-1:-1:-1;36443:117:0;;-1:-1:-1;36443:117:0;;-1:-1:-1;36443:117:0;-1:-1:-1;36443:117:0;-1:-1:-1;36593:28:0;;36613:7;36593:19;:28::i;:::-;-1:-1:-1;;;;;36575:15:0;;;;;;:7;:15;;;;;;;;:46;;;;36654:7;:15;;;;:28;;36674:7;36654:19;:28::i;34414:391::-;-1:-1:-1;;;;;34492:21:0;;34484:65;;;;-1:-1:-1;;;34484:65:0;;19855:2:1;34484:65:0;;;19837:21:1;19894:2;19874:18;;;19867:30;19933:33;19913:18;;;19906:61;19984:18;;34484:65:0;19653:355:1;34484:65:0;34560:19;34583:10;:8;:10::i;:::-;34560:33;-1:-1:-1;34604:15:0;34622:23;:6;34560:33;34622:10;:23::i;:::-;34666:7;;34604:41;;-1:-1:-1;34666:19:0;;34678:6;34666:11;:19::i;:::-;34656:7;:29;-1:-1:-1;;;;;34715:16:0;;;;;;:7;:16;;;;;;:29;;34736:7;34715:20;:29::i;:::-;-1:-1:-1;;;;;34696:16:0;;;;;;:7;:16;;;;;;:48;;;;34760:37;;34696:16;;;34760:37;;;;34790:6;2056:25:1;;2044:2;2029:18;;1910:177;34760:37:0;;;;;;;;34473:332;;34414:391;;:::o;40393:267::-;40469:7;;;40517:28;40541:3;40517:19;:7;40529:6;40517:11;:19::i;:28::-;40502:43;-1:-1:-1;40560:23:0;40586:17;:7;40502:43;40586:11;:17::i;:::-;40560:43;40643:4;;-1:-1:-1;40393:267:0;;-1:-1:-1;;;;40393:267:0:o;40672:354::-;40767:7;;;;40827:24;:7;40839:11;40827;:24::i;:::-;40809:42;-1:-1:-1;40866:12:0;40881:21;:4;40890:11;40881:8;:21::i;:::-;40866:36;-1:-1:-1;40917:23:0;40943:17;:7;40866:36;40943:11;:17::i;:::-;40983:7;;;;-1:-1:-1;41009:4:0;;-1:-1:-1;40672:354:0;;-1:-1:-1;;;;;40672:354:0:o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1215:247::-;1274:6;1327:2;1315:9;1306:7;1302:23;1298:32;1295:52;;;1343:1;1340;1333:12;1295:52;1382:9;1369:23;1401:31;1426:5;1401:31;:::i;2092:456::-;2169:6;2177;2185;2238:2;2226:9;2217:7;2213:23;2209:32;2206:52;;;2254:1;2251;2244:12;2206:52;2293:9;2280:23;2312:31;2337:5;2312:31;:::i;:::-;2362:5;-1:-1:-1;2419:2:1;2404:18;;2391:32;2432:33;2391:32;2432:33;:::i;:::-;2092:456;;2484:7;;-1:-1:-1;;;2538:2:1;2523:18;;;;2510:32;;2092:456::o;2553:180::-;2612:6;2665:2;2653:9;2644:7;2640:23;2636:32;2633:52;;;2681:1;2678;2671:12;2633:52;-1:-1:-1;2704:23:1;;2553:180;-1:-1:-1;2553:180:1:o;2927:401::-;3008:6;3016;3069:2;3057:9;3048:7;3044:23;3040:32;3037:52;;;3085:1;3082;3075:12;3037:52;3124:9;3111:23;3143:31;3168:5;3143:31;:::i;:::-;3193:5;-1:-1:-1;3250:2:1;3235:18;;3222:32;3263:33;3222:32;3263:33;:::i;:::-;3315:7;3305:17;;;2927:401;;;;;:::o;4181:454::-;4276:6;4284;4292;4300;4308;4361:3;4349:9;4340:7;4336:23;4332:33;4329:53;;;4378:1;4375;4368:12;4329:53;-1:-1:-1;;4401:23:1;;;4471:2;4456:18;;4443:32;;-1:-1:-1;4522:2:1;4507:18;;4494:32;;4573:2;4558:18;;4545:32;;-1:-1:-1;4624:3:1;4609:19;4596:33;;-1:-1:-1;4181:454:1;-1:-1:-1;4181:454:1:o;4640:118::-;4726:5;4719:13;4712:21;4705:5;4702:32;4692:60;;4748:1;4745;4738:12;4763:382;4828:6;4836;4889:2;4877:9;4868:7;4864:23;4860:32;4857:52;;;4905:1;4902;4895:12;4857:52;4944:9;4931:23;4963:31;4988:5;4963:31;:::i;:::-;5013:5;-1:-1:-1;5070:2:1;5055:18;;5042:32;5083:30;5042:32;5083:30;:::i;5410:241::-;5466:6;5519:2;5507:9;5498:7;5494:23;5490:32;5487:52;;;5535:1;5532;5525:12;5487:52;5574:9;5561:23;5593:28;5615:5;5593:28;:::i;6229:380::-;6308:1;6304:12;;;;6351;;;6372:61;;6426:4;6418:6;6414:17;6404:27;;6372:61;6479:2;6471:6;6468:14;6448:18;6445:38;6442:161;;6525:10;6520:3;6516:20;6513:1;6506:31;6560:4;6557:1;6550:15;6588:4;6585:1;6578:15;6614:127;6675:10;6670:3;6666:20;6663:1;6656:31;6706:4;6703:1;6696:15;6730:4;6727:1;6720:15;6746:168;6819:9;;;6850;;6867:15;;;6861:22;;6847:37;6837:71;;6888:18;;:::i;7686:127::-;7747:10;7742:3;7738:20;7735:1;7728:31;7778:4;7775:1;7768:15;7802:4;7799:1;7792:15;7818:128;7885:9;;;7906:11;;;7903:37;;;7920:18;;:::i;7951:127::-;8012:10;8007:3;8003:20;8000:1;7993:31;8043:4;8040:1;8033:15;8067:4;8064:1;8057:15;8083:135;8122:3;8143:17;;;8140:43;;8163:18;;:::i;:::-;-1:-1:-1;8210:1:1;8199:13;;8083:135::o;8223:184::-;8293:6;8346:2;8334:9;8325:7;8321:23;8317:32;8314:52;;;8362:1;8359;8352:12;8314:52;-1:-1:-1;8385:16:1;;8223:184;-1:-1:-1;8223:184:1:o;8691:245::-;8758:6;8811:2;8799:9;8790:7;8786:23;8782:32;8779:52;;;8827:1;8824;8817:12;8779:52;8859:9;8853:16;8878:28;8900:5;8878:28;:::i;9357:125::-;9422:9;;;9443:10;;;9440:36;;;9456:18;;:::i;12110:200::-;12176:9;;;12149:4;12204:9;;12232:10;;12244:12;;;12228:29;12267:12;;;12259:21;;12225:56;12222:82;;;12284:18;;:::i;:::-;12222:82;12110:200;;;;:::o;15166:127::-;15227:10;15222:3;15218:20;15215:1;15208:31;15258:4;15255:1;15248:15;15282:4;15279:1;15272:15;15298:120;15338:1;15364;15354:35;;15369:18;;:::i;:::-;-1:-1:-1;15403:9:1;;15298:120::o;16272:251::-;16342:6;16395:2;16383:9;16374:7;16370:23;16366:32;16363:52;;;16411:1;16408;16401:12;16363:52;16443:9;16437:16;16462:31;16487:5;16462:31;:::i;16528:980::-;16790:4;16838:3;16827:9;16823:19;16869:6;16858:9;16851:25;16895:2;16933:6;16928:2;16917:9;16913:18;16906:34;16976:3;16971:2;16960:9;16956:18;16949:31;17000:6;17035;17029:13;17066:6;17058;17051:22;17104:3;17093:9;17089:19;17082:26;;17143:2;17135:6;17131:15;17117:29;;17164:1;17174:195;17188:6;17185:1;17182:13;17174:195;;;17253:13;;-1:-1:-1;;;;;17249:39:1;17237:52;;17344:15;;;;17309:12;;;;17285:1;17203:9;17174:195;;;-1:-1:-1;;;;;;;17425:32:1;;;;17420:2;17405:18;;17398:60;-1:-1:-1;;;17489:3:1;17474:19;17467:35;17386:3;16528:980;-1:-1:-1;;;16528:980:1:o;17861:112::-;17893:1;17919;17909:35;;17924:18;;:::i;:::-;-1:-1:-1;17958:9:1;;17861:112::o;19342:306::-;19430:6;19438;19446;19499:2;19487:9;19478:7;19474:23;19470:32;19467:52;;;19515:1;19512;19505:12;19467:52;19544:9;19538:16;19528:26;;19594:2;19583:9;19579:18;19573:25;19563:35;;19638:2;19627:9;19623:18;19617:25;19607:35;;19342:306;;;;;:::o

Swarm Source

ipfs://69bce2bfc40cd2256bb6e8ccae69e63257e453f304933eebf48516f9bd29597f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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