ETH Price: $3,397.13 (+1.88%)

Token

TrumpsFight (TrumpsFight)
 

Overview

Max Total Supply

47,000,000 TrumpsFight

Holders

234

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
5,193,688.729653313731120637 TrumpsFight

Value
$0.00
0x5001e84bebc5e1b651bb85397c416b28a352309e
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
UltimateToken

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-08-29
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

library Address {
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }
    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");
    }
    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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }
    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

pragma solidity ^0.8.0;

interface IERC20 {
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor() {
        _transferOwnership(_msgSender());
    }
    modifier onlyOwner() {
        _checkOwner();
        _;
    }
    function owner() public view virtual returns (address) {
        return _owner;
    }
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

interface IERC20Permit {
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
    function nonces(address owner) external view returns (uint256);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

library SafeERC20 {
    using Address for address;
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
    }
    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
        }
    }
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
            _callOptionalReturn(token, approvalCall);
        }
    }
    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
    }

    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
        // and not revert is the subcall reverts.

        (bool success, bytes memory returndata) = address(token).call(data);
        return
            success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
    }
}

pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}
interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint 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 (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint 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 (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    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 (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

pragma solidity >=0.6.2;

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}
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;
}
pragma solidity 0.8.19;

interface IUniswapV2Caller {
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        address router,
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        uint256 deadline
    ) external;
}
interface IFee {
    function payFee(
        uint256 _tokenType,
        address creator,
        bool isAntibot,
        address referrer
    ) external payable;
}
contract UltimateToken is IERC20, Ownable {
    using SafeERC20 for IERC20;
    struct Args {
        string name;
        string symbol;
        uint8 decimals;
        uint256 totalSupply;
        uint256 maxWallet;
        uint256 maxTransactionAmount;
        address marketingWallet;
        address mainRouter;
        address baseTokenForMarket; 
        address treasuryWallet;       
        bool isMarketingFeeBaseToken;
        uint24 sellLiquidityFee;
        uint24 buyLiquidityFee;
        uint24 sellMarketingFee;
        uint24 buyMarketingFee;
        uint24 sellTreasuryFee;
        uint24 buyTreasuryFee;
        uint24 sellRewardFee;
        uint24 buyRewardFee;
        uint24 sellBurnFee;
        uint24 buyBurnFee;
        address feeContract;
        address uniswapV2Caller;
    }
    IUniswapV2Caller public uniswapV2Caller;
    address public baseTokenForMarket;
    uint8 private _decimals;
    mapping(address => uint256) private _rOwned;
    mapping(address => uint256) private _tOwned;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _isExcluded;
    address[] private _excluded;
    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal;
    uint256 private _rTotal;
    uint256 private _tRwardFeeTotal;
    string private _name;
    string private _symbol;

    uint256 private _rewardFee;
    uint256 private _previousRewardFee;

    uint256 private _liquidityFee;
    uint256 private _previousLiquidityFee;

    uint256 private _marketingFee;
    uint256 private _previousMarketingFee;

    uint256 private _treasuryFee;
    uint256 private _previousTreasuryFee;

    uint256 private _burnFee;
    uint256 private _previousBurnFee;

    bool private inSwapAndLiquify;
    uint24 public sellRewardFee;
    uint24 public buyRewardFee;
    uint24 public sellLiquidityFee;
    uint24 public buyLiquidityFee;

    uint24 public sellMarketingFee;
    uint24 public buyMarketingFee;

    uint24 public sellTreasuryFee;
    uint24 public buyTreasuryFee;

    uint24 public sellBurnFee;
    uint24 public buyBurnFee;

    address public marketingWallet;
    bool public isMarketingFeeBaseToken;
    address public treasuryWallet;



    uint256 public minAmountToTakeFee;
    uint256 public maxWallet;
    uint256 public maxTransactionAmount;


    IUniswapV2Router02 public mainRouter;
    address public mainPair;

    mapping(address => bool) public isExcludedFromFee;
    mapping(address => bool) public isExcludedFromMaxTransactionAmount;
    mapping(address => bool) public automatedMarketMakerPairs;

    uint256 private _liquidityFeeTokens;
    uint256 private _marketingFeeTokens;
    uint256 private _treasuryFeeTokens;

    event UpdateLiquidityFee(
        uint24 newSellLiquidityFee,
        uint24 newBuyLiquidityFee,
        uint24 oldSellLiquidityFee,
        uint24 oldBuyLiquidityFee
    );
    event UpdateMarketingFee(
        uint24 newSellMarketingFee,
        uint24 newBuyMarketingFee,
        uint24 oldSellMarketingFee,
        uint24 oldBuyMarketingFee
    );
    event UpdateTreasuryFee(
        uint24 newSellTreasuryFee,
        uint24 newBuyTreasuryFee,
        uint24 oldSellTreasuryFee,
        uint24 oldBuyTreasuryFee
    );
    event UpdateBurnFee(
        uint24 newSellBurnFee,
        uint24 newBuyBurnFee,
        uint24 oldSellBurnFee,
        uint24 oldBuyBurnFee
    );
    event UpdateRewardFee(
        uint24 newSellRewardFee,
        uint24 newBuyRewardFee,
        uint24 oldSellRewardFee,
        uint24 oldBuyRewardFee
    );  
    event UpdateMarketingWallet(
        address indexed newMarketingWallet,
        bool newIsMarketingFeeBaseToken,
        address indexed oldMarketingWallet,
        bool oldIsMarketingFeeBaseToken
    );
    event UpdateTreasuryWallet(
        address indexed newTreasuryWallet,
        address indexed oldTreasuryWallet
    );
    event MainRouterUpdated(address mainRouter, address mainPair, address baseTokenForMarket);

    event UpdateMinAmountToTakeFee(uint256 newMinAmountToTakeFee, uint256 oldMinAmountToTakeFee);
    event SetAutomatedMarketMakerPair(address indexed pair, bool value);
    event ExcludedFromFee(address indexed account, bool isEx);
    event SwapAndLiquify(uint256 tokensForLiquidity, uint256 baseTokenForLiquidity);
    event MarketingFeeTaken(
        uint256 marketingFeeTokens,
        uint256 marketingFeeBaseTokenSwapped
    );
    event TreasuryFeeTaken(
        uint256 amount
    );
    event ExcludedFromMaxTransactionAmount(address indexed account, bool isExcluded);
    event UpdateMaxWallet(uint256 newMaxWallet, uint256 oldMaxWallet);
    event UpdateMaxTransactionAmount(uint256 newMaxTransactionAmount, uint256 oldMaxTransactionAmount);
    constructor(
        Args memory args,
        address[] memory autoApproveAddressList,
        address referrer
    ) payable {
        IFee(args.feeContract).payFee{value: msg.value}(4, _msgSender(), false, referrer);    
        uniswapV2Caller = IUniswapV2Caller(args.uniswapV2Caller);
        baseTokenForMarket=args.baseTokenForMarket;
        _decimals = args.decimals;
        _name = args.name;
        _symbol = args.symbol;
        _tTotal = args.totalSupply;
        _rTotal = (MAX - (MAX % _tTotal));
        _rOwned[_msgSender()] = _rTotal;
        _tOwned[_msgSender()] = _tTotal;
        require(args.marketingWallet != address(0), "marketing wallet can not be 0");
        require(args.mainRouter != address(0), "Router address can not be 0");
        require(args.treasuryWallet != address(0), "Treasury wallet can not be 0");
        require(args.treasuryWallet != args.marketingWallet, "Treasury wallet can not be same with marketing wallet");
        require(args.sellLiquidityFee+ args.sellMarketingFee + args.sellRewardFee + args.sellTreasuryFee + args.sellBurnFee <= 300000, "sell total fee <= 30%");
        require(args.buyLiquidityFee+ args.buyMarketingFee + args.buyRewardFee + args.buyTreasuryFee + args.buyBurnFee <= 300000, "buy total fee <= 30%");
        require(args.sellLiquidityFee <= 150000, "each fee <= 15%");
        require(args.buyLiquidityFee <= 150000, "each fee <= 15%");
        require(args.sellMarketingFee <= 150000, "each fee <= 15%");
        require(args.buyMarketingFee <= 150000, "each fee <= 15%");
        require(args.sellRewardFee <= 150000, "each fee <= 15%");
        require(args.buyRewardFee <= 150000, "each fee <= 15%");
        require(args.sellTreasuryFee <= 150000, "each fee <= 15%");
        require(args.buyTreasuryFee <= 150000, "each fee <= 15%");
        require(args.sellBurnFee <= 150000, "each fee <= 15%");
        require(args.buyBurnFee <= 150000, "each fee <= 15%");
        marketingWallet = args.marketingWallet;
        treasuryWallet = args.treasuryWallet;
        isMarketingFeeBaseToken = args.isMarketingFeeBaseToken;
        emit UpdateMarketingWallet(
            marketingWallet,
            isMarketingFeeBaseToken,
            address(0),
            false
        );
        emit UpdateTreasuryWallet(
            treasuryWallet,
            address(0)
        );
        mainRouter = IUniswapV2Router02(args.mainRouter);
        if(baseTokenForMarket != mainRouter.WETH()){            
            IERC20(baseTokenForMarket).approve(address(mainRouter), MAX);            
        }
        _approve(address(this), address(uniswapV2Caller), MAX);
        _approve(address(this), address(mainRouter), MAX);
        for(uint256 i=0;i<autoApproveAddressList.length;i++){
            _approve(_msgSender(), autoApproveAddressList[i], MAX);
            isExcludedFromFee[autoApproveAddressList[i]] = true;
            isExcludedFromMaxTransactionAmount[autoApproveAddressList[i]]=true;
        }

        mainPair = IUniswapV2Factory(mainRouter.factory()).createPair(
            address(this),
            baseTokenForMarket
        );
        emit MainRouterUpdated(address(mainRouter), mainPair, baseTokenForMarket);
      
        sellLiquidityFee = args.sellLiquidityFee;
        buyLiquidityFee = args.buyLiquidityFee;
        emit UpdateLiquidityFee(
            sellLiquidityFee,
            buyLiquidityFee,
            0,
            0
        );
        sellMarketingFee = args.sellMarketingFee;
        buyMarketingFee = args.buyMarketingFee;
        emit UpdateMarketingFee(
            sellMarketingFee,
            buyMarketingFee,
            0,
            0
        );
        sellTreasuryFee = args.sellTreasuryFee;
        buyTreasuryFee = args.buyTreasuryFee;
        emit UpdateTreasuryFee(
            sellTreasuryFee,
            buyTreasuryFee,
            0,
            0
        );
        sellBurnFee = args.sellBurnFee;
        buyBurnFee = args.buyBurnFee;
        emit UpdateBurnFee(
            sellBurnFee,
            buyBurnFee,
            0,
            0
        );
        sellRewardFee = args.sellRewardFee;
        buyRewardFee = args.buyRewardFee;
        emit UpdateRewardFee(
            sellRewardFee,
            buyRewardFee,
            0,
            0
        );
        minAmountToTakeFee = args.totalSupply/10000;
        emit UpdateMinAmountToTakeFee(minAmountToTakeFee, 0);
        require(args.maxTransactionAmount>=args.totalSupply / 10000, "maxTransactionAmount >= total supply / 10000");
        require(args.maxWallet>=args.totalSupply / 10000, "maxWallet >= total supply / 10000");
        maxWallet=args.maxWallet;
        emit UpdateMaxWallet(maxWallet, 0);
        maxTransactionAmount=args.maxTransactionAmount;
        emit UpdateMaxTransactionAmount(maxTransactionAmount, 0);
        _isExcluded[address(0xdead)] = true;
        _excluded.push(address(0xdead));
        _isExcluded[address(this)] = true;
        _excluded.push(address(this));
        _isExcluded[treasuryWallet] = true;
        _excluded.push(treasuryWallet);

        isExcludedFromFee[address(this)] = true;
        isExcludedFromFee[marketingWallet] = true;
        isExcludedFromFee[treasuryWallet] = true;
        isExcludedFromFee[_msgSender()] = true;
        isExcludedFromFee[address(0xdead)] = true;
        isExcludedFromMaxTransactionAmount[address(0xdead)]=true;
        isExcludedFromMaxTransactionAmount[address(this)]=true;
        isExcludedFromMaxTransactionAmount[marketingWallet]=true;
        isExcludedFromMaxTransactionAmount[treasuryWallet]=true;
        isExcludedFromMaxTransactionAmount[_msgSender()]=true;
        _setAutomatedMarketMakerPair(mainPair, true);
        emit Transfer(address(0), _msgSender(), args.totalSupply);
    }

    function updateMainPair(
        address _mainRouter,
        address _baseTokenForMarket
    ) external onlyOwner
    {
        baseTokenForMarket = _baseTokenForMarket;
        if(address(mainRouter) != _mainRouter){
            _approve(address(this), _mainRouter, MAX);
            mainRouter = IUniswapV2Router02(_mainRouter);
        } 
        mainPair = IUniswapV2Factory(mainRouter.factory()).createPair(
            address(this),
            baseTokenForMarket
        );
        if(baseTokenForMarket != mainRouter.WETH()){            
            IERC20(baseTokenForMarket).safeApprove(address(mainRouter), MAX);
        }
        emit MainRouterUpdated(address(mainRouter), mainPair, baseTokenForMarket);
        _setAutomatedMarketMakerPair(mainPair, true);

    }
 
    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {
        (           
            // uint256 tTransferAmount,
            uint256 tRwardFee,
            uint256 tLiquidity,
            uint256 tMarketing,
            uint256 tTreasury,
            uint256 tBurn
        ) = _getTValues(amount);
        uint256 tTransferAmount = amount - tRwardFee - tLiquidity - tMarketing - tTreasury - tBurn;
        uint256 currentRate = _getRate();
        {
            //burn
            _tTotal = _tTotal - tBurn;
            _rTotal = _rTotal - tBurn*currentRate;
            if(tBurn > 0)
                emit Transfer(sender, address(0), tBurn);
        }
        {
            //marketing & liquidity & treasury burn fee collected in the token contract
            _liquidityFeeTokens = _liquidityFeeTokens+tLiquidity;
            _marketingFeeTokens = _marketingFeeTokens+tMarketing;
            _treasuryFeeTokens = _treasuryFeeTokens+tTreasury;
            uint256 tTotalFee = tLiquidity+tMarketing+tTreasury;
            _rOwned[address(this)] = _rOwned[address(this)]+tTotalFee * currentRate;
            if (_isExcluded[address(this)])
                _tOwned[address(this)] = _tOwned[address(this)]+tTotalFee;
            if(tTotalFee > 0)
                emit Transfer(sender, address(this), tTotalFee);
        }
        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _tOwned[sender] = _tOwned[sender]-amount;
            _rOwned[sender] = _rOwned[sender]-amount*currentRate;
            _rOwned[recipient] = _rOwned[recipient]+tTransferAmount*currentRate;
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _rOwned[sender] = _rOwned[sender]-amount*currentRate;
            _tOwned[recipient] = _tOwned[recipient]+tTransferAmount;
            _rOwned[recipient] = _rOwned[recipient]+tTransferAmount*currentRate;
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _tOwned[sender] = _tOwned[sender]-amount;
            _rOwned[sender] = _rOwned[sender]-amount*currentRate;
            _tOwned[recipient] = _tOwned[recipient]+tTransferAmount;
            _rOwned[recipient] = _rOwned[recipient]+tTransferAmount*currentRate;
        } else {
            _rOwned[sender] = _rOwned[sender]-amount*currentRate;
            _rOwned[recipient] = _rOwned[recipient]+tTransferAmount*currentRate;
        }
        _reflectFee(tRwardFee*currentRate, tRwardFee);
        if(tTransferAmount > 0)
            emit Transfer(sender, recipient, tTransferAmount);
    }


    function updateMaxWallet(uint256 _maxWallet) external onlyOwner {
        require(_maxWallet>=_tTotal / 10000, "maxWallet >= totalSupply / 10000");
        emit UpdateMaxWallet(_maxWallet, maxWallet);
        maxWallet = _maxWallet;
    }

    function updateMaxTransactionAmount(uint256 _maxTransactionAmount)
        external
        onlyOwner
    {
        require(_maxTransactionAmount>=_tTotal / 10000, "maxTransactionAmount >= totalSupply / 10000");  
        emit UpdateMaxTransactionAmount(_maxTransactionAmount, maxTransactionAmount);
        maxTransactionAmount = _maxTransactionAmount;
    }   
    function _reflectFee(uint256 rRwardFee, uint256 tRwardFee) private {
        _rTotal = _rTotal-rRwardFee;
        _tRwardFeeTotal = _tRwardFeeTotal+tRwardFee;
    }

    function _getTValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        uint256 tRwardFee = calculateRewardFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tMarketing = calculateMarketingFee(tAmount);
        uint256 tTreasury = calculateTreasuryFee(tAmount);
        uint256 tBurn = calculateBurnFee(tAmount);
        // uint256 tTransferAmount = tAmount - tRwardFee - tLiquidity - tMarketing - tTreasury - tBurn;
        return (tRwardFee, tLiquidity, tMarketing, tTreasury, tBurn);
    }

    function _getRate() private view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply/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-_rOwned[_excluded[i]];
            tSupply = tSupply-_tOwned[_excluded[i]];
        }
        if (rSupply < _rTotal/_tTotal) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function removeAllFee() private {
        _previousRewardFee = _rewardFee;
        _previousLiquidityFee = _liquidityFee;
        _previousMarketingFee = _marketingFee;
        _previousTreasuryFee = _treasuryFee;
        _previousBurnFee = _burnFee;

        _burnFee = 0;
        _treasuryFee = 0;
        _marketingFee = 0;
        _rewardFee = 0;
        _liquidityFee = 0;
    }

    function restoreAllFee() private {
        _burnFee = _previousBurnFee;
        _treasuryFee = _previousTreasuryFee;
        _rewardFee = _previousRewardFee;
        _liquidityFee = _previousLiquidityFee;
        _marketingFee = _previousMarketingFee;
    }

    function calculateRewardFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount*_rewardFee/(10**6);
    }

    function calculateLiquidityFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount*_liquidityFee/(10**6);
    }

    function calculateMarketingFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount*_marketingFee/(10**6);
    }

    function calculateTreasuryFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount*_treasuryFee/(10**6);
    }

    function calculateBurnFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount*_burnFee/(10**6);
    }

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

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

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

    function totalSupply() external 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)
        external
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender)
        external
        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
    ) external override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()]-amount
        );
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender]-(
                subtractedValue
            )
        );
        return true;
    }

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

    function totalFees() external view returns (uint256) {
        return _tRwardFeeTotal;
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee)
        external
        view
        returns (uint256)
    {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        uint256 currentRate = _getRate();
        if (!deductTransferFee) {            
            uint256 rAmount = tAmount*currentRate;
            return rAmount;
        } else {
            (           
                uint256 tRwardFee,
                uint256 tLiquidity,
                uint256 tMarketing,
                uint256 tTreasury,
                uint256 tBurn         
            ) = _getTValues(tAmount);
            uint256 tTransferAmount = tAmount - tRwardFee - tLiquidity - tMarketing - tTreasury - tBurn;
            uint256 rTransferAmount = tTransferAmount * currentRate;
            return rTransferAmount;
        }
    }

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

    function excludeFromReward(address account) public onlyOwner {
        require(!_isExcluded[account], "Account is already excluded");
        require(
            _excluded.length + 1 <= 50,
            "Cannot exclude more than 50 accounts.  Include a previously excluded address."
        );
        if (_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

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

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

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

    function updateLiquidityFee(
        uint24 _sellLiquidityFee,
        uint24 _buyLiquidityFee
    ) external onlyOwner {
        require(
            _sellLiquidityFee + sellMarketingFee + sellRewardFee + sellTreasuryFee + sellBurnFee <= 300000,
            "sell total fee <= 30%"
        );
        require(
            _buyLiquidityFee + buyMarketingFee + buyRewardFee + buyTreasuryFee + buyBurnFee <= 300000,
            "buy total fee <= 30%"
        );
        require(_sellLiquidityFee<= 150000, "sell fee <= 15%");
        require(_buyLiquidityFee<= 150000, "buy fee <= 15%");
        emit UpdateLiquidityFee(
            _sellLiquidityFee,
            _buyLiquidityFee,
            sellLiquidityFee,
            buyLiquidityFee
        );
        sellLiquidityFee = _sellLiquidityFee;
        buyLiquidityFee = _buyLiquidityFee;        
    }

    function updateMarketingFee(
        uint24 _sellMarketingFee,
        uint24 _buyMarketingFee
    ) external onlyOwner {
        require(
            _sellMarketingFee + sellLiquidityFee + sellRewardFee + sellTreasuryFee + sellBurnFee <= 300000,
            "sell total fee <= 30%"
        );
        require(
            _buyMarketingFee + buyLiquidityFee +buyRewardFee + buyTreasuryFee + buyBurnFee <= 300000,
            "buy total fee <= 30%"
        );
        require(_sellMarketingFee<= 150000, "sell fee <= 15%");
        require(_buyMarketingFee<= 150000, "buy fee <= 15%");
        emit UpdateMarketingFee(
            _sellMarketingFee,
            _buyMarketingFee,
            sellMarketingFee,
            buyMarketingFee
        );
        sellMarketingFee = _sellMarketingFee;
        buyMarketingFee = _buyMarketingFee;        
    }

    function updateRewardFee(
        uint24 _sellRewardFee,
        uint24 _buyRewardFee
    ) external onlyOwner {
        require(
            _sellRewardFee + sellLiquidityFee + sellMarketingFee + sellTreasuryFee + sellBurnFee <= 300000,
            "sell total fee <= 30%"
        );
        require(
            _buyRewardFee + buyLiquidityFee + buyMarketingFee + buyTreasuryFee + buyBurnFee <= 300000,
            "buy total fee <= 30%"
        );
        require(_sellRewardFee<= 150000, "sell fee <= 15%");
        require(_buyRewardFee<= 150000, "buy fee <= 15%");
        emit UpdateRewardFee(
            _sellRewardFee, 
            _buyRewardFee,
            sellRewardFee, 
            buyRewardFee
        );
        sellRewardFee = _sellRewardFee;
        buyRewardFee = _buyRewardFee;        
    }

    function updateTreasuryFee(
        uint24 _sellTreasuryFee,
        uint24 _buyTreasuryFee
    ) external onlyOwner {
        require(
            _sellTreasuryFee + sellLiquidityFee + sellMarketingFee + sellRewardFee + sellBurnFee <= 300000,
            "sell total fee <= 30%"
        );
        require(
            _buyTreasuryFee + buyLiquidityFee + buyMarketingFee + buyRewardFee + buyBurnFee <= 300000,
            "buy total fee <= 30%"
        );
        require(_sellTreasuryFee<= 150000, "sell fee <= 15%");
        require(_buyTreasuryFee<= 150000, "buy fee <= 15%");
        emit UpdateTreasuryFee(
            _sellTreasuryFee, 
            _buyTreasuryFee,
            sellTreasuryFee, 
            buyTreasuryFee
        );
        sellTreasuryFee = _sellTreasuryFee;
        buyTreasuryFee = _buyTreasuryFee;        
    }

    function updateBurnFee(
        uint24 _sellBurnFee,
        uint24 _buyBurnFee
    ) external onlyOwner {
        require(
            _sellBurnFee + sellLiquidityFee + sellMarketingFee + sellTreasuryFee + sellRewardFee <= 300000,
            "sell total fee <= 30%"
        );
        require(
            _buyBurnFee + buyLiquidityFee + buyMarketingFee + buyTreasuryFee + buyRewardFee <= 300000,
            "buy total fee <= 30%"
        );
        require(_sellBurnFee<= 150000, "sell fee <= 15%");
        require(_buyBurnFee<= 150000, "buy fee <= 15%");
        emit UpdateBurnFee(
            _sellBurnFee, 
            _buyBurnFee,
            sellBurnFee, 
            buyBurnFee
        );
        sellBurnFee = _sellBurnFee;
        buyBurnFee = _buyBurnFee;        
    }

    function updateMarketingWallet(
        address _marketingWallet,
        bool _isMarketingFeeBaseToken
    ) external onlyOwner {
        require(_marketingWallet != address(0), "marketing wallet can't be 0");
        require(_marketingWallet != treasuryWallet, "marketing wallet can't be same with Treasury wallet");
        emit UpdateMarketingWallet(_marketingWallet, _isMarketingFeeBaseToken,
            marketingWallet, isMarketingFeeBaseToken);
        marketingWallet = _marketingWallet;
        isMarketingFeeBaseToken = _isMarketingFeeBaseToken;
        isExcludedFromFee[_marketingWallet] = true;    
        isExcludedFromMaxTransactionAmount[_marketingWallet]=true;    
    }

    function updateTreasuryWallet(
        address _treasuryWallet
    ) external onlyOwner {
        require(_treasuryWallet != address(0), "Treasury wallet can't be 0");
        require(_treasuryWallet != address(this), "Treasury wallet can't be the same as token");
        require(marketingWallet != _treasuryWallet, "marketing wallet can't be same with Treasury wallet");
        emit UpdateTreasuryWallet(_treasuryWallet,
            treasuryWallet);
        treasuryWallet = _treasuryWallet;
        isExcludedFromFee[_treasuryWallet] = true;    
        isExcludedFromMaxTransactionAmount[_treasuryWallet]=true;           
    }

    function updateMinAmountToTakeFee(uint256 _minAmountToTakeFee)
        external
        onlyOwner
    {
        require(_minAmountToTakeFee > 0, "minAmountToTakeFee > 0");
        emit UpdateMinAmountToTakeFee(_minAmountToTakeFee, minAmountToTakeFee);
        minAmountToTakeFee = _minAmountToTakeFee;        
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            automatedMarketMakerPairs[pair] != value,
            "Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[pair] = value;
        if (value) excludeFromReward(pair);
        else includeInReward(pair);
        isExcludedFromMaxTransactionAmount[pair] = value;
        emit SetAutomatedMarketMakerPair(pair, value);
    }


    function excludeFromFee(address account, bool isEx) external onlyOwner {
        require(isExcludedFromFee[account] != isEx, "already");
        isExcludedFromFee[account] = isEx;
        emit ExcludedFromFee(account, isEx);
    }

    function excludeFromMaxTransactionAmount(address account, bool isEx)
        external
        onlyOwner
    {
        require(isExcludedFromMaxTransactionAmount[account]!=isEx, "already");
        isExcludedFromMaxTransactionAmount[account] = isEx;
        emit ExcludedFromMaxTransactionAmount(account, isEx);
    }

    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");        
        uint256 contractTokenBalance = balanceOf(address(this));
        
        uint256 totalTokensTaken = _liquidityFeeTokens + _marketingFeeTokens;
        bool overMinimumTokenBalance = totalTokensTaken >=
            minAmountToTakeFee && totalTokensTaken <= contractTokenBalance;

        // Take Fee
        if (
            !inSwapAndLiquify &&
            overMinimumTokenBalance &&
            balanceOf(mainPair) > 0 &&
            automatedMarketMakerPairs[to]
        ) {
            takeFee();
        }
        removeAllFee();

        // If any account belongs to isExcludedFromFee account then remove the fee
        if (
            !inSwapAndLiquify &&
            !isExcludedFromFee[from] &&
            !isExcludedFromFee[to]
        ) {
            // Buy
            if (automatedMarketMakerPairs[from]) {
                _rewardFee = buyRewardFee;
                _liquidityFee = buyLiquidityFee;
                _marketingFee = buyMarketingFee;
                _treasuryFee = buyTreasuryFee;
                _burnFee = buyBurnFee;
            }
            // Sell
            else if (automatedMarketMakerPairs[to]) {
                _rewardFee = sellRewardFee;
                _liquidityFee = sellLiquidityFee;
                _marketingFee = sellMarketingFee;
                _treasuryFee = sellTreasuryFee;
                _burnFee = sellBurnFee;
            }
        }
        _tokenTransfer(from, to, amount);
        restoreAllFee();
        if (!inSwapAndLiquify) {
            if (!isExcludedFromMaxTransactionAmount[from]) {
                require(
                    amount <= maxTransactionAmount,
                    "ERC20: exceeds transfer limit"
                );
            }
            if (!isExcludedFromMaxTransactionAmount[to]) {
                require(
                    balanceOf(to) <= maxWallet,
                    "ERC20: exceeds max wallet limit"
                );
            }
        }
    }

    function takeFee() private lockTheSwap {
        // Halve the amount of liquidity tokens
        uint256 tokensForLiquidity = _liquidityFeeTokens / 2;
        uint256 initialBaseTokenBalance = baseTokenForMarket==mainRouter.WETH() ? address(this).balance
            : IERC20(baseTokenForMarket).balanceOf(address(this));
        uint256 baseTokenForLiquidity;
        uint256 baseTokenForTreasury;
        if (isMarketingFeeBaseToken) {
            uint256 tokensForSwap=tokensForLiquidity+_marketingFeeTokens + _treasuryFeeTokens;
            if(tokensForSwap>0)
                swapTokensForBaseToken(tokensForSwap);
            uint256 baseTokenBalance = baseTokenForMarket==mainRouter.WETH() ? address(this).balance-initialBaseTokenBalance
                : IERC20(baseTokenForMarket).balanceOf(address(this))-initialBaseTokenBalance;
            uint256 baseTokenForMarketing = baseTokenBalance*_marketingFeeTokens/tokensForSwap;
            baseTokenForLiquidity = baseTokenBalance*tokensForLiquidity/tokensForSwap;
            baseTokenForTreasury = baseTokenBalance - baseTokenForMarketing - baseTokenForLiquidity;
            if(baseTokenForMarketing>0){
                if(baseTokenForMarket==mainRouter.WETH()){
                    (bool success, )=address(marketingWallet).call{value: baseTokenForMarketing}("");
                    if(success){                       
                        emit MarketingFeeTaken(0, baseTokenForMarketing);
                    }
                }else{
                    IERC20(baseTokenForMarket).safeTransfer(marketingWallet, baseTokenForMarketing);
                    emit MarketingFeeTaken(0, baseTokenForMarketing);
                }       
            }            
        } else {
            uint256 tokensForSwap=tokensForLiquidity + _treasuryFeeTokens;
            if(tokensForSwap>0)
                swapTokensForBaseToken(tokensForSwap);
            uint256 baseTokenBalance = baseTokenForMarket==mainRouter.WETH() ? address(this).balance-initialBaseTokenBalance
                : IERC20(baseTokenForMarket).balanceOf(address(this))-initialBaseTokenBalance;
            baseTokenForLiquidity = baseTokenBalance*tokensForLiquidity/tokensForSwap;
            baseTokenForTreasury = baseTokenBalance - baseTokenForLiquidity;
            
            if(_marketingFeeTokens>0){
                _transfer(address(this), marketingWallet, _marketingFeeTokens);
                emit MarketingFeeTaken(_marketingFeeTokens, 0);
            }            
        }

        if (tokensForLiquidity > 0 && baseTokenForLiquidity > 0) {
            addLiquidity(tokensForLiquidity, baseTokenForLiquidity);
            emit SwapAndLiquify(tokensForLiquidity, baseTokenForLiquidity);
        }
        if(baseTokenForTreasury>0){
            if(baseTokenForMarket==mainRouter.WETH()){
                (bool success, )=address(treasuryWallet).call{value: baseTokenForTreasury}("");
                if(success){                    
                    emit TreasuryFeeTaken(baseTokenForTreasury);
                }
            }else{
                IERC20(baseTokenForMarket).safeTransfer(treasuryWallet, baseTokenForTreasury);
                emit TreasuryFeeTaken(baseTokenForTreasury);
            }       
        }
        _marketingFeeTokens = 0;
        _treasuryFeeTokens = 0;
        _liquidityFeeTokens = 0;
        if(balanceOf(address(this))>0){
            if(owner()!=address(0))
                _transfer(address(this), owner(), balanceOf(address(this)));  
            else
                _transfer(address(this), treasuryWallet, balanceOf(address(this)));  
        }
    }
    
    function swapTokensForBaseToken(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = baseTokenForMarket;
        if (path[1] == mainRouter.WETH()){
            mainRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
                tokenAmount,
                0, // accept any amount of BaseToken
                path,
                address(this),
                block.timestamp
            );
        }else{
            uniswapV2Caller.swapExactTokensForTokensSupportingFeeOnTransferTokens(
                    address(mainRouter),
                    tokenAmount,
                    0, // accept any amount of BaseToken
                    path,
                    block.timestamp
                );
        }
    }

    function addLiquidity(uint256 tokenAmount, uint256 baseTokenAmount) private {        
        if (baseTokenForMarket == mainRouter.WETH()) 
            mainRouter.addLiquidityETH{value: baseTokenAmount}(
                address(this),
                tokenAmount,
                0, // slippage is unavoidable
                0, // slippage is unavoidable
                address(0xdead),
                block.timestamp
            );
        else{
            mainRouter.addLiquidity(
                address(this),
                baseTokenForMarket,
                tokenAmount,
                baseTokenAmount,
                0,
                0,
                address(0xdead),
                block.timestamp
            );
        }            
    }

    function treasuryBurn() payable external{
        address[] memory path = new address[](2);
        path[0] = baseTokenForMarket;
        path[1] = address(this);
        
        if (path[0] == mainRouter.WETH()){
            mainRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value:msg.value}(
                0, // accept any amount of BaseToken
                path,
                treasuryWallet,
                block.timestamp
            );
        }else{
            uint256 amount = IERC20(baseTokenForMarket).balanceOf(_msgSender());
            IERC20(baseTokenForMarket).safeTransferFrom(_msgSender(), address(this), amount);
            mainRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
                amount,
                0, // accept any amount of BaseToken
                path,
                treasuryWallet,
                block.timestamp
            );
        }      
        {
            //burn
            if(_isExcluded[treasuryWallet]){
                _tTotal = _tTotal - _tOwned[treasuryWallet];
                _rTotal = _rTotal - _rOwned[treasuryWallet];
                if(_tOwned[treasuryWallet] > 0)
                    emit Transfer(treasuryWallet, address(0), _tOwned[treasuryWallet]);
                _rOwned[treasuryWallet] = 0;
                _tOwned[treasuryWallet] = 0;      
            }else{
                uint256 _tBurn = tokenFromReflection(_rOwned[treasuryWallet]);
                _tTotal = _tTotal - _tBurn;
                _rTotal = _rTotal - _rOwned[treasuryWallet];
                if(_tBurn > 0)
                    emit Transfer(treasuryWallet, address(0), _tBurn);
                _rOwned[treasuryWallet] = 0;
                _tOwned[treasuryWallet] = 0;  
            }        
        }
    }
    function withdrawETH() external onlyOwner {
        (bool success, )=address(owner()).call{value: address(this).balance}("");
        require(success, "Failed in withdrawal");
    }
    function withdrawToken(address token) external onlyOwner{
        require(address(this) != token, "Not allowed");
        IERC20(token).safeTransfer(owner(), IERC20(token).balanceOf(address(this)));
    }
    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"maxWallet","type":"uint256"},{"internalType":"uint256","name":"maxTransactionAmount","type":"uint256"},{"internalType":"address","name":"marketingWallet","type":"address"},{"internalType":"address","name":"mainRouter","type":"address"},{"internalType":"address","name":"baseTokenForMarket","type":"address"},{"internalType":"address","name":"treasuryWallet","type":"address"},{"internalType":"bool","name":"isMarketingFeeBaseToken","type":"bool"},{"internalType":"uint24","name":"sellLiquidityFee","type":"uint24"},{"internalType":"uint24","name":"buyLiquidityFee","type":"uint24"},{"internalType":"uint24","name":"sellMarketingFee","type":"uint24"},{"internalType":"uint24","name":"buyMarketingFee","type":"uint24"},{"internalType":"uint24","name":"sellTreasuryFee","type":"uint24"},{"internalType":"uint24","name":"buyTreasuryFee","type":"uint24"},{"internalType":"uint24","name":"sellRewardFee","type":"uint24"},{"internalType":"uint24","name":"buyRewardFee","type":"uint24"},{"internalType":"uint24","name":"sellBurnFee","type":"uint24"},{"internalType":"uint24","name":"buyBurnFee","type":"uint24"},{"internalType":"address","name":"feeContract","type":"address"},{"internalType":"address","name":"uniswapV2Caller","type":"address"}],"internalType":"struct UltimateToken.Args","name":"args","type":"tuple"},{"internalType":"address[]","name":"autoApproveAddressList","type":"address[]"},{"internalType":"address","name":"referrer","type":"address"}],"stateMutability":"payable","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":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isEx","type":"bool"}],"name":"ExcludedFromFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromMaxTransactionAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"mainRouter","type":"address"},{"indexed":false,"internalType":"address","name":"mainPair","type":"address"},{"indexed":false,"internalType":"address","name":"baseTokenForMarket","type":"address"}],"name":"MainRouterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"marketingFeeTokens","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketingFeeBaseTokenSwapped","type":"uint256"}],"name":"MarketingFeeTaken","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":true,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensForLiquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"baseTokenForLiquidity","type":"uint256"}],"name":"SwapAndLiquify","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":"uint256","name":"amount","type":"uint256"}],"name":"TreasuryFeeTaken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"newSellBurnFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"newBuyBurnFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldSellBurnFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldBuyBurnFee","type":"uint24"}],"name":"UpdateBurnFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"newSellLiquidityFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"newBuyLiquidityFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldSellLiquidityFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldBuyLiquidityFee","type":"uint24"}],"name":"UpdateLiquidityFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"newSellMarketingFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"newBuyMarketingFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldSellMarketingFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldBuyMarketingFee","type":"uint24"}],"name":"UpdateMarketingFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newMarketingWallet","type":"address"},{"indexed":false,"internalType":"bool","name":"newIsMarketingFeeBaseToken","type":"bool"},{"indexed":true,"internalType":"address","name":"oldMarketingWallet","type":"address"},{"indexed":false,"internalType":"bool","name":"oldIsMarketingFeeBaseToken","type":"bool"}],"name":"UpdateMarketingWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxTransactionAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldMaxTransactionAmount","type":"uint256"}],"name":"UpdateMaxTransactionAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxWallet","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldMaxWallet","type":"uint256"}],"name":"UpdateMaxWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMinAmountToTakeFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldMinAmountToTakeFee","type":"uint256"}],"name":"UpdateMinAmountToTakeFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"newSellRewardFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"newBuyRewardFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldSellRewardFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldBuyRewardFee","type":"uint24"}],"name":"UpdateRewardFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"newSellTreasuryFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"newBuyTreasuryFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldSellTreasuryFee","type":"uint24"},{"indexed":false,"internalType":"uint24","name":"oldBuyTreasuryFee","type":"uint24"}],"name":"UpdateTreasuryFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newTreasuryWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldTreasuryWallet","type":"address"}],"name":"UpdateTreasuryWallet","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenForMarket","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBurnFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRewardFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTreasuryFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","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":"address","name":"account","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransactionAmount","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":"","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromMaxTransactionAmount","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":"isMarketingFeeBaseToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mainPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mainRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minAmountToTakeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellBurnFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRewardFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTreasuryFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"treasuryBurn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Caller","outputs":[{"internalType":"contract IUniswapV2Caller","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint24","name":"_sellBurnFee","type":"uint24"},{"internalType":"uint24","name":"_buyBurnFee","type":"uint24"}],"name":"updateBurnFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"_sellLiquidityFee","type":"uint24"},{"internalType":"uint24","name":"_buyLiquidityFee","type":"uint24"}],"name":"updateLiquidityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mainRouter","type":"address"},{"internalType":"address","name":"_baseTokenForMarket","type":"address"}],"name":"updateMainPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"_sellMarketingFee","type":"uint24"},{"internalType":"uint24","name":"_buyMarketingFee","type":"uint24"}],"name":"updateMarketingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"},{"internalType":"bool","name":"_isMarketingFeeBaseToken","type":"bool"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTransactionAmount","type":"uint256"}],"name":"updateMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minAmountToTakeFee","type":"uint256"}],"name":"updateMinAmountToTakeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"_sellRewardFee","type":"uint24"},{"internalType":"uint24","name":"_buyRewardFee","type":"uint24"}],"name":"updateRewardFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"_sellTreasuryFee","type":"uint24"},{"internalType":"uint24","name":"_buyTreasuryFee","type":"uint24"}],"name":"updateTreasuryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryWallet","type":"address"}],"name":"updateTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052604051620073ba380380620073ba833981016040819052620000269162001e27565b6200003133620012e4565b6102a08301516001600160a01b031663a5970b48346004336040516001600160e01b031960e086901b16815260048101929092526001600160a01b03908116602483015260006044830152851660648201526084016000604051808303818588803b158015620000a057600080fd5b505af1158015620000b5573d6000803e3d6000fd5b5050506102c0850151600180546001600160a01b039283166001600160a01b031990911617905561010086015160028054604089015160ff16600160a01b026001600160a81b0319909116929093169190911791909117905550508251600b9062000121908262002110565b506020830151600c9062000136908262002110565b50606083015160088190556200014f90600019620021f2565b6200015d906000196200221f565b60098190553360009081526003602090815260408083209390935560085460049091529190205560c08301516001600160a01b0316620001e45760405162461bcd60e51b815260206004820152601d60248201527f6d61726b6574696e672077616c6c65742063616e206e6f74206265203000000060448201526064015b60405180910390fd5b60e08301516001600160a01b0316620002405760405162461bcd60e51b815260206004820152601b60248201527f526f7574657220616464726573732063616e206e6f74206265203000000000006044820152606401620001db565b6101208301516001600160a01b03166200029d5760405162461bcd60e51b815260206004820152601c60248201527f54726561737572792077616c6c65742063616e206e6f742062652030000000006044820152606401620001db565b8260c001516001600160a01b03168361012001516001600160a01b0316036200032f5760405162461bcd60e51b815260206004820152603560248201527f54726561737572792077616c6c65742063616e206e6f742062652073616d652060448201527f77697468206d61726b6574696e672077616c6c657400000000000000000000006064820152608401620001db565b620493e0836102600151846101e00151856102200151866101a001518761016001516200035d91906200223b565b6200036991906200223b565b6200037591906200223b565b6200038191906200223b565b62ffffff161115620003d65760405162461bcd60e51b815260206004820152601560248201527f73656c6c20746f74616c20666565203c3d2033302500000000000000000000006044820152606401620001db565b620493e0836102800151846102000151856102400151866101c001518761018001516200040491906200223b565b6200041091906200223b565b6200041c91906200223b565b6200042891906200223b565b62ffffff1611156200047d5760405162461bcd60e51b815260206004820152601460248201527f62757920746f74616c20666565203c3d203330250000000000000000000000006044820152606401620001db565b620249f083610160015162ffffff161115620004cb5760405162461bcd60e51b815260206004820152600f60248201526000805160206200739a8339815191526044820152606401620001db565b620249f083610180015162ffffff161115620005195760405162461bcd60e51b815260206004820152600f60248201526000805160206200739a8339815191526044820152606401620001db565b620249f0836101a0015162ffffff161115620005675760405162461bcd60e51b815260206004820152600f60248201526000805160206200739a8339815191526044820152606401620001db565b620249f0836101c0015162ffffff161115620005b55760405162461bcd60e51b815260206004820152600f60248201526000805160206200739a8339815191526044820152606401620001db565b620249f083610220015162ffffff161115620006035760405162461bcd60e51b815260206004820152600f60248201526000805160206200739a8339815191526044820152606401620001db565b620249f083610240015162ffffff161115620006515760405162461bcd60e51b815260206004820152600f60248201526000805160206200739a8339815191526044820152606401620001db565b620249f0836101e0015162ffffff1611156200069f5760405162461bcd60e51b815260206004820152600f60248201526000805160206200739a8339815191526044820152606401620001db565b620249f083610200015162ffffff161115620006ed5760405162461bcd60e51b815260206004820152600f60248201526000805160206200739a8339815191526044820152606401620001db565b620249f083610260015162ffffff1611156200073b5760405162461bcd60e51b815260206004820152600f60248201526000805160206200739a8339815191526044820152606401620001db565b620249f083610280015162ffffff161115620007895760405162461bcd60e51b815260206004820152600f60248201526000805160206200739a8339815191526044820152606401620001db565b60c083015160188054610120860151601980546001600160a01b0319166001600160a01b039283161790556101408701519381166001600160a81b031990921691909117600160a01b931515840217918290556040805160ff94840494909416151584526000602085018190529392909116917fc8dfdd9b91ac62ee1bd8be3541ea02d8e584461c794c6e49e94ccf21c71ebcca910160405180910390a36019546040516000916001600160a01b0316907f79a52cbec002ef70283103eb4140713100276944fca2819713130141d04df183908390a360e0830151601d80546001600160a01b0319166001600160a01b039092169182179055604080516315ab88c960e31b8152905163ad5c4648916004808201926020929091908290030181865afa158015620008be573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008e4919062002261565b6002546001600160a01b039081169116146200097957600254601d5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af115801562000951573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200097791906200227f565b505b600154620009959030906001600160a01b031660001962001334565b601d54620009b19030906001600160a01b031660001962001334565b60005b825181101562000aab57620009ef33848381518110620009d857620009d86200229d565b60200260200101516000196200133460201b60201c565b6001601f600085848151811062000a0a5762000a0a6200229d565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555060016020600085848151811062000a645762000a646200229d565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558062000aa281620022b3565b915050620009b4565b50601d60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000b00573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000b26919062002261565b6002546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af115801562000b78573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000b9e919062002261565b601e80546001600160a01b0319166001600160a01b03928316908117909155601d546002546040805192851683526020830193909352909216908201527f113a6e83812f48b2f83795e33cb009afb4ba6e240c9c643c5dc75791e4ce7ab69060600160405180910390a16101608301516017805461018086015165ffffffffffff60381b1990911667010000000000000062ffffff948516810262ffffff60501b1916919091176a0100000000000000000000928516830217928390556040805191840485168252919092049092166020820152600091810182905260608101919091527fdec183740138e3a28dfd6f973ecd3bf00cd5d9b2544f6763c0a87f721444c5d19060800160405180910390a16101a0830151601780546101c086015165ffffffffffff60681b199091166d010000000000000000000000000062ffffff948516810262ffffff60801b191691909117600160801b928516830217928390556040805191840485168252919092049092166020820152600091810182905260608101919091527f70748cb9cb3bcb4dfd4fff8f2a6f23f636067b33e0244631f9abd38159c1de859060800160405180910390a16101e08301516017805461020086015165ffffffffffff60981b19909116600160981b62ffffff948516810262ffffff60b01b191691909117600160b01b928516830217928390556040805191840485168252919092049092166020820152600091810182905260608101919091527fc239c020ec275d4a3e59d37954f59c061e7302d35a1b6bad801059aafe9631ee9060800160405180910390a16102608301516017805461028086015165ffffffffffff60c81b19909116600160c81b62ffffff948516810262ffffff60e01b191691909117600160e01b928516830217928390556040805191840485168252919092049092166020820152600091810182905260608101919091527fdc717222e8a01249bcfb0a887e700321c9465eda757255fd7895bd39fab714d29060800160405180910390a16102208301516017805461024086015166ffffffffffff001990911661010062ffffff948516810262ffffff60201b191691909117640100000000928516830217928390556040805191840485168252919092049092166020820152600091810182905260608101919091527f2e7d9780ec398c47872eab5651ba43f0fa44ffed738321577e0db663fe8a05a59060800160405180910390a1612710836060015162000f3a9190620022cf565b601a81905560408051918252600060208301527f772a06bc936eb749842080c472181e970cd4f23bd1ab7d0b84a80aec26910434910160405180910390a1612710836060015162000f8c9190620022cf565b8360a00151101562000ff65760405162461bcd60e51b815260206004820152602c60248201527f6d61785472616e73616374696f6e416d6f756e74203e3d20746f74616c20737560448201526b070706c79202f2031303030360a41b6064820152608401620001db565b61271083606001516200100a9190620022cf565b83608001511015620010695760405162461bcd60e51b815260206004820152602160248201527f6d617857616c6c6574203e3d20746f74616c20737570706c79202f20313030306044820152600360fc1b6064820152608401620001db565b6080830151601b81905560408051918252600060208301527fff64d41f60feb77d52f64ae64a9fc3929d57a89d0cc55728762468bae5e0fe52910160405180910390a160a0830151601c81905560408051918252600060208301527f35eec0711af6fbe3039535323be51b57996b6945b0d55862607c7a02e52e4507910160405180910390a1600660209081527f1aecba4ebe7a4e0673e4891b2b092b2228e4322380b579fb494fad3da8586e228054600160ff1991821681179092556007805480840182556000805160206200737a833981519152908101805461dead6001600160a01b031991821617909155306000818152604080822080548816891790558554808901875585018054851684179055601980546001600160a01b03908116845282842080548a168b17905581548854808c019099559790960180549787169790951696909617909355818152601f8852828120805487168817905560188054851682528382208054881689179055855485168252838220805488168917905533808352848320805489168a1790557fef94442dfc0e910ca743614215a10fad3ff708bf5378f9c5c958c9192b3bf004805489168a1790559880527fcbaad361c71be11fa6bdbe0e740c6259be964b32182da2da47b54472477c6a178054881689179055918152828120805487168817905590548316815281812080548616871790559254821683528083208054851686179055948252939020805490911682179055601e546200129e9216906200145c565b606083015160405190815233906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050506200232c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038316620013985760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401620001db565b6001600160a01b038216620013fb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620001db565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03821660009081526021602052604090205481151560ff909116151503620014f45760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401620001db565b6001600160a01b0382166000908152602160205260409020805460ff1916821580159190911790915562001533576200152d826200159b565b6200153e565b6200153e8262001761565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab910160405180910390a25050565b620015a562001996565b6001600160a01b03811660009081526006602052604090205460ff1615620016105760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401620001db565b60075460329062001623906001620022e6565b1115620016af5760405162461bcd60e51b815260206004820152604d60248201527f43616e6e6f74206578636c756465206d6f7265207468616e203530206163636f60448201527f756e74732e2020496e636c75646520612070726576696f75736c79206578636c60648201526c3ab232b21030b2323932b9b99760991b608482015260a401620001db565b6001600160a01b038116600090815260036020526040902054156200170c576001600160a01b038116600090815260036020526040902054620016f290620019f4565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600660205260408120805460ff191660019081179091556007805491820181559091526000805160206200737a8339815191520180546001600160a01b0319169091179055565b6200176b62001996565b6001600160a01b03811660009081526006602052604090205460ff16620017d55760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401620001db565b60005b6007548110156200199257816001600160a01b0316600782815481106200180357620018036200229d565b6000918252602090912001546001600160a01b0316036200197d576001600160a01b0382166000908152600360205260409020546200184162001a7e565b6001600160a01b038416600090815260046020526040902054620018669190620022fc565b6001600160a01b0384166000908152600360205260409020819055600954620018919083906200221f565b6200189d9190620022e6565b6009556001600160a01b0383166000908152600660205260409020805460ff1916905560078054620018d2906001906200221f565b81548110620018e557620018e56200229d565b600091825260209091200154600780546001600160a01b0390921691849081106200191457620019146200229d565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600780548062001956576200195662002316565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b806200198981620022b3565b915050620017d8565b5050565b6000546001600160a01b03163314620019f25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620001db565b565b600060095482111562001a5d5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401620001db565b600062001a6962001a7e565b905062001a778184620022cf565b9392505050565b6000808062001a8c62001aa4565b909250905062001a9d8183620022cf565b9250505090565b6009546008546000918291825b60075481101562001c0c5782600360006007848154811062001ad75762001ad76200229d565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118062001b46575081600460006007848154811062001b1f5762001b1f6200229d565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1562001b5d57600954600854945094505050509091565b600360006007838154811062001b775762001b776200229d565b60009182526020808320909101546001600160a01b0316835282019290925260400190205462001ba890846200221f565b9250600460006007838154811062001bc45762001bc46200229d565b60009182526020808320909101546001600160a01b0316835282019290925260400190205462001bf590836200221f565b91508062001c0381620022b3565b91505062001ab1565b5060085460095462001c1f9190620022cf565b82101562001c37576009546008549350935050509091565b90939092509050565b634e487b7160e01b600052604160045260246000fd5b6040516102e081016001600160401b038111828210171562001c7c5762001c7c62001c40565b60405290565b604051601f8201601f191681016001600160401b038111828210171562001cad5762001cad62001c40565b604052919050565b600082601f83011262001cc757600080fd5b81516001600160401b0381111562001ce35762001ce362001c40565b602062001cf9601f8301601f1916820162001c82565b828152858284870101111562001d0e57600080fd5b60005b8381101562001d2e57858101830151828201840152820162001d11565b506000928101909101919091529392505050565b805160ff8116811462001d5457600080fd5b919050565b80516001600160a01b038116811462001d5457600080fd5b8051801515811462001d5457600080fd5b805162ffffff8116811462001d5457600080fd5b600082601f83011262001da857600080fd5b815160206001600160401b0382111562001dc65762001dc662001c40565b8160051b62001dd782820162001c82565b928352848101820192828101908785111562001df257600080fd5b83870192505b8483101562001e1c5762001e0c8362001d59565b8252918301919083019062001df8565b979650505050505050565b60008060006060848603121562001e3d57600080fd5b83516001600160401b038082111562001e5557600080fd5b908501906102e0828803121562001e6b57600080fd5b62001e7562001c56565b82518281111562001e8557600080fd5b62001e938982860162001cb5565b82525060208301518281111562001ea957600080fd5b62001eb78982860162001cb5565b60208301525062001ecb6040840162001d42565b6040820152606083015160608201526080830151608082015260a083015160a082015262001efc60c0840162001d59565b60c082015262001f0f60e0840162001d59565b60e082015261010062001f2481850162001d59565b9082015261012062001f3884820162001d59565b9082015261014062001f4c84820162001d71565b9082015261016062001f6084820162001d82565b9082015261018062001f7484820162001d82565b908201526101a062001f8884820162001d82565b908201526101c062001f9c84820162001d82565b908201526101e062001fb084820162001d82565b9082015261020062001fc484820162001d82565b9082015261022062001fd884820162001d82565b9082015261024062001fec84820162001d82565b908201526102606200200084820162001d82565b908201526102806200201484820162001d82565b908201526102a06200202884820162001d59565b908201526102c06200203c84820162001d59565b9082015260208701519095509150808211156200205857600080fd5b50620020678682870162001d96565b925050620020786040850162001d59565b90509250925092565b600181811c908216806200209657607f821691505b602082108103620020b757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200210b57600081815260208120601f850160051c81016020861015620020e65750805b601f850160051c820191505b818110156200210757828155600101620020f2565b5050505b505050565b81516001600160401b038111156200212c576200212c62001c40565b62002144816200213d845462002081565b84620020bd565b602080601f8311600181146200217c5760008415620021635750858301515b600019600386901b1c1916600185901b17855562002107565b600085815260208120601f198616915b82811015620021ad578886015182559484019460019091019084016200218c565b5085821015620021cc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601260045260246000fd5b600082620022045762002204620021dc565b500690565b634e487b7160e01b600052601160045260246000fd5b8181038181111562002235576200223562002209565b92915050565b62ffffff8181168382160190808211156200225a576200225a62002209565b5092915050565b6000602082840312156200227457600080fd5b62001a778262001d59565b6000602082840312156200229257600080fd5b62001a778262001d71565b634e487b7160e01b600052603260045260246000fd5b600060018201620022c857620022c862002209565b5060010190565b600082620022e157620022e1620021dc565b500490565b8082018082111562002235576200223562002209565b808202811582820484141762002235576200223562002209565b634e487b7160e01b600052603160045260246000fd5b61503e806200233c6000396000f3fe60806040526004361061039b5760003560e01c806382685df5116101dc578063cf188ad011610102578063e71dc3f5116100a0578063f2fde38b1161006f578063f2fde38b14610b33578063f637434214610b53578063f8b45b0514610b76578063fc59d23d14610b8c57600080fd5b8063e71dc3f514610a9e578063e9481eee14610ac1578063ec44adc814610af0578063f11a24d314610b1057600080fd5b8063dd62ed3e116100dc578063dd62ed3e14610a02578063de0aad5314610a48578063df8408fe14610a69578063e086e5ec14610a8957600080fd5b8063cf188ad0146109a2578063d5bf72b7146109c2578063db4091e9146109e257600080fd5b806395d89b411161017a578063aa49802311610149578063aa49802314610919578063adb873bd14610939578063b62496f51461095c578063c8c8ebe41461098c57600080fd5b806395d89b41146108a45780639a7a23d6146108b9578063a457c2d7146108d9578063a9059cbb146108f957600080fd5b806389476069116101b6578063894760691461083b5780638da5cb5b1461085b5780638f0bc16714610879578063921369131461088157600080fd5b806382685df5146107c257806385af30c5146107e257806388f820201461080257600080fd5b80634707c551116102c15780636c516a701161025f57806375f0a8741161022e57806375f0a8741461073f5780637bce5a041461075f5780637c75ad3a14610782578063809d458d146107a257600080fd5b80636c516a70146106ca57806370a08231146106ea578063715018a61461070a57806373b9e82c1461071f57600080fd5b80635342acb41161029b5780635342acb41461063357806357e62b98146106635780635c068a8c146106845780636b2fb124146106a757600080fd5b80634707c551146105d357806348a5317e146105f357806352390c021461061357600080fd5b80632ae2f121116103395780633950935111610308578063395093511461053b5780633fd1c86d1461055b5780634549b0391461057b5780634626402b1461059b57600080fd5b80632ae2f121146104af5780632d838119146104cf578063313ce567146104ef5780633685d4191461051b57600080fd5b806313114a9d1161037557806313114a9d1461043957806318160ddd146104585780631c499ab01461046d57806323b872dd1461048f57600080fd5b806306fdde03146103a7578063095ea7b3146103d25780630cfe2f3f1461040257600080fd5b366103a257005b600080fd5b3480156103b357600080fd5b506103bc610ba2565b6040516103c99190614a76565b60405180910390f35b3480156103de57600080fd5b506103f26103ed366004614abe565b610c34565b60405190151581526020016103c9565b34801561040e57600080fd5b5060175461042590600160201b900462ffffff1681565b60405162ffffff90911681526020016103c9565b34801561044557600080fd5b50600a545b6040519081526020016103c9565b34801561046457600080fd5b5060085461044a565b34801561047957600080fd5b5061048d610488366004614aea565b610c4b565b005b34801561049b57600080fd5b506103f26104aa366004614b03565b610cf9565b3480156104bb57600080fd5b5061048d6104ca366004614b52565b610d4b565b3480156104db57600080fd5b5061044a6104ea366004614aea565b610e0a565b3480156104fb57600080fd5b50600254600160a01b900460ff1660405160ff90911681526020016103c9565b34801561052757600080fd5b5061048d610536366004614b8b565b610e8e565b34801561054757600080fd5b506103f2610556366004614abe565b6110a4565b34801561056757600080fd5b5061048d610576366004614bc0565b6110db565b34801561058757600080fd5b5061044a610596366004614bf3565b6112c9565b3480156105a757600080fd5b506019546105bb906001600160a01b031681565b6040516001600160a01b0390911681526020016103c9565b3480156105df57600080fd5b5061048d6105ee366004614b52565b6113be565b3480156105ff57600080fd5b506002546105bb906001600160a01b031681565b34801561061f57600080fd5b5061048d61062e366004614b8b565b611500565b34801561063f57600080fd5b506103f261064e366004614b8b565b601f6020526000908152604090205460ff1681565b34801561066f57600080fd5b506018546103f290600160a01b900460ff1681565b34801561069057600080fd5b5060175461042590600160b01b900462ffffff1681565b3480156106b357600080fd5b5060175461042590600160981b900462ffffff1681565b3480156106d657600080fd5b5061048d6106e5366004614c18565b6116cc565b3480156106f657600080fd5b5061044a610705366004614b8b565b611937565b34801561071657600080fd5b5061048d611996565b34801561072b57600080fd5b5061048d61073a366004614aea565b6119aa565b34801561074b57600080fd5b506018546105bb906001600160a01b031681565b34801561076b57600080fd5b5060175461042590600160801b900462ffffff1681565b34801561078e57600080fd5b506001546105bb906001600160a01b031681565b3480156107ae57600080fd5b5061048d6107bd366004614b8b565b611a3d565b3480156107ce57600080fd5b5061048d6107dd366004614bc0565b611bbf565b3480156107ee57600080fd5b50601e546105bb906001600160a01b031681565b34801561080e57600080fd5b506103f261081d366004614b8b565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561084757600080fd5b5061048d610856366004614b8b565b611daa565b34801561086757600080fd5b506000546001600160a01b03166105bb565b61048d611e89565b34801561088d57600080fd5b5060175461042590600160681b900462ffffff1681565b3480156108b057600080fd5b506103bc612309565b3480156108c557600080fd5b5061048d6108d4366004614b52565b612318565b3480156108e557600080fd5b506103f26108f4366004614abe565b61232a565b34801561090557600080fd5b506103f2610914366004614abe565b612361565b34801561092557600080fd5b5061048d610934366004614aea565b61236e565b34801561094557600080fd5b5060175461042590600160c81b900462ffffff1681565b34801561096857600080fd5b506103f2610977366004614b8b565b60216020526000908152604090205460ff1681565b34801561099857600080fd5b5061044a601c5481565b3480156109ae57600080fd5b50601d546105bb906001600160a01b031681565b3480156109ce57600080fd5b5061048d6109dd366004614bc0565b61242b565b3480156109ee57600080fd5b5061048d6109fd366004614bc0565b61261d565b348015610a0e57600080fd5b5061044a610a1d366004614c18565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610a5457600080fd5b5060175461042590610100900462ffffff1681565b348015610a7557600080fd5b5061048d610a84366004614b52565b61280b565b348015610a9557600080fd5b5061048d6128c5565b348015610aaa57600080fd5b5060175461042590600160e01b900462ffffff1681565b348015610acd57600080fd5b506103f2610adc366004614b8b565b602080526000908152604090205460ff1681565b348015610afc57600080fd5b5061048d610b0b366004614bc0565b612967565b348015610b1c57600080fd5b5060175461042590600160501b900462ffffff1681565b348015610b3f57600080fd5b5061048d610b4e366004614b8b565b612b55565b348015610b5f57600080fd5b5060175461042590600160381b900462ffffff1681565b348015610b8257600080fd5b5061044a601b5481565b348015610b9857600080fd5b5061044a601a5481565b6060600b8054610bb190614c46565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdd90614c46565b8015610c2a5780601f10610bff57610100808354040283529160200191610c2a565b820191906000526020600020905b815481529060010190602001808311610c0d57829003601f168201915b5050505050905090565b6000610c41338484612bcb565b5060015b92915050565b610c53612cef565b612710600854610c639190614c96565b811015610cb75760405162461bcd60e51b815260206004820181905260248201527f6d617857616c6c6574203e3d20746f74616c537570706c79202f20313030303060448201526064015b60405180910390fd5b601b546040805183815260208101929092527fff64d41f60feb77d52f64ae64a9fc3929d57a89d0cc55728762468bae5e0fe52910160405180910390a1601b55565b6000610d06848484612d49565b6001600160a01b038416600090815260056020908152604080832033808552925290912054610d41918691610d3c908690614cb8565b612bcb565b5060019392505050565b610d53612cef565b6001600160a01b038216600090815260208052604090205481151560ff909116151503610dac5760405162461bcd60e51b8152602060048201526007602482015266616c726561647960c81b6044820152606401610cae565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527f82170bbd72c16b30c410014b7382121a699ed119a182e48a0b6cadcc89104ac991015b60405180910390a25050565b6000600954821115610e715760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610cae565b6000610e7b613130565b9050610e878184614c96565b9392505050565b610e96612cef565b6001600160a01b03811660009081526006602052604090205460ff16610efe5760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610cae565b60005b6007548110156110a057816001600160a01b031660078281548110610f2857610f28614ccb565b6000918252602090912001546001600160a01b03160361108e576001600160a01b038216600090815260036020526040902054610f63613130565b6001600160a01b038416600090815260046020526040902054610f869190614ce1565b6001600160a01b0384166000908152600360205260409020819055600954610faf908390614cb8565b610fb99190614cf8565b6009556001600160a01b0383166000908152600660205260409020805460ff1916905560078054610fec90600190614cb8565b81548110610ffc57610ffc614ccb565b600091825260209091200154600780546001600160a01b03909216918490811061102857611028614ccb565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600780548061106757611067614d0b565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b8061109881614d21565b915050610f01565b5050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610c41918590610d3c908690614cf8565b6110e3612cef565b601754620493e09062ffffff600160c81b82048116916101008104821691600160681b820481169161111e91600160381b9091041687614d3a565b6111289190614d3a565b6111329190614d3a565b61113c9190614d3a565b62ffffff16111561115f5760405162461bcd60e51b8152600401610cae90614d56565b601754620493e09062ffffff600160e01b8204811691600160201b8104821691600160801b820481169161119c91600160501b9091041686614d3a565b6111a69190614d3a565b6111b09190614d3a565b6111ba9190614d3a565b62ffffff1611156111dd5760405162461bcd60e51b8152600401610cae90614d85565b620249f08262ffffff1611156112055760405162461bcd60e51b8152600401610cae90614db3565b620249f08162ffffff16111561122d5760405162461bcd60e51b8152600401610cae90614ddc565b6017546040805162ffffff85811682528481166020830152600160981b8404811682840152600160b01b9093049092166060830152517fc239c020ec275d4a3e59d37954f59c061e7302d35a1b6bad801059aafe9631ee9181900360800190a16017805465ffffffffffff60981b1916600160981b62ffffff9485160262ffffff60b01b191617600160b01b9290931691909102919091179055565b600060085483111561131d5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610cae565b6000611327613130565b90508261134457600061133a8286614ce1565b9250610c45915050565b600080600080600061135589613153565b94509450945094509450600081838587898e6113719190614cb8565b61137b9190614cb8565b6113859190614cb8565b61138f9190614cb8565b6113999190614cb8565b905060006113a78883614ce1565b9850610c45975050505050505050565b5092915050565b6113c6612cef565b6001600160a01b03821661141c5760405162461bcd60e51b815260206004820152601b60248201527f6d61726b6574696e672077616c6c65742063616e2774206265203000000000006044820152606401610cae565b6019546001600160a01b039081169083160361144a5760405162461bcd60e51b8152600401610cae90614e04565b601854604080518315158152600160a01b830460ff16151560208201526001600160a01b03928316928516917fc8dfdd9b91ac62ee1bd8be3541ea02d8e584461c794c6e49e94ccf21c71ebcca910160405180910390a360188054911515600160a01b026001600160a81b03199092166001600160a01b039093169283179190911790556000908152601f60209081526040808320805460ff199081166001908117909255928052922080549091169091179055565b611508612cef565b6001600160a01b03811660009081526006602052604090205460ff16156115715760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610cae565b600754603290611582906001614cf8565b111561160c5760405162461bcd60e51b815260206004820152604d60248201527f43616e6e6f74206578636c756465206d6f7265207468616e203530206163636f60448201527f756e74732e2020496e636c75646520612070726576696f75736c79206578636c60648201526c3ab232b21030b2323932b9b99760991b608482015260a401610cae565b6001600160a01b03811660009081526003602052604090205415611666576001600160a01b03811660009081526003602052604090205461164c90610e0a565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600660205260408120805460ff191660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319169091179055565b6116d4612cef565b600280546001600160a01b0319166001600160a01b0383811691909117909155601d5483821691161461172a5761170e3083600019612bcb565b601d80546001600160a01b0319166001600160a01b0384161790555b601d60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561177d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a19190614e57565b6002546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af11580156117f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118169190614e57565b601e80546001600160a01b0319166001600160a01b03928316179055601d54604080516315ab88c960e31b81529051919092169163ad5c46489160048083019260209291908290030181865afa158015611874573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118989190614e57565b6002546001600160a01b039081169116146118cc57601d546002546118cc916001600160a01b0391821691166000196131ac565b601d54601e54600254604080516001600160a01b039485168152928416602084015292168183015290517f113a6e83812f48b2f83795e33cb009afb4ba6e240c9c643c5dc75791e4ce7ab69181900360600190a1601e546110a0906001600160a01b031660016132f9565b6001600160a01b03811660009081526006602052604081205460ff161561197457506001600160a01b031660009081526004602052604090205490565b6001600160a01b038216600090815260036020526040902054610c4590610e0a565b61199e612cef565b6119a86000613429565b565b6119b2612cef565b600081116119fb5760405162461bcd60e51b815260206004820152601660248201527506d696e416d6f756e74546f54616b65466565203e20360541b6044820152606401610cae565b601a546040805183815260208101929092527f772a06bc936eb749842080c472181e970cd4f23bd1ab7d0b84a80aec26910434910160405180910390a1601a55565b611a45612cef565b6001600160a01b038116611a9b5760405162461bcd60e51b815260206004820152601a60248201527f54726561737572792077616c6c65742063616e277420626520300000000000006044820152606401610cae565b306001600160a01b03821603611b065760405162461bcd60e51b815260206004820152602a60248201527f54726561737572792077616c6c65742063616e2774206265207468652073616d604482015269329030b9903a37b5b2b760b11b6064820152608401610cae565b6018546001600160a01b03808316911603611b335760405162461bcd60e51b8152600401610cae90614e04565b6019546040516001600160a01b03918216918316907f79a52cbec002ef70283103eb4140713100276944fca2819713130141d04df18390600090a3601980546001600160a01b039092166001600160a01b0319909216821790556000908152601f60209081526040808320805460ff199081166001908117909255928052922080549091169091179055565b611bc7612cef565b601754620493e09062ffffff600160c81b8204811691600160981b8104821691600160681b8204811691611c0491600160381b9091041687614d3a565b611c0e9190614d3a565b611c189190614d3a565b611c229190614d3a565b62ffffff161115611c455760405162461bcd60e51b8152600401610cae90614d56565b601754620493e09062ffffff600160e01b8204811691600160b01b8104821691600160801b8204811691611c8291600160501b9091041686614d3a565b611c8c9190614d3a565b611c969190614d3a565b611ca09190614d3a565b62ffffff161115611cc35760405162461bcd60e51b8152600401610cae90614d85565b620249f08262ffffff161115611ceb5760405162461bcd60e51b8152600401610cae90614db3565b620249f08162ffffff161115611d135760405162461bcd60e51b8152600401610cae90614ddc565b6017546040805162ffffff858116825284811660208301526101008404811682840152600160201b9093049092166060830152517f2e7d9780ec398c47872eab5651ba43f0fa44ffed738321577e0db663fe8a05a59181900360800190a16017805466ffffffffffff00191661010062ffffff9485160266ffffff00000000191617600160201b9290931691909102919091179055565b611db2612cef565b6001600160a01b0381163003611df85760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b6044820152606401610cae565b611e86611e0d6000546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015611e51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e759190614e74565b6001600160a01b0384169190613479565b50565b604080516002808252606082018352600092602083019080368337505060025482519293506001600160a01b031691839150600090611eca57611eca614ccb565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611efe57611efe614ccb565b6001600160a01b03928316602091820292909201810191909152601d54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611f57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7b9190614e57565b6001600160a01b031681600081518110611f9757611f97614ccb565b60200260200101516001600160a01b03160361202157601d5460195460405163b6f9de9560e01b81526001600160a01b039283169263b6f9de95923492611fea9260009288929116904290600401614ed1565b6000604051808303818588803b15801561200357600080fd5b505af1158015612017573d6000803e3d6000fd5b5050505050612129565b6002546000906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561207a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209e9190614e74565b90506120b8336002546001600160a01b03169030846134a9565b601d54601954604051635c11d79560e01b81526001600160a01b0392831692635c11d795926120f592869260009289929116904290600401614f06565b600060405180830381600087803b15801561210f57600080fd5b505af1158015612123573d6000803e3d6000fd5b50505050505b6019546001600160a01b031660009081526006602052604090205460ff1615612238576019546001600160a01b03166000908152600460205260409020546008546121749190614cb8565b6008556019546001600160a01b031660009081526003602052604090205460095461219f9190614cb8565b6009556019546001600160a01b031660009081526004602052604090205415612202576019546001600160a01b03166000818152600460209081526040808320549051908152919291600080516020614fe9833981519152910160405180910390a35b601980546001600160a01b0390811660009081526003602090815260408083208390559354909216815260049091529081205550565b6019546001600160a01b031660009081526003602052604081205461225c90610e0a565b90508060085461226c9190614cb8565b6008556019546001600160a01b03166000908152600360205260409020546009546122979190614cb8565b60095580156122d2576019546040518281526000916001600160a01b031690600080516020614fe98339815191529060200160405180910390a35b50601980546001600160a01b0390811660009081526003602090815260408083208390559354909216815260049091529081205550565b6060600c8054610bb190614c46565b612320612cef565b6110a082826132f9565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610c41918590610d3c908690614cb8565b6000610c41338484612d49565b612376612cef565b6127106008546123869190614c96565b8110156123e95760405162461bcd60e51b815260206004820152602b60248201527f6d61785472616e73616374696f6e416d6f756e74203e3d20746f74616c53757060448201526a0706c79202f2031303030360ac1b6064820152608401610cae565b601c546040805183815260208101929092527f35eec0711af6fbe3039535323be51b57996b6945b0d55862607c7a02e52e4507910160405180910390a1601c55565b612433612cef565b601754620493e09062ffffff600160c81b8204811691600160981b8104821691610100820481169161246e91600160681b9091041687614d3a565b6124789190614d3a565b6124829190614d3a565b61248c9190614d3a565b62ffffff1611156124af5760405162461bcd60e51b8152600401610cae90614d56565b601754620493e09062ffffff600160e01b8204811691600160b01b8104821691600160201b82048116916124ec91600160801b9091041686614d3a565b6124f69190614d3a565b6125009190614d3a565b61250a9190614d3a565b62ffffff16111561252d5760405162461bcd60e51b8152600401610cae90614d85565b620249f08262ffffff1611156125555760405162461bcd60e51b8152600401610cae90614db3565b620249f08162ffffff16111561257d5760405162461bcd60e51b8152600401610cae90614ddc565b6017546040805162ffffff85811682528481166020830152600160381b8404811682840152600160501b9093049092166060830152517fdec183740138e3a28dfd6f973ecd3bf00cd5d9b2544f6763c0a87f721444c5d19181900360800190a1601780546cffffffffffff000000000000001916600160381b62ffffff9485160262ffffff60501b191617600160501b9290931691909102919091179055565b612625612cef565b601754620493e09062ffffff6101008204811691600160981b8104821691600160681b820481169161266091600160381b9091041687614d3a565b61266a9190614d3a565b6126749190614d3a565b61267e9190614d3a565b62ffffff1611156126a15760405162461bcd60e51b8152600401610cae90614d56565b601754620493e09062ffffff600160201b8204811691600160b01b8104821691600160801b82048116916126de91600160501b9091041686614d3a565b6126e89190614d3a565b6126f29190614d3a565b6126fc9190614d3a565b62ffffff16111561271f5760405162461bcd60e51b8152600401610cae90614d85565b620249f08262ffffff1611156127475760405162461bcd60e51b8152600401610cae90614db3565b620249f08162ffffff16111561276f5760405162461bcd60e51b8152600401610cae90614ddc565b6017546040805162ffffff85811682528481166020830152600160c81b8404811682840152600160e01b9093049092166060830152517fdc717222e8a01249bcfb0a887e700321c9465eda757255fd7895bd39fab714d29181900360800190a16017805465ffffffffffff60c81b1916600160c81b62ffffff9485160262ffffff60e01b191617600160e01b9290931691909102919091179055565b612813612cef565b6001600160a01b0382166000908152601f602052604090205481151560ff90911615150361286d5760405162461bcd60e51b8152602060048201526007602482015266616c726561647960c81b6044820152606401610cae565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f2d43abd87b27cee7b0aa8c6f7e0b4a3247b683262a83cbc2318b0df398a49aa99101610dfe565b6128cd612cef565b600080546040516001600160a01b039091169047908381818185875af1925050503d806000811461291a576040519150601f19603f3d011682016040523d82523d6000602084013e61291f565b606091505b5050905080611e865760405162461bcd60e51b815260206004820152601460248201527311985a5b1959081a5b881dda5d1a191c985dd85b60621b6044820152606401610cae565b61296f612cef565b601754620493e09062ffffff600160c81b8204811691600160981b810482169161010082048116916129aa91600160381b9091041687614d3a565b6129b49190614d3a565b6129be9190614d3a565b6129c89190614d3a565b62ffffff1611156129eb5760405162461bcd60e51b8152600401610cae90614d56565b601754620493e09062ffffff600160e01b8204811691600160b01b8104821691600160201b8204811691612a2891600160501b9091041686614d3a565b612a329190614d3a565b612a3c9190614d3a565b612a469190614d3a565b62ffffff161115612a695760405162461bcd60e51b8152600401610cae90614d85565b620249f08262ffffff161115612a915760405162461bcd60e51b8152600401610cae90614db3565b620249f08162ffffff161115612ab95760405162461bcd60e51b8152600401610cae90614ddc565b6017546040805162ffffff85811682528481166020830152600160681b8404811682840152600160801b9093049092166060830152517f70748cb9cb3bcb4dfd4fff8f2a6f23f636067b33e0244631f9abd38159c1de859181900360800190a16017805465ffffffffffff60681b1916600160681b62ffffff9485160262ffffff60801b191617600160801b9290931691909102919091179055565b612b5d612cef565b6001600160a01b038116612bc25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cae565b611e8681613429565b6001600160a01b038316612c2d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cae565b6001600160a01b038216612c8e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cae565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000546001600160a01b031633146119a85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cae565b6001600160a01b038316612dad5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610cae565b6001600160a01b038216612e0f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610cae565b6000612e1a30611937565b90506000602354602254612e2e9190614cf8565b90506000601a548210158015612e445750828211155b60175490915060ff16158015612e575750805b8015612e785750601e54600090612e76906001600160a01b0316611937565b115b8015612e9c57506001600160a01b03851660009081526021602052604090205460ff165b15612ea957612ea96134e7565b612ee4600d8054600e55600f805460105560118054601255601380546014556015805460165560009081905590819055908190559182905555565b60175460ff16158015612f1057506001600160a01b0386166000908152601f602052604090205460ff16155b8015612f3557506001600160a01b0385166000908152601f602052604090205460ff16155b15613006576001600160a01b03861660009081526021602052604090205460ff1615612fa35760175462ffffff600160201b82048116600d55600160501b82048116600f55600160801b82048116601155600160b01b82048116601355600160e01b90910416601555613006565b6001600160a01b03851660009081526021602052604090205460ff16156130065760175462ffffff61010082048116600d55600160381b82048116600f55600160681b82048116601155600160981b82048116601355600160c81b909104166015555b613011868686613d40565b613034601654601555601454601355600e54600d55601054600f55601254601155565b60175460ff16613128576001600160a01b038616600090815260208052604090205460ff166130af57601c548411156130af5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a2065786365656473207472616e73666572206c696d69740000006044820152606401610cae565b6001600160a01b038516600090815260208052604090205460ff1661312857601b546130da86611937565b11156131285760405162461bcd60e51b815260206004820152601f60248201527f45524332303a2065786365656473206d61782077616c6c6574206c696d6974006044820152606401610cae565b505050505050565b600080600061313d614255565b909250905061314c8183614c96565b9250505090565b600080600080600080613165876143d8565b90506000613172886143f6565b9050600061317f8961440a565b9050600061318c8a61441e565b905060006131998b614432565b949b939a50919850965091945092505050565b8015806132265750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015613200573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132249190614e74565b155b6132915760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610cae565b6040516001600160a01b0383166024820152604481018290526132f490849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614446565b505050565b6001600160a01b03821660009081526021602052604090205481151560ff90911615150361338f5760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610cae565b6001600160a01b0382166000908152602160205260409020805460ff191682158015919091179091556133ca576133c582611500565b6133d3565b6133d382610e8e565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab9101610dfe565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0383166024820152604481018290526132f490849063a9059cbb60e01b906064016132bd565b6040516001600160a01b03808516602483015283166044820152606481018290526134e19085906323b872dd60e01b906084016132bd565b50505050565b6017805460ff1916600117905560225460009061350690600290614c96565b90506000601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561355d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135819190614e57565b6002546001600160a01b03908116911614613607576002546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156135de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136029190614e74565b613609565b475b9050600080601860149054906101000a900460ff1615613935576000602454602354866136369190614cf8565b6136409190614cf8565b90508015613651576136518161451b565b601d54604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa15801561369b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136bf9190614e57565b6002546001600160a01b0390811691161461374f576002546040516370a0823160e01b815230600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa15801561371c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137409190614e74565b61374a9190614cb8565b613759565b6137598547614cb8565b90506000826023548361376c9190614ce1565b6137769190614c96565b9050826137838884614ce1565b61378d9190614c96565b94508461379a8284614cb8565b6137a49190614cb8565b9350801561392d57601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138239190614e57565b6002546001600160a01b039182169116036138d5576018546040516000916001600160a01b03169083908381818185875af1925050503d8060008114613885576040519150601f19603f3d011682016040523d82523d6000602084013e61388a565b606091505b5050905080156138cf576040805160008152602081018490527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b5061392d565b6018546002546138f2916001600160a01b03918216911683613479565b6040805160008152602081018390527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b505050613ae9565b6000602454856139459190614cf8565b90508015613956576139568161451b565b601d54604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa1580156139a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139c49190614e57565b6002546001600160a01b03908116911614613a54576002546040516370a0823160e01b815230600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa158015613a21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a459190614e74565b613a4f9190614cb8565b613a5e565b613a5e8547614cb8565b905081613a6b8783614ce1565b613a759190614c96565b9350613a818482614cb8565b60235490935015613ae657601854602354613aa99130916001600160a01b0390911690612d49565b60235460408051918252600060208301527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b50505b600084118015613af95750600082115b15613b4257613b0884836146d4565b60408051858152602081018490527f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f8381486910160405180910390a15b8015613cbb57601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613b9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bbf9190614e57565b6002546001600160a01b03918216911603613c6a576019546040516000916001600160a01b03169083908381818185875af1925050503d8060008114613c21576040519150601f19603f3d011682016040523d82523d6000602084013e613c26565b606091505b505090508015613c64576040518281527fe3630e0003fb3e9f9d835bb839022e52ffd576f9f35c395dd17517106f78cb339060200160405180910390a15b50613cbb565b601954600254613c87916001600160a01b03918216911683613479565b6040518181527fe3630e0003fb3e9f9d835bb839022e52ffd576f9f35c395dd17517106f78cb339060200160405180910390a15b6000602381905560248190556022819055613cd530611937565b1115613d30576000546001600160a01b031615613d1557613d1030613d026000546001600160a01b031690565b613d0b30611937565b612d49565b613d30565b601954613d309030906001600160a01b0316613d0b82611937565b50506017805460ff191690555050565b6000806000806000613d5186613153565b94509450945094509450600081838587898b613d6d9190614cb8565b613d779190614cb8565b613d819190614cb8565b613d8b9190614cb8565b613d959190614cb8565b90506000613da1613130565b905082600854613db19190614cb8565b600855613dbe8184614ce1565b600954613dcb9190614cb8565b6009558215613e04576040518381526000906001600160a01b038c1690600080516020614fe98339815191529060200160405180910390a35b85602254613e129190614cf8565b602255602354613e23908690614cf8565b602355602454613e34908590614cf8565b602455600084613e448789614cf8565b613e4e9190614cf8565b9050613e5a8282614ce1565b30600090815260036020526040902054613e749190614cf8565b3060009081526003602090815260408083209390935560069052205460ff1615613ec45730600090815260046020526040902054613eb3908290614cf8565b306000908152600460205260409020555b8015613ef95760405181815230906001600160a01b038d1690600080516020614fe98339815191529060200160405180910390a35b506001600160a01b038a1660009081526006602052604090205460ff168015613f3b57506001600160a01b03891660009081526006602052604090205460ff16155b1561400e576001600160a01b038a16600090815260046020526040902054613f64908990614cb8565b6001600160a01b038b16600090815260046020526040902055613f878189614ce1565b6001600160a01b038b16600090815260036020526040902054613faa9190614cb8565b6001600160a01b038b16600090815260036020526040902055613fcd8183614ce1565b6001600160a01b038a16600090815260036020526040902054613ff09190614cf8565b6001600160a01b038a166000908152600360205260409020556141f4565b6001600160a01b038a1660009081526006602052604090205460ff1615801561404f57506001600160a01b03891660009081526006602052604090205460ff165b156140db5761405e8189614ce1565b6001600160a01b038b166000908152600360205260409020546140819190614cb8565b6001600160a01b03808c16600090815260036020908152604080832094909455918c168152600490915220546140b8908390614cf8565b6001600160a01b038a16600090815260046020526040902055613fcd8183614ce1565b6001600160a01b038a1660009081526006602052604090205460ff16801561411b57506001600160a01b03891660009081526006602052604090205460ff165b15614167576001600160a01b038a16600090815260046020526040902054614144908990614cb8565b6001600160a01b038b1660009081526004602052604090205561405e8189614ce1565b6141718189614ce1565b6001600160a01b038b166000908152600360205260409020546141949190614cb8565b6001600160a01b038b166000908152600360205260409020556141b78183614ce1565b6001600160a01b038a166000908152600360205260409020546141da9190614cf8565b6001600160a01b038a166000908152600360205260409020555b6142076142018289614ce1565b8861489c565b811561424957886001600160a01b03168a6001600160a01b0316600080516020614fe98339815191528460405161424091815260200190565b60405180910390a35b50505050505050505050565b6009546008546000918291825b6007548110156143a75782600360006007848154811061428457614284614ccb565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806142ef57508160046000600784815481106142c8576142c8614ccb565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561430557600954600854945094505050509091565b600360006007838154811061431c5761431c614ccb565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461434b9084614cb8565b9250600460006007838154811061436457614364614ccb565b60009182526020808320909101546001600160a01b031683528201929092526040019020546143939083614cb8565b91508061439f81614d21565b915050614262565b506008546009546143b89190614c96565b8210156143cf576009546008549350935050509091565b90939092509050565b6000620f4240600d54836143ec9190614ce1565b610c459190614c96565b6000620f4240600f54836143ec9190614ce1565b6000620f4240601154836143ec9190614ce1565b6000620f4240601354836143ec9190614ce1565b6000620f4240601554836143ec9190614ce1565b600061449b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166148c29092919063ffffffff16565b90508051600014806144bc5750808060200190518101906144bc9190614f42565b6132f45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610cae565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061455057614550614ccb565b6001600160a01b03928316602091820292909201015260025482519116908290600190811061458157614581614ccb565b6001600160a01b03928316602091820292909201810191909152601d54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156145da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145fe9190614e57565b6001600160a01b03168160018151811061461a5761461a614ccb565b60200260200101516001600160a01b03160361469757601d5460405163791ac94760e01b81526001600160a01b039091169063791ac94790614669908590600090869030904290600401614f06565b600060405180830381600087803b15801561468357600080fd5b505af1158015613128573d6000803e3d6000fd5b600154601d54604051637274ca1b60e11b81526001600160a01b039283169263e4e994369261466992911690869060009087904290600401614f5f565b601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614727573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061474b9190614e57565b6002546001600160a01b039182169116036147fa57601d5460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af11580156147ce573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906147f39190614f9e565b5050505050565b601d5460025460405162e8e33760e81b81523060048201526001600160a01b039182166024820152604481018590526064810184905260006084820181905260a482015261dead60c48201524260e482015291169063e8e3370090610104016060604051808303816000875af1158015614878573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147f39190614f9e565b816009546148aa9190614cb8565b600955600a546148bb908290614cf8565b600a555050565b60606148d184846000856148d9565b949350505050565b60608247101561493a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610cae565b600080866001600160a01b031685876040516149569190614fcc565b60006040518083038185875af1925050503d8060008114614993576040519150601f19603f3d011682016040523d82523d6000602084013e614998565b606091505b50915091506149a9878383876149b4565b979650505050505050565b60608315614a23578251600003614a1c576001600160a01b0385163b614a1c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610cae565b50816148d1565b6148d18383815115614a385781518083602001fd5b8060405162461bcd60e51b8152600401610cae9190614a76565b60005b83811015614a6d578181015183820152602001614a55565b50506000910152565b6020815260008251806020840152614a95816040850160208701614a52565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611e8657600080fd5b60008060408385031215614ad157600080fd5b8235614adc81614aa9565b946020939093013593505050565b600060208284031215614afc57600080fd5b5035919050565b600080600060608486031215614b1857600080fd5b8335614b2381614aa9565b92506020840135614b3381614aa9565b929592945050506040919091013590565b8015158114611e8657600080fd5b60008060408385031215614b6557600080fd5b8235614b7081614aa9565b91506020830135614b8081614b44565b809150509250929050565b600060208284031215614b9d57600080fd5b8135610e8781614aa9565b803562ffffff81168114614bbb57600080fd5b919050565b60008060408385031215614bd357600080fd5b614bdc83614ba8565b9150614bea60208401614ba8565b90509250929050565b60008060408385031215614c0657600080fd5b823591506020830135614b8081614b44565b60008060408385031215614c2b57600080fd5b8235614c3681614aa9565b91506020830135614b8081614aa9565b600181811c90821680614c5a57607f821691505b602082108103614c7a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082614cb357634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610c4557610c45614c80565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610c4557610c45614c80565b80820180821115610c4557610c45614c80565b634e487b7160e01b600052603160045260246000fd5b600060018201614d3357614d33614c80565b5060010190565b62ffffff8181168382160190808211156113b7576113b7614c80565b60208082526015908201527473656c6c20746f74616c20666565203c3d2033302560581b604082015260600190565b60208082526014908201527362757920746f74616c20666565203c3d2033302560601b604082015260600190565b6020808252600f908201526e73656c6c20666565203c3d2031352560881b604082015260600190565b6020808252600e908201526d62757920666565203c3d2031352560901b604082015260600190565b60208082526033908201527f6d61726b6574696e672077616c6c65742063616e27742062652073616d6520776040820152721a5d1a08151c99585cdd5c9e481dd85b1b195d606a1b606082015260800190565b600060208284031215614e6957600080fd5b8151610e8781614aa9565b600060208284031215614e8657600080fd5b5051919050565b600081518084526020808501945080840160005b83811015614ec65781516001600160a01b031687529582019590820190600101614ea1565b509495945050505050565b848152608060208201526000614eea6080830186614e8d565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a060408201526000614f2560a0830186614e8d565b6001600160a01b0394909416606083015250608001529392505050565b600060208284031215614f5457600080fd5b8151610e8781614b44565b60018060a01b038616815284602082015283604082015260a060608201526000614f8c60a0830185614e8d565b90508260808301529695505050505050565b600080600060608486031215614fb357600080fd5b8351925060208401519150604084015190509250925092565b60008251614fde818460208701614a52565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220394381c3913f18d5a2782a2384120dcf856d803aa2e8b1156da8da472c4cc7ac64736f6c63430008130033a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6886561636820666565203c3d203135250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000026e0a31af79fa08f00000000000000000000000000000000000000000000000026e0a31af79fa08f00000000000000000000000000000000000000000000000026e0a31af79fa08f000000000000000000000000000000c7d1c5433dfc880520afc6ad534bbf9ad8dec0b20000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000d86cf748548aaddebb681df2fe9123770d3f0a8200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0dcc752af9be6a07a67934471d7cd901a6094e60000000000000000000000001ccfe8c40ef259566433716002e379dfffbf5a3e000000000000000000000000000000000000000000000000000000000000000b5472756d70734669676874000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b5472756d707346696768740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f041690d9cbe398d3d51f25c87902c1403affe66

Deployed Bytecode

0x60806040526004361061039b5760003560e01c806382685df5116101dc578063cf188ad011610102578063e71dc3f5116100a0578063f2fde38b1161006f578063f2fde38b14610b33578063f637434214610b53578063f8b45b0514610b76578063fc59d23d14610b8c57600080fd5b8063e71dc3f514610a9e578063e9481eee14610ac1578063ec44adc814610af0578063f11a24d314610b1057600080fd5b8063dd62ed3e116100dc578063dd62ed3e14610a02578063de0aad5314610a48578063df8408fe14610a69578063e086e5ec14610a8957600080fd5b8063cf188ad0146109a2578063d5bf72b7146109c2578063db4091e9146109e257600080fd5b806395d89b411161017a578063aa49802311610149578063aa49802314610919578063adb873bd14610939578063b62496f51461095c578063c8c8ebe41461098c57600080fd5b806395d89b41146108a45780639a7a23d6146108b9578063a457c2d7146108d9578063a9059cbb146108f957600080fd5b806389476069116101b6578063894760691461083b5780638da5cb5b1461085b5780638f0bc16714610879578063921369131461088157600080fd5b806382685df5146107c257806385af30c5146107e257806388f820201461080257600080fd5b80634707c551116102c15780636c516a701161025f57806375f0a8741161022e57806375f0a8741461073f5780637bce5a041461075f5780637c75ad3a14610782578063809d458d146107a257600080fd5b80636c516a70146106ca57806370a08231146106ea578063715018a61461070a57806373b9e82c1461071f57600080fd5b80635342acb41161029b5780635342acb41461063357806357e62b98146106635780635c068a8c146106845780636b2fb124146106a757600080fd5b80634707c551146105d357806348a5317e146105f357806352390c021461061357600080fd5b80632ae2f121116103395780633950935111610308578063395093511461053b5780633fd1c86d1461055b5780634549b0391461057b5780634626402b1461059b57600080fd5b80632ae2f121146104af5780632d838119146104cf578063313ce567146104ef5780633685d4191461051b57600080fd5b806313114a9d1161037557806313114a9d1461043957806318160ddd146104585780631c499ab01461046d57806323b872dd1461048f57600080fd5b806306fdde03146103a7578063095ea7b3146103d25780630cfe2f3f1461040257600080fd5b366103a257005b600080fd5b3480156103b357600080fd5b506103bc610ba2565b6040516103c99190614a76565b60405180910390f35b3480156103de57600080fd5b506103f26103ed366004614abe565b610c34565b60405190151581526020016103c9565b34801561040e57600080fd5b5060175461042590600160201b900462ffffff1681565b60405162ffffff90911681526020016103c9565b34801561044557600080fd5b50600a545b6040519081526020016103c9565b34801561046457600080fd5b5060085461044a565b34801561047957600080fd5b5061048d610488366004614aea565b610c4b565b005b34801561049b57600080fd5b506103f26104aa366004614b03565b610cf9565b3480156104bb57600080fd5b5061048d6104ca366004614b52565b610d4b565b3480156104db57600080fd5b5061044a6104ea366004614aea565b610e0a565b3480156104fb57600080fd5b50600254600160a01b900460ff1660405160ff90911681526020016103c9565b34801561052757600080fd5b5061048d610536366004614b8b565b610e8e565b34801561054757600080fd5b506103f2610556366004614abe565b6110a4565b34801561056757600080fd5b5061048d610576366004614bc0565b6110db565b34801561058757600080fd5b5061044a610596366004614bf3565b6112c9565b3480156105a757600080fd5b506019546105bb906001600160a01b031681565b6040516001600160a01b0390911681526020016103c9565b3480156105df57600080fd5b5061048d6105ee366004614b52565b6113be565b3480156105ff57600080fd5b506002546105bb906001600160a01b031681565b34801561061f57600080fd5b5061048d61062e366004614b8b565b611500565b34801561063f57600080fd5b506103f261064e366004614b8b565b601f6020526000908152604090205460ff1681565b34801561066f57600080fd5b506018546103f290600160a01b900460ff1681565b34801561069057600080fd5b5060175461042590600160b01b900462ffffff1681565b3480156106b357600080fd5b5060175461042590600160981b900462ffffff1681565b3480156106d657600080fd5b5061048d6106e5366004614c18565b6116cc565b3480156106f657600080fd5b5061044a610705366004614b8b565b611937565b34801561071657600080fd5b5061048d611996565b34801561072b57600080fd5b5061048d61073a366004614aea565b6119aa565b34801561074b57600080fd5b506018546105bb906001600160a01b031681565b34801561076b57600080fd5b5060175461042590600160801b900462ffffff1681565b34801561078e57600080fd5b506001546105bb906001600160a01b031681565b3480156107ae57600080fd5b5061048d6107bd366004614b8b565b611a3d565b3480156107ce57600080fd5b5061048d6107dd366004614bc0565b611bbf565b3480156107ee57600080fd5b50601e546105bb906001600160a01b031681565b34801561080e57600080fd5b506103f261081d366004614b8b565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561084757600080fd5b5061048d610856366004614b8b565b611daa565b34801561086757600080fd5b506000546001600160a01b03166105bb565b61048d611e89565b34801561088d57600080fd5b5060175461042590600160681b900462ffffff1681565b3480156108b057600080fd5b506103bc612309565b3480156108c557600080fd5b5061048d6108d4366004614b52565b612318565b3480156108e557600080fd5b506103f26108f4366004614abe565b61232a565b34801561090557600080fd5b506103f2610914366004614abe565b612361565b34801561092557600080fd5b5061048d610934366004614aea565b61236e565b34801561094557600080fd5b5060175461042590600160c81b900462ffffff1681565b34801561096857600080fd5b506103f2610977366004614b8b565b60216020526000908152604090205460ff1681565b34801561099857600080fd5b5061044a601c5481565b3480156109ae57600080fd5b50601d546105bb906001600160a01b031681565b3480156109ce57600080fd5b5061048d6109dd366004614bc0565b61242b565b3480156109ee57600080fd5b5061048d6109fd366004614bc0565b61261d565b348015610a0e57600080fd5b5061044a610a1d366004614c18565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610a5457600080fd5b5060175461042590610100900462ffffff1681565b348015610a7557600080fd5b5061048d610a84366004614b52565b61280b565b348015610a9557600080fd5b5061048d6128c5565b348015610aaa57600080fd5b5060175461042590600160e01b900462ffffff1681565b348015610acd57600080fd5b506103f2610adc366004614b8b565b602080526000908152604090205460ff1681565b348015610afc57600080fd5b5061048d610b0b366004614bc0565b612967565b348015610b1c57600080fd5b5060175461042590600160501b900462ffffff1681565b348015610b3f57600080fd5b5061048d610b4e366004614b8b565b612b55565b348015610b5f57600080fd5b5060175461042590600160381b900462ffffff1681565b348015610b8257600080fd5b5061044a601b5481565b348015610b9857600080fd5b5061044a601a5481565b6060600b8054610bb190614c46565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdd90614c46565b8015610c2a5780601f10610bff57610100808354040283529160200191610c2a565b820191906000526020600020905b815481529060010190602001808311610c0d57829003601f168201915b5050505050905090565b6000610c41338484612bcb565b5060015b92915050565b610c53612cef565b612710600854610c639190614c96565b811015610cb75760405162461bcd60e51b815260206004820181905260248201527f6d617857616c6c6574203e3d20746f74616c537570706c79202f20313030303060448201526064015b60405180910390fd5b601b546040805183815260208101929092527fff64d41f60feb77d52f64ae64a9fc3929d57a89d0cc55728762468bae5e0fe52910160405180910390a1601b55565b6000610d06848484612d49565b6001600160a01b038416600090815260056020908152604080832033808552925290912054610d41918691610d3c908690614cb8565b612bcb565b5060019392505050565b610d53612cef565b6001600160a01b038216600090815260208052604090205481151560ff909116151503610dac5760405162461bcd60e51b8152602060048201526007602482015266616c726561647960c81b6044820152606401610cae565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527f82170bbd72c16b30c410014b7382121a699ed119a182e48a0b6cadcc89104ac991015b60405180910390a25050565b6000600954821115610e715760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610cae565b6000610e7b613130565b9050610e878184614c96565b9392505050565b610e96612cef565b6001600160a01b03811660009081526006602052604090205460ff16610efe5760405162461bcd60e51b815260206004820152601760248201527f4163636f756e74206973206e6f74206578636c756465640000000000000000006044820152606401610cae565b60005b6007548110156110a057816001600160a01b031660078281548110610f2857610f28614ccb565b6000918252602090912001546001600160a01b03160361108e576001600160a01b038216600090815260036020526040902054610f63613130565b6001600160a01b038416600090815260046020526040902054610f869190614ce1565b6001600160a01b0384166000908152600360205260409020819055600954610faf908390614cb8565b610fb99190614cf8565b6009556001600160a01b0383166000908152600660205260409020805460ff1916905560078054610fec90600190614cb8565b81548110610ffc57610ffc614ccb565b600091825260209091200154600780546001600160a01b03909216918490811061102857611028614ccb565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600780548061106757611067614d0b565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b8061109881614d21565b915050610f01565b5050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610c41918590610d3c908690614cf8565b6110e3612cef565b601754620493e09062ffffff600160c81b82048116916101008104821691600160681b820481169161111e91600160381b9091041687614d3a565b6111289190614d3a565b6111329190614d3a565b61113c9190614d3a565b62ffffff16111561115f5760405162461bcd60e51b8152600401610cae90614d56565b601754620493e09062ffffff600160e01b8204811691600160201b8104821691600160801b820481169161119c91600160501b9091041686614d3a565b6111a69190614d3a565b6111b09190614d3a565b6111ba9190614d3a565b62ffffff1611156111dd5760405162461bcd60e51b8152600401610cae90614d85565b620249f08262ffffff1611156112055760405162461bcd60e51b8152600401610cae90614db3565b620249f08162ffffff16111561122d5760405162461bcd60e51b8152600401610cae90614ddc565b6017546040805162ffffff85811682528481166020830152600160981b8404811682840152600160b01b9093049092166060830152517fc239c020ec275d4a3e59d37954f59c061e7302d35a1b6bad801059aafe9631ee9181900360800190a16017805465ffffffffffff60981b1916600160981b62ffffff9485160262ffffff60b01b191617600160b01b9290931691909102919091179055565b600060085483111561131d5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610cae565b6000611327613130565b90508261134457600061133a8286614ce1565b9250610c45915050565b600080600080600061135589613153565b94509450945094509450600081838587898e6113719190614cb8565b61137b9190614cb8565b6113859190614cb8565b61138f9190614cb8565b6113999190614cb8565b905060006113a78883614ce1565b9850610c45975050505050505050565b5092915050565b6113c6612cef565b6001600160a01b03821661141c5760405162461bcd60e51b815260206004820152601b60248201527f6d61726b6574696e672077616c6c65742063616e2774206265203000000000006044820152606401610cae565b6019546001600160a01b039081169083160361144a5760405162461bcd60e51b8152600401610cae90614e04565b601854604080518315158152600160a01b830460ff16151560208201526001600160a01b03928316928516917fc8dfdd9b91ac62ee1bd8be3541ea02d8e584461c794c6e49e94ccf21c71ebcca910160405180910390a360188054911515600160a01b026001600160a81b03199092166001600160a01b039093169283179190911790556000908152601f60209081526040808320805460ff199081166001908117909255928052922080549091169091179055565b611508612cef565b6001600160a01b03811660009081526006602052604090205460ff16156115715760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610cae565b600754603290611582906001614cf8565b111561160c5760405162461bcd60e51b815260206004820152604d60248201527f43616e6e6f74206578636c756465206d6f7265207468616e203530206163636f60448201527f756e74732e2020496e636c75646520612070726576696f75736c79206578636c60648201526c3ab232b21030b2323932b9b99760991b608482015260a401610cae565b6001600160a01b03811660009081526003602052604090205415611666576001600160a01b03811660009081526003602052604090205461164c90610e0a565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600660205260408120805460ff191660019081179091556007805491820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319169091179055565b6116d4612cef565b600280546001600160a01b0319166001600160a01b0383811691909117909155601d5483821691161461172a5761170e3083600019612bcb565b601d80546001600160a01b0319166001600160a01b0384161790555b601d60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561177d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a19190614e57565b6002546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af11580156117f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118169190614e57565b601e80546001600160a01b0319166001600160a01b03928316179055601d54604080516315ab88c960e31b81529051919092169163ad5c46489160048083019260209291908290030181865afa158015611874573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118989190614e57565b6002546001600160a01b039081169116146118cc57601d546002546118cc916001600160a01b0391821691166000196131ac565b601d54601e54600254604080516001600160a01b039485168152928416602084015292168183015290517f113a6e83812f48b2f83795e33cb009afb4ba6e240c9c643c5dc75791e4ce7ab69181900360600190a1601e546110a0906001600160a01b031660016132f9565b6001600160a01b03811660009081526006602052604081205460ff161561197457506001600160a01b031660009081526004602052604090205490565b6001600160a01b038216600090815260036020526040902054610c4590610e0a565b61199e612cef565b6119a86000613429565b565b6119b2612cef565b600081116119fb5760405162461bcd60e51b815260206004820152601660248201527506d696e416d6f756e74546f54616b65466565203e20360541b6044820152606401610cae565b601a546040805183815260208101929092527f772a06bc936eb749842080c472181e970cd4f23bd1ab7d0b84a80aec26910434910160405180910390a1601a55565b611a45612cef565b6001600160a01b038116611a9b5760405162461bcd60e51b815260206004820152601a60248201527f54726561737572792077616c6c65742063616e277420626520300000000000006044820152606401610cae565b306001600160a01b03821603611b065760405162461bcd60e51b815260206004820152602a60248201527f54726561737572792077616c6c65742063616e2774206265207468652073616d604482015269329030b9903a37b5b2b760b11b6064820152608401610cae565b6018546001600160a01b03808316911603611b335760405162461bcd60e51b8152600401610cae90614e04565b6019546040516001600160a01b03918216918316907f79a52cbec002ef70283103eb4140713100276944fca2819713130141d04df18390600090a3601980546001600160a01b039092166001600160a01b0319909216821790556000908152601f60209081526040808320805460ff199081166001908117909255928052922080549091169091179055565b611bc7612cef565b601754620493e09062ffffff600160c81b8204811691600160981b8104821691600160681b8204811691611c0491600160381b9091041687614d3a565b611c0e9190614d3a565b611c189190614d3a565b611c229190614d3a565b62ffffff161115611c455760405162461bcd60e51b8152600401610cae90614d56565b601754620493e09062ffffff600160e01b8204811691600160b01b8104821691600160801b8204811691611c8291600160501b9091041686614d3a565b611c8c9190614d3a565b611c969190614d3a565b611ca09190614d3a565b62ffffff161115611cc35760405162461bcd60e51b8152600401610cae90614d85565b620249f08262ffffff161115611ceb5760405162461bcd60e51b8152600401610cae90614db3565b620249f08162ffffff161115611d135760405162461bcd60e51b8152600401610cae90614ddc565b6017546040805162ffffff858116825284811660208301526101008404811682840152600160201b9093049092166060830152517f2e7d9780ec398c47872eab5651ba43f0fa44ffed738321577e0db663fe8a05a59181900360800190a16017805466ffffffffffff00191661010062ffffff9485160266ffffff00000000191617600160201b9290931691909102919091179055565b611db2612cef565b6001600160a01b0381163003611df85760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b6044820152606401610cae565b611e86611e0d6000546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015611e51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e759190614e74565b6001600160a01b0384169190613479565b50565b604080516002808252606082018352600092602083019080368337505060025482519293506001600160a01b031691839150600090611eca57611eca614ccb565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611efe57611efe614ccb565b6001600160a01b03928316602091820292909201810191909152601d54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611f57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7b9190614e57565b6001600160a01b031681600081518110611f9757611f97614ccb565b60200260200101516001600160a01b03160361202157601d5460195460405163b6f9de9560e01b81526001600160a01b039283169263b6f9de95923492611fea9260009288929116904290600401614ed1565b6000604051808303818588803b15801561200357600080fd5b505af1158015612017573d6000803e3d6000fd5b5050505050612129565b6002546000906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561207a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209e9190614e74565b90506120b8336002546001600160a01b03169030846134a9565b601d54601954604051635c11d79560e01b81526001600160a01b0392831692635c11d795926120f592869260009289929116904290600401614f06565b600060405180830381600087803b15801561210f57600080fd5b505af1158015612123573d6000803e3d6000fd5b50505050505b6019546001600160a01b031660009081526006602052604090205460ff1615612238576019546001600160a01b03166000908152600460205260409020546008546121749190614cb8565b6008556019546001600160a01b031660009081526003602052604090205460095461219f9190614cb8565b6009556019546001600160a01b031660009081526004602052604090205415612202576019546001600160a01b03166000818152600460209081526040808320549051908152919291600080516020614fe9833981519152910160405180910390a35b601980546001600160a01b0390811660009081526003602090815260408083208390559354909216815260049091529081205550565b6019546001600160a01b031660009081526003602052604081205461225c90610e0a565b90508060085461226c9190614cb8565b6008556019546001600160a01b03166000908152600360205260409020546009546122979190614cb8565b60095580156122d2576019546040518281526000916001600160a01b031690600080516020614fe98339815191529060200160405180910390a35b50601980546001600160a01b0390811660009081526003602090815260408083208390559354909216815260049091529081205550565b6060600c8054610bb190614c46565b612320612cef565b6110a082826132f9565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610c41918590610d3c908690614cb8565b6000610c41338484612d49565b612376612cef565b6127106008546123869190614c96565b8110156123e95760405162461bcd60e51b815260206004820152602b60248201527f6d61785472616e73616374696f6e416d6f756e74203e3d20746f74616c53757060448201526a0706c79202f2031303030360ac1b6064820152608401610cae565b601c546040805183815260208101929092527f35eec0711af6fbe3039535323be51b57996b6945b0d55862607c7a02e52e4507910160405180910390a1601c55565b612433612cef565b601754620493e09062ffffff600160c81b8204811691600160981b8104821691610100820481169161246e91600160681b9091041687614d3a565b6124789190614d3a565b6124829190614d3a565b61248c9190614d3a565b62ffffff1611156124af5760405162461bcd60e51b8152600401610cae90614d56565b601754620493e09062ffffff600160e01b8204811691600160b01b8104821691600160201b82048116916124ec91600160801b9091041686614d3a565b6124f69190614d3a565b6125009190614d3a565b61250a9190614d3a565b62ffffff16111561252d5760405162461bcd60e51b8152600401610cae90614d85565b620249f08262ffffff1611156125555760405162461bcd60e51b8152600401610cae90614db3565b620249f08162ffffff16111561257d5760405162461bcd60e51b8152600401610cae90614ddc565b6017546040805162ffffff85811682528481166020830152600160381b8404811682840152600160501b9093049092166060830152517fdec183740138e3a28dfd6f973ecd3bf00cd5d9b2544f6763c0a87f721444c5d19181900360800190a1601780546cffffffffffff000000000000001916600160381b62ffffff9485160262ffffff60501b191617600160501b9290931691909102919091179055565b612625612cef565b601754620493e09062ffffff6101008204811691600160981b8104821691600160681b820481169161266091600160381b9091041687614d3a565b61266a9190614d3a565b6126749190614d3a565b61267e9190614d3a565b62ffffff1611156126a15760405162461bcd60e51b8152600401610cae90614d56565b601754620493e09062ffffff600160201b8204811691600160b01b8104821691600160801b82048116916126de91600160501b9091041686614d3a565b6126e89190614d3a565b6126f29190614d3a565b6126fc9190614d3a565b62ffffff16111561271f5760405162461bcd60e51b8152600401610cae90614d85565b620249f08262ffffff1611156127475760405162461bcd60e51b8152600401610cae90614db3565b620249f08162ffffff16111561276f5760405162461bcd60e51b8152600401610cae90614ddc565b6017546040805162ffffff85811682528481166020830152600160c81b8404811682840152600160e01b9093049092166060830152517fdc717222e8a01249bcfb0a887e700321c9465eda757255fd7895bd39fab714d29181900360800190a16017805465ffffffffffff60c81b1916600160c81b62ffffff9485160262ffffff60e01b191617600160e01b9290931691909102919091179055565b612813612cef565b6001600160a01b0382166000908152601f602052604090205481151560ff90911615150361286d5760405162461bcd60e51b8152602060048201526007602482015266616c726561647960c81b6044820152606401610cae565b6001600160a01b0382166000818152601f6020908152604091829020805460ff191685151590811790915591519182527f2d43abd87b27cee7b0aa8c6f7e0b4a3247b683262a83cbc2318b0df398a49aa99101610dfe565b6128cd612cef565b600080546040516001600160a01b039091169047908381818185875af1925050503d806000811461291a576040519150601f19603f3d011682016040523d82523d6000602084013e61291f565b606091505b5050905080611e865760405162461bcd60e51b815260206004820152601460248201527311985a5b1959081a5b881dda5d1a191c985dd85b60621b6044820152606401610cae565b61296f612cef565b601754620493e09062ffffff600160c81b8204811691600160981b810482169161010082048116916129aa91600160381b9091041687614d3a565b6129b49190614d3a565b6129be9190614d3a565b6129c89190614d3a565b62ffffff1611156129eb5760405162461bcd60e51b8152600401610cae90614d56565b601754620493e09062ffffff600160e01b8204811691600160b01b8104821691600160201b8204811691612a2891600160501b9091041686614d3a565b612a329190614d3a565b612a3c9190614d3a565b612a469190614d3a565b62ffffff161115612a695760405162461bcd60e51b8152600401610cae90614d85565b620249f08262ffffff161115612a915760405162461bcd60e51b8152600401610cae90614db3565b620249f08162ffffff161115612ab95760405162461bcd60e51b8152600401610cae90614ddc565b6017546040805162ffffff85811682528481166020830152600160681b8404811682840152600160801b9093049092166060830152517f70748cb9cb3bcb4dfd4fff8f2a6f23f636067b33e0244631f9abd38159c1de859181900360800190a16017805465ffffffffffff60681b1916600160681b62ffffff9485160262ffffff60801b191617600160801b9290931691909102919091179055565b612b5d612cef565b6001600160a01b038116612bc25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cae565b611e8681613429565b6001600160a01b038316612c2d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cae565b6001600160a01b038216612c8e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cae565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000546001600160a01b031633146119a85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610cae565b6001600160a01b038316612dad5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610cae565b6001600160a01b038216612e0f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610cae565b6000612e1a30611937565b90506000602354602254612e2e9190614cf8565b90506000601a548210158015612e445750828211155b60175490915060ff16158015612e575750805b8015612e785750601e54600090612e76906001600160a01b0316611937565b115b8015612e9c57506001600160a01b03851660009081526021602052604090205460ff165b15612ea957612ea96134e7565b612ee4600d8054600e55600f805460105560118054601255601380546014556015805460165560009081905590819055908190559182905555565b60175460ff16158015612f1057506001600160a01b0386166000908152601f602052604090205460ff16155b8015612f3557506001600160a01b0385166000908152601f602052604090205460ff16155b15613006576001600160a01b03861660009081526021602052604090205460ff1615612fa35760175462ffffff600160201b82048116600d55600160501b82048116600f55600160801b82048116601155600160b01b82048116601355600160e01b90910416601555613006565b6001600160a01b03851660009081526021602052604090205460ff16156130065760175462ffffff61010082048116600d55600160381b82048116600f55600160681b82048116601155600160981b82048116601355600160c81b909104166015555b613011868686613d40565b613034601654601555601454601355600e54600d55601054600f55601254601155565b60175460ff16613128576001600160a01b038616600090815260208052604090205460ff166130af57601c548411156130af5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a2065786365656473207472616e73666572206c696d69740000006044820152606401610cae565b6001600160a01b038516600090815260208052604090205460ff1661312857601b546130da86611937565b11156131285760405162461bcd60e51b815260206004820152601f60248201527f45524332303a2065786365656473206d61782077616c6c6574206c696d6974006044820152606401610cae565b505050505050565b600080600061313d614255565b909250905061314c8183614c96565b9250505090565b600080600080600080613165876143d8565b90506000613172886143f6565b9050600061317f8961440a565b9050600061318c8a61441e565b905060006131998b614432565b949b939a50919850965091945092505050565b8015806132265750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015613200573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132249190614e74565b155b6132915760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610cae565b6040516001600160a01b0383166024820152604481018290526132f490849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152614446565b505050565b6001600160a01b03821660009081526021602052604090205481151560ff90911615150361338f5760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610cae565b6001600160a01b0382166000908152602160205260409020805460ff191682158015919091179091556133ca576133c582611500565b6133d3565b6133d382610e8e565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab9101610dfe565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0383166024820152604481018290526132f490849063a9059cbb60e01b906064016132bd565b6040516001600160a01b03808516602483015283166044820152606481018290526134e19085906323b872dd60e01b906084016132bd565b50505050565b6017805460ff1916600117905560225460009061350690600290614c96565b90506000601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561355d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135819190614e57565b6002546001600160a01b03908116911614613607576002546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156135de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136029190614e74565b613609565b475b9050600080601860149054906101000a900460ff1615613935576000602454602354866136369190614cf8565b6136409190614cf8565b90508015613651576136518161451b565b601d54604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa15801561369b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136bf9190614e57565b6002546001600160a01b0390811691161461374f576002546040516370a0823160e01b815230600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa15801561371c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137409190614e74565b61374a9190614cb8565b613759565b6137598547614cb8565b90506000826023548361376c9190614ce1565b6137769190614c96565b9050826137838884614ce1565b61378d9190614c96565b94508461379a8284614cb8565b6137a49190614cb8565b9350801561392d57601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138239190614e57565b6002546001600160a01b039182169116036138d5576018546040516000916001600160a01b03169083908381818185875af1925050503d8060008114613885576040519150601f19603f3d011682016040523d82523d6000602084013e61388a565b606091505b5050905080156138cf576040805160008152602081018490527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b5061392d565b6018546002546138f2916001600160a01b03918216911683613479565b6040805160008152602081018390527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b505050613ae9565b6000602454856139459190614cf8565b90508015613956576139568161451b565b601d54604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa1580156139a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139c49190614e57565b6002546001600160a01b03908116911614613a54576002546040516370a0823160e01b815230600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa158015613a21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a459190614e74565b613a4f9190614cb8565b613a5e565b613a5e8547614cb8565b905081613a6b8783614ce1565b613a759190614c96565b9350613a818482614cb8565b60235490935015613ae657601854602354613aa99130916001600160a01b0390911690612d49565b60235460408051918252600060208301527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b50505b600084118015613af95750600082115b15613b4257613b0884836146d4565b60408051858152602081018490527f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f8381486910160405180910390a15b8015613cbb57601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613b9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bbf9190614e57565b6002546001600160a01b03918216911603613c6a576019546040516000916001600160a01b03169083908381818185875af1925050503d8060008114613c21576040519150601f19603f3d011682016040523d82523d6000602084013e613c26565b606091505b505090508015613c64576040518281527fe3630e0003fb3e9f9d835bb839022e52ffd576f9f35c395dd17517106f78cb339060200160405180910390a15b50613cbb565b601954600254613c87916001600160a01b03918216911683613479565b6040518181527fe3630e0003fb3e9f9d835bb839022e52ffd576f9f35c395dd17517106f78cb339060200160405180910390a15b6000602381905560248190556022819055613cd530611937565b1115613d30576000546001600160a01b031615613d1557613d1030613d026000546001600160a01b031690565b613d0b30611937565b612d49565b613d30565b601954613d309030906001600160a01b0316613d0b82611937565b50506017805460ff191690555050565b6000806000806000613d5186613153565b94509450945094509450600081838587898b613d6d9190614cb8565b613d779190614cb8565b613d819190614cb8565b613d8b9190614cb8565b613d959190614cb8565b90506000613da1613130565b905082600854613db19190614cb8565b600855613dbe8184614ce1565b600954613dcb9190614cb8565b6009558215613e04576040518381526000906001600160a01b038c1690600080516020614fe98339815191529060200160405180910390a35b85602254613e129190614cf8565b602255602354613e23908690614cf8565b602355602454613e34908590614cf8565b602455600084613e448789614cf8565b613e4e9190614cf8565b9050613e5a8282614ce1565b30600090815260036020526040902054613e749190614cf8565b3060009081526003602090815260408083209390935560069052205460ff1615613ec45730600090815260046020526040902054613eb3908290614cf8565b306000908152600460205260409020555b8015613ef95760405181815230906001600160a01b038d1690600080516020614fe98339815191529060200160405180910390a35b506001600160a01b038a1660009081526006602052604090205460ff168015613f3b57506001600160a01b03891660009081526006602052604090205460ff16155b1561400e576001600160a01b038a16600090815260046020526040902054613f64908990614cb8565b6001600160a01b038b16600090815260046020526040902055613f878189614ce1565b6001600160a01b038b16600090815260036020526040902054613faa9190614cb8565b6001600160a01b038b16600090815260036020526040902055613fcd8183614ce1565b6001600160a01b038a16600090815260036020526040902054613ff09190614cf8565b6001600160a01b038a166000908152600360205260409020556141f4565b6001600160a01b038a1660009081526006602052604090205460ff1615801561404f57506001600160a01b03891660009081526006602052604090205460ff165b156140db5761405e8189614ce1565b6001600160a01b038b166000908152600360205260409020546140819190614cb8565b6001600160a01b03808c16600090815260036020908152604080832094909455918c168152600490915220546140b8908390614cf8565b6001600160a01b038a16600090815260046020526040902055613fcd8183614ce1565b6001600160a01b038a1660009081526006602052604090205460ff16801561411b57506001600160a01b03891660009081526006602052604090205460ff165b15614167576001600160a01b038a16600090815260046020526040902054614144908990614cb8565b6001600160a01b038b1660009081526004602052604090205561405e8189614ce1565b6141718189614ce1565b6001600160a01b038b166000908152600360205260409020546141949190614cb8565b6001600160a01b038b166000908152600360205260409020556141b78183614ce1565b6001600160a01b038a166000908152600360205260409020546141da9190614cf8565b6001600160a01b038a166000908152600360205260409020555b6142076142018289614ce1565b8861489c565b811561424957886001600160a01b03168a6001600160a01b0316600080516020614fe98339815191528460405161424091815260200190565b60405180910390a35b50505050505050505050565b6009546008546000918291825b6007548110156143a75782600360006007848154811061428457614284614ccb565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806142ef57508160046000600784815481106142c8576142c8614ccb565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561430557600954600854945094505050509091565b600360006007838154811061431c5761431c614ccb565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461434b9084614cb8565b9250600460006007838154811061436457614364614ccb565b60009182526020808320909101546001600160a01b031683528201929092526040019020546143939083614cb8565b91508061439f81614d21565b915050614262565b506008546009546143b89190614c96565b8210156143cf576009546008549350935050509091565b90939092509050565b6000620f4240600d54836143ec9190614ce1565b610c459190614c96565b6000620f4240600f54836143ec9190614ce1565b6000620f4240601154836143ec9190614ce1565b6000620f4240601354836143ec9190614ce1565b6000620f4240601554836143ec9190614ce1565b600061449b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166148c29092919063ffffffff16565b90508051600014806144bc5750808060200190518101906144bc9190614f42565b6132f45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610cae565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061455057614550614ccb565b6001600160a01b03928316602091820292909201015260025482519116908290600190811061458157614581614ccb565b6001600160a01b03928316602091820292909201810191909152601d54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156145da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145fe9190614e57565b6001600160a01b03168160018151811061461a5761461a614ccb565b60200260200101516001600160a01b03160361469757601d5460405163791ac94760e01b81526001600160a01b039091169063791ac94790614669908590600090869030904290600401614f06565b600060405180830381600087803b15801561468357600080fd5b505af1158015613128573d6000803e3d6000fd5b600154601d54604051637274ca1b60e11b81526001600160a01b039283169263e4e994369261466992911690869060009087904290600401614f5f565b601d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614727573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061474b9190614e57565b6002546001600160a01b039182169116036147fa57601d5460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af11580156147ce573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906147f39190614f9e565b5050505050565b601d5460025460405162e8e33760e81b81523060048201526001600160a01b039182166024820152604481018590526064810184905260006084820181905260a482015261dead60c48201524260e482015291169063e8e3370090610104016060604051808303816000875af1158015614878573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147f39190614f9e565b816009546148aa9190614cb8565b600955600a546148bb908290614cf8565b600a555050565b60606148d184846000856148d9565b949350505050565b60608247101561493a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610cae565b600080866001600160a01b031685876040516149569190614fcc565b60006040518083038185875af1925050503d8060008114614993576040519150601f19603f3d011682016040523d82523d6000602084013e614998565b606091505b50915091506149a9878383876149b4565b979650505050505050565b60608315614a23578251600003614a1c576001600160a01b0385163b614a1c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610cae565b50816148d1565b6148d18383815115614a385781518083602001fd5b8060405162461bcd60e51b8152600401610cae9190614a76565b60005b83811015614a6d578181015183820152602001614a55565b50506000910152565b6020815260008251806020840152614a95816040850160208701614a52565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611e8657600080fd5b60008060408385031215614ad157600080fd5b8235614adc81614aa9565b946020939093013593505050565b600060208284031215614afc57600080fd5b5035919050565b600080600060608486031215614b1857600080fd5b8335614b2381614aa9565b92506020840135614b3381614aa9565b929592945050506040919091013590565b8015158114611e8657600080fd5b60008060408385031215614b6557600080fd5b8235614b7081614aa9565b91506020830135614b8081614b44565b809150509250929050565b600060208284031215614b9d57600080fd5b8135610e8781614aa9565b803562ffffff81168114614bbb57600080fd5b919050565b60008060408385031215614bd357600080fd5b614bdc83614ba8565b9150614bea60208401614ba8565b90509250929050565b60008060408385031215614c0657600080fd5b823591506020830135614b8081614b44565b60008060408385031215614c2b57600080fd5b8235614c3681614aa9565b91506020830135614b8081614aa9565b600181811c90821680614c5a57607f821691505b602082108103614c7a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082614cb357634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610c4557610c45614c80565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610c4557610c45614c80565b80820180821115610c4557610c45614c80565b634e487b7160e01b600052603160045260246000fd5b600060018201614d3357614d33614c80565b5060010190565b62ffffff8181168382160190808211156113b7576113b7614c80565b60208082526015908201527473656c6c20746f74616c20666565203c3d2033302560581b604082015260600190565b60208082526014908201527362757920746f74616c20666565203c3d2033302560601b604082015260600190565b6020808252600f908201526e73656c6c20666565203c3d2031352560881b604082015260600190565b6020808252600e908201526d62757920666565203c3d2031352560901b604082015260600190565b60208082526033908201527f6d61726b6574696e672077616c6c65742063616e27742062652073616d6520776040820152721a5d1a08151c99585cdd5c9e481dd85b1b195d606a1b606082015260800190565b600060208284031215614e6957600080fd5b8151610e8781614aa9565b600060208284031215614e8657600080fd5b5051919050565b600081518084526020808501945080840160005b83811015614ec65781516001600160a01b031687529582019590820190600101614ea1565b509495945050505050565b848152608060208201526000614eea6080830186614e8d565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a060408201526000614f2560a0830186614e8d565b6001600160a01b0394909416606083015250608001529392505050565b600060208284031215614f5457600080fd5b8151610e8781614b44565b60018060a01b038616815284602082015283604082015260a060608201526000614f8c60a0830185614e8d565b90508260808301529695505050505050565b600080600060608486031215614fb357600080fd5b8351925060208401519150604084015190509250925092565b60008251614fde818460208701614a52565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220394381c3913f18d5a2782a2384120dcf856d803aa2e8b1156da8da472c4cc7ac64736f6c63430008130033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000026e0a31af79fa08f00000000000000000000000000000000000000000000000026e0a31af79fa08f00000000000000000000000000000000000000000000000026e0a31af79fa08f000000000000000000000000000000c7d1c5433dfc880520afc6ad534bbf9ad8dec0b20000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000d86cf748548aaddebb681df2fe9123770d3f0a8200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0dcc752af9be6a07a67934471d7cd901a6094e60000000000000000000000001ccfe8c40ef259566433716002e379dfffbf5a3e000000000000000000000000000000000000000000000000000000000000000b5472756d70734669676874000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b5472756d707346696768740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000f041690d9cbe398d3d51f25c87902c1403affe66

-----Decoded View---------------
Arg [0] : args (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
Arg [1] : autoApproveAddressList (address[]): 0xF041690D9cBE398d3D51F25C87902C1403AffE66
Arg [2] : referrer (address): 0x0000000000000000000000000000000000000000

-----Encoded View---------------
32 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000003c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 00000000000000000000000000000000000000000000000000000000000002e0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000320
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [6] : 00000000000000000000000000000000000000000026e0a31af79fa08f000000
Arg [7] : 00000000000000000000000000000000000000000026e0a31af79fa08f000000
Arg [8] : 00000000000000000000000000000000000000000026e0a31af79fa08f000000
Arg [9] : 000000000000000000000000c7d1c5433dfc880520afc6ad534bbf9ad8dec0b2
Arg [10] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [11] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [12] : 000000000000000000000000d86cf748548aaddebb681df2fe9123770d3f0a82
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [17] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [18] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [19] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [22] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [23] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [24] : 000000000000000000000000c0dcc752af9be6a07a67934471d7cd901a6094e6
Arg [25] : 0000000000000000000000001ccfe8c40ef259566433716002e379dfffbf5a3e
Arg [26] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [27] : 5472756d70734669676874000000000000000000000000000000000000000000
Arg [28] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [29] : 5472756d70734669676874000000000000000000000000000000000000000000
Arg [30] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [31] : 000000000000000000000000f041690d9cbe398d3d51f25c87902c1403affe66


Deployed Bytecode Sourcemap

20133:40620:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38322:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39319:193;;;;;;;;;;-1:-1:-1;39319:193:0;;;;;:::i;:::-;;:::i;:::-;;;1291:14:1;;1284:22;1266:41;;1254:2;1239:18;39319:193:0;1126:187:1;22012:26:0;;;;;;;;;;-1:-1:-1;22012:26:0;;;;-1:-1:-1;;;22012:26:0;;;;;;;;;1492:8:1;1480:21;;;1462:40;;1450:2;1435:18;22012:26:0;1318:190:1;40696:94:0;;;;;;;;;;-1:-1:-1;40767:15:0;;40696:94;;;1659:25:1;;;1647:2;1632:18;40696:94:0;1513:177:1;38605:97:0;;;;;;;;;;-1:-1:-1;38687:7:0;;38605:97;;34445:242;;;;;;;;;;-1:-1:-1;34445:242:0;;;;;:::i;:::-;;:::i;:::-;;39520:350;;;;;;;;;;-1:-1:-1;39520:350:0;;;;;:::i;:::-;;:::i;50520:323::-;;;;;;;;;;-1:-1:-1;50520:323:0;;;;;:::i;:::-;;:::i;41685:317::-;;;;;;;;;;-1:-1:-1;41685:317:0;;;;;:::i;:::-;;:::i;38512:85::-;;;;;;;;;;-1:-1:-1;38580:9:0;;-1:-1:-1;;;38580:9:0;;;;38512:85;;3023:4:1;3011:17;;;2993:36;;2981:2;2966:18;38512:85:0;2851:184:1;42514:613:0;;;;;;;;;;-1:-1:-1;42514:613:0;;;;;:::i;:::-;;:::i;39878:299::-;;;;;;;;;;-1:-1:-1;39878:299:0;;;;;:::i;:::-;;:::i;46239:862::-;;;;;;;;;;-1:-1:-1;46239:862:0;;;;;:::i;:::-;;:::i;40798:879::-;;;;;;;;;;-1:-1:-1;40798:879:0;;;;;:::i;:::-;;:::i;22412:29::-;;;;;;;;;;-1:-1:-1;22412:29:0;;;;-1:-1:-1;;;;;22412:29:0;;;;;;-1:-1:-1;;;;;4197:32:1;;;4179:51;;4167:2;4152:18;22412:29:0;4033:203:1;47923:701:0;;;;;;;;;;-1:-1:-1;47923:701:0;;;;;:::i;:::-;;:::i;21016:33::-;;;;;;;;;;-1:-1:-1;21016:33:0;;;;-1:-1:-1;;;;;21016:33:0;;;42010:496;;;;;;;;;;-1:-1:-1;42010:496:0;;;;;:::i;:::-;;:::i;22646:49::-;;;;;;;;;;-1:-1:-1;22646:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;22370:35;;;;;;;;;;-1:-1:-1;22370:35:0;;;;-1:-1:-1;;;22370:35:0;;;;;;22231:28;;;;;;;;;;-1:-1:-1;22231:28:0;;;;-1:-1:-1;;;22231:28:0;;;;;;22195:29;;;;;;;;;;-1:-1:-1;22195:29:0;;;;-1:-1:-1;;;22195:29:0;;;;;;30975:799;;;;;;;;;;-1:-1:-1;30975:799:0;;;;;:::i;:::-;;:::i;38710:198::-;;;;;;;;;;-1:-1:-1;38710:198:0;;;;;:::i;:::-;;:::i;5942:103::-;;;;;;;;;;;;;:::i;49283:322::-;;;;;;;;;;-1:-1:-1;49283:322:0;;;;;:::i;:::-;;:::i;22333:30::-;;;;;;;;;;-1:-1:-1;22333:30:0;;;;-1:-1:-1;;;;;22333:30:0;;;22157:29;;;;;;;;;;-1:-1:-1;22157:29:0;;;;-1:-1:-1;;;22157:29:0;;;;;;20970:39;;;;;;;;;;-1:-1:-1;20970:39:0;;;;-1:-1:-1;;;;;20970:39:0;;;48632:643;;;;;;;;;;-1:-1:-1;48632:643:0;;;;;:::i;:::-;;:::i;45397:834::-;;;;;;;;;;-1:-1:-1;45397:834:0;;;;;:::i;:::-;;:::i;22614:23::-;;;;;;;;;;-1:-1:-1;22614:23:0;;;;-1:-1:-1;;;;;22614:23:0;;;40534:154;;;;;;;;;;-1:-1:-1;40534:154:0;;;;;:::i;:::-;-1:-1:-1;;;;;40660:20:0;40631:4;40660:20;;;:11;:20;;;;;;;;;40534:154;60508:207;;;;;;;;;;-1:-1:-1;60508:207:0;;;;;:::i;:::-;;:::i;5711:87::-;;;;;;;;;;-1:-1:-1;5757:7:0;5784:6;-1:-1:-1;;;;;5784:6:0;5711:87;;58485:1827;;;:::i;22120:30::-;;;;;;;;;;-1:-1:-1;22120:30:0;;;;-1:-1:-1;;;22120:30:0;;;;;;38415:89;;;;;;;;;;;;;:::i;49613:163::-;;;;;;;;;;-1:-1:-1;49613:163:0;;;;;:::i;:::-;;:::i;40185:341::-;;;;;;;;;;-1:-1:-1;40185:341:0;;;;;:::i;:::-;;:::i;38916:201::-;;;;;;;;;;-1:-1:-1;38916:201:0;;;;;:::i;:::-;;:::i;34695:366::-;;;;;;;;;;-1:-1:-1;34695:366:0;;;;;:::i;:::-;;:::i;22268:25::-;;;;;;;;;;-1:-1:-1;22268:25:0;;;;-1:-1:-1;;;22268:25:0;;;;;;22775:57;;;;;;;;;;-1:-1:-1;22775:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;22525:35;;;;;;;;;;;;;;;;22571:36;;;;;;;;;;-1:-1:-1;22571:36:0;;;;-1:-1:-1;;;;;22571:36:0;;;43634:874;;;;;;;;;;-1:-1:-1;43634:874:0;;;;;:::i;:::-;;:::i;47109:806::-;;;;;;;;;;-1:-1:-1;47109:806:0;;;;;:::i;:::-;;:::i;39125:186::-;;;;;;;;;;-1:-1:-1;39125:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;39276:18:0;;;39244:7;39276:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;39125:186;21978:27;;;;;;;;;;-1:-1:-1;21978:27:0;;;;;;;;;;;50278:234;;;;;;;;;;-1:-1:-1;50278:234:0;;;;;:::i;:::-;;:::i;60318:184::-;;;;;;;;;;;;;:::i;22300:24::-;;;;;;;;;;-1:-1:-1;22300:24:0;;;;-1:-1:-1;;;22300:24:0;;;;;;22702:66;;;;;;;;;;-1:-1:-1;22702:66:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;44516:873;;;;;;;;;;-1:-1:-1;44516:873:0;;;;;:::i;:::-;;:::i;22082:29::-;;;;;;;;;;-1:-1:-1;22082:29:0;;;;-1:-1:-1;;;22082:29:0;;;;;;6051:201;;;;;;;;;;-1:-1:-1;6051:201:0;;;;;:::i;:::-;;:::i;22045:30::-;;;;;;;;;;-1:-1:-1;22045:30:0;;;;-1:-1:-1;;;22045:30:0;;;;;;22494:24;;;;;;;;;;;;;;;;22454:33;;;;;;;;;;;;;;;;38322:85;38361:13;38394:5;38387:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38322:85;:::o;39319:193::-;39421:4;39443:39;5270:10;39466:7;39475:6;39443:8;:39::i;:::-;-1:-1:-1;39500:4:0;39319:193;;;;;:::o;34445:242::-;5672:13;:11;:13::i;:::-;34550:5:::1;34540:7;;:15;;;;:::i;:::-;34528:10;:27;;34520:72;;;::::0;-1:-1:-1;;;34520:72:0;;6043:2:1;34520:72:0::1;::::0;::::1;6025:21:1::0;;;6062:18;;;6055:30;6121:34;6101:18;;;6094:62;6173:18;;34520:72:0::1;;;;;;;;;34636:9;::::0;34608:38:::1;::::0;;6376:25:1;;;6432:2;6417:18;;6410:34;;;;34608:38:0::1;::::0;6349:18:1;34608:38:0::1;;;;;;;34657:9;:22:::0;34445:242::o;39520:350::-;39654:4;39671:36;39681:6;39689:9;39700:6;39671:9;:36::i;:::-;-1:-1:-1;;;;;39789:19:0;;;;;;:11;:19;;;;;;;;5270:10;39789:33;;;;;;;;;39718:122;;39741:6;;39789:40;;39823:6;;39789:40;:::i;:::-;39718:8;:122::i;:::-;-1:-1:-1;39858:4:0;39520:350;;;;;:::o;50520:323::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;50650:43:0;::::1;;::::0;;;:34:::1;:43:::0;;;;;;:49;::::1;;:43;::::0;;::::1;:49;;::::0;50642:69:::1;;;::::0;-1:-1:-1;;;50642:69:0;;6790:2:1;50642:69:0::1;::::0;::::1;6772:21:1::0;6829:1;6809:18;;;6802:29;-1:-1:-1;;;6847:18:1;;;6840:37;6894:18;;50642:69:0::1;6588:330:1::0;50642:69:0::1;-1:-1:-1::0;;;;;50722:43:0;::::1;;::::0;;;:34:::1;:43:::0;;;;;;;;:50;;-1:-1:-1;;50722:50:0::1;::::0;::::1;;::::0;;::::1;::::0;;;50788:47;;1266:41:1;;;50788:47:0::1;::::0;1239:18:1;50788:47:0::1;;;;;;;;50520:323:::0;;:::o;41685:317::-;41779:7;41837;;41826;:18;;41804:110;;;;-1:-1:-1;;;41804:110:0;;7125:2:1;41804:110:0;;;7107:21:1;7164:2;7144:18;;;7137:30;7203:34;7183:18;;;7176:62;-1:-1:-1;;;7254:18:1;;;7247:40;7304:19;;41804:110:0;6923:406:1;41804:110:0;41925:19;41947:10;:8;:10::i;:::-;41925:32;-1:-1:-1;41975:19:0;41925:32;41975:7;:19;:::i;:::-;41968:26;41685:317;-1:-1:-1;;;41685:317:0:o;42514:613::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;42592:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;42584:56;;;::::0;-1:-1:-1;;;42584:56:0;;7536:2:1;42584:56:0::1;::::0;::::1;7518:21:1::0;7575:2;7555:18;;;7548:30;7614:25;7594:18;;;7587:53;7657:18;;42584:56:0::1;7334:347:1::0;42584:56:0::1;42656:9;42651:469;42675:9;:16:::0;42671:20;::::1;42651:469;;;42733:7;-1:-1:-1::0;;;;;42717:23:0::1;:9;42727:1;42717:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;42717:12:0::1;:23:::0;42713:396:::1;;-1:-1:-1::0;;;;;42781:16:0;::::1;42761:19;42781:16:::0;;;:7:::1;:16;::::0;;;;;42850:10:::1;:8;:10::i;:::-;-1:-1:-1::0;;;;;42833:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;:27:::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;;;;;42816:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:44;;;42887:7:::1;::::0;:19:::1;::::0;42895:11;;42887:19:::1;:::i;:::-;:36;;;;:::i;:::-;42879:7;:44:::0;-1:-1:-1;;;;;42942:20:0;::::1;42965:5;42942:20:::0;;;:11:::1;:20;::::0;;;;:28;;-1:-1:-1;;42942:28:0::1;::::0;;43004:9:::1;43014:16:::0;;:20:::1;::::0;42942:28;;43014:20:::1;:::i;:::-;43004:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;42989:9:::1;:12:::0;;-1:-1:-1;;;;;43004:31:0;;::::1;::::0;42999:1;;42989:12;::::1;;;;;:::i;:::-;;;;;;;;;:46;;;;;-1:-1:-1::0;;;;;42989:46:0::1;;;;;-1:-1:-1::0;;;;;42989:46:0::1;;;;;;43054:9;:15;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;43054:15:0;;;;;-1:-1:-1;;;;;;43054:15:0::1;::::0;;;;;-1:-1:-1;42651:469:0::1;42514:613:::0;:::o;42713:396::-:1;42693:3:::0;::::1;::::0;::::1;:::i;:::-;;;;42651:469;;;;42514:613:::0;:::o;39878:299::-;5270:10;39995:4;40089:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;40089:34:0;;;;;;;;;;39995:4;;40017:130;;40067:7;;40089:47;;40125:10;;40089:47;:::i;46239:862::-;5672:13;:11;:13::i;:::-;46465:11:::1;::::0;46480:6:::1;::::0;46465:11:::1;-1:-1:-1::0;;;46465:11:0;::::1;::::0;::::1;::::0;::::1;46449:13:::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;46430:16:0;::::1;::::0;::::1;::::0;46392:35:::1;::::0;-1:-1:-1;;;46411:16:0;;::::1;;46392::::0;:35:::1;:::i;:::-;:54;;;;:::i;:::-;:70;;;;:::i;:::-;:84;;;;:::i;:::-;:94;;;;46370:165;;;;-1:-1:-1::0;;;46370:165:0::1;;;;;;;:::i;:::-;46637:10;::::0;46651:6:::1;::::0;46637:10:::1;-1:-1:-1::0;;;46637:10:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;46622:12:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;46604:15:0;::::1;::::0;::::1;::::0;46568:33:::1;::::0;-1:-1:-1;;;46586:15:0;;::::1;;46568::::0;:33:::1;:::i;:::-;:51;;;;:::i;:::-;:66;;;;:::i;:::-;:79;;;;:::i;:::-;:89;;;;46546:159;;;;-1:-1:-1::0;;;46546:159:0::1;;;;;;;:::i;:::-;46743:6;46724:16;:25;;;;46716:53;;;;-1:-1:-1::0;;;46716:53:0::1;;;;;;;:::i;:::-;46806:6;46788:15;:24;;;;46780:51;;;;-1:-1:-1::0;;;46780:51:0::1;;;;;;;:::i;:::-;46941:15;::::0;46847:150:::1;::::0;;46941:15:::1;10222::1::0;;;10204:34;;10274:15;;;10269:2;10254:18;;10247:43;-1:-1:-1;;;46941:15:0;::::1;::::0;::::1;10306:18:1::0;;;10299:43;-1:-1:-1;;;46972:14:0;;::::1;::::0;;::::1;10373:2:1::0;10358:18;;10351:43;46847:150:0;::::1;::::0;;;;10164:3:1;46847:150:0;;::::1;47008:15;:34:::0;;-1:-1:-1;;;;47053:32:0;-1:-1:-1;;;47008:34:0::1;::::0;;::::1;;-1:-1:-1::0;;;;47053:32:0;;-1:-1:-1;;;47053:32:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;46239:862::o;40798:879::-;40918:7;40962;;40951;:18;;40943:62;;;;-1:-1:-1;;;40943:62:0;;10607:2:1;40943:62:0;;;10589:21:1;10646:2;10626:18;;;10619:30;10685:33;10665:18;;;10658:61;10736:18;;40943:62:0;10405:355:1;40943:62:0;41016:19;41038:10;:8;:10::i;:::-;41016:32;;41064:17;41059:611;;41110:15;41128:19;41136:11;41128:7;:19;:::i;:::-;41110:37;-1:-1:-1;41162:14:0;;-1:-1:-1;;41162:14:0;41059:611;41239:17;41275:18;41312;41349:17;41385:13;41425:20;41437:7;41425:11;:20::i;:::-;41209:236;;;;;;;;;;41460:23;41546:5;41534:9;41521:10;41508;41496:9;41486:7;:19;;;;:::i;:::-;:32;;;;:::i;:::-;:45;;;;:::i;:::-;:57;;;;:::i;:::-;:65;;;;:::i;:::-;41460:91;-1:-1:-1;41566:23:0;41592:29;41610:11;41460:91;41592:29;:::i;:::-;41566:55;-1:-1:-1;41636:22:0;;-1:-1:-1;;;;;;;;41636:22:0;41059:611;40932:745;40798:879;;;;:::o;47923:701::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;48074:30:0;::::1;48066:70;;;::::0;-1:-1:-1;;;48066:70:0;;10967:2:1;48066:70:0::1;::::0;::::1;10949:21:1::0;11006:2;10986:18;;;10979:30;11045:29;11025:18;;;11018:57;11092:18;;48066:70:0::1;10765:351:1::0;48066:70:0::1;48175:14;::::0;-1:-1:-1;;;;;48175:14:0;;::::1;48155:34:::0;;::::1;::::0;48147:98:::1;;;;-1:-1:-1::0;;;48147:98:0::1;;;;;;;:::i;:::-;48340:15;::::0;48261:120:::1;::::0;;11728:14:1;;11721:22;11703:41;;-1:-1:-1;;;48357:23:0;::::1;;;11787:14:1::0;11780:22;11775:2;11760:18;;11753:50;-1:-1:-1;;;;;48340:15:0;;::::1;::::0;48261:120;::::1;::::0;::::1;::::0;11676:18:1;48261:120:0::1;;;;;;;48392:15;:34:::0;;48437:50;::::1;;-1:-1:-1::0;;;48437:50:0::1;-1:-1:-1::0;;;;;;48437:50:0;;;-1:-1:-1;;;;;48392:34:0;;::::1;48437:50:::0;;;;;;::::1;::::0;;48392:15:::1;48498:35:::0;;;:17:::1;:35;::::0;;;;;;;:42;;-1:-1:-1;;48498:42:0;;::::1;48392:34:::0;48498:42;;::::1;::::0;;;48555:52;;;;;:57;;;;::::1;::::0;;::::1;::::0;;47923:701::o;42010:496::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;42091:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;42090:21;42082:61;;;::::0;-1:-1:-1;;;42082:61:0;;12016:2:1;42082:61:0::1;::::0;::::1;11998:21:1::0;12055:2;12035:18;;;12028:30;12094:29;12074:18;;;12067:57;12141:18;;42082:61:0::1;11814:351:1::0;42082:61:0::1;42176:9;:16:::0;42200:2:::1;::::0;42176:20:::1;::::0;42195:1:::1;42176:20;:::i;:::-;:26;;42154:153;;;::::0;-1:-1:-1;;;42154:153:0;;12372:2:1;42154:153:0::1;::::0;::::1;12354:21:1::0;12411:2;12391:18;;;12384:30;12450:34;12430:18;;;12423:62;12521:34;12501:18;;;12494:62;-1:-1:-1;;;12572:19:1;;;12565:44;12626:19;;42154:153:0::1;12170:481:1::0;42154:153:0::1;-1:-1:-1::0;;;;;42322:16:0;::::1;42341:1;42322:16:::0;;;:7:::1;:16;::::0;;;;;:20;42318:109:::1;;-1:-1:-1::0;;;;;42398:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;42378:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;42359:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;42318:109:::1;-1:-1:-1::0;;;;;42437:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;42437:27:0::1;42460:4;42437:27:::0;;::::1;::::0;;;42475:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;42475:23:0::1;::::0;;::::1;::::0;;42010:496::o;30975:799::-;5672:13;:11;:13::i;:::-;31109:18:::1;:40:::0;;-1:-1:-1;;;;;;31109:40:0::1;-1:-1:-1::0;;;;;31109:40:0;;::::1;::::0;;;::::1;::::0;;;31171:10:::1;::::0;31163:34;;::::1;31171:10:::0;::::1;31163:34;31160:165;;31213:41;31230:4;31237:11:::0;-1:-1:-1;;31213:8:0::1;:41::i;:::-;31269:10;:44:::0;;-1:-1:-1;;;;;;31269:44:0::1;-1:-1:-1::0;;;;;31269:44:0;::::1;;::::0;;31160:165:::1;31365:10;;;;;;;;;-1:-1:-1::0;;;;;31365:10:0::1;-1:-1:-1::0;;;;;31365:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31440:18;::::0;31347:122:::1;::::0;-1:-1:-1;;;31347:122:0;;31420:4:::1;31347:122;::::0;::::1;13124:34:1::0;-1:-1:-1;;;;;31440:18:0;;::::1;13174::1::0;;;13167:43;31347:50:0;::::1;::::0;::::1;::::0;13059:18:1;;31347:122:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31336:8;:133:::0;;-1:-1:-1;;;;;;31336:133:0::1;-1:-1:-1::0;;;;;31336:133:0;;::::1;;::::0;;31505:10:::1;::::0;:17:::1;::::0;;-1:-1:-1;;;31505:17:0;;;;:10;;;::::1;::::0;:15:::1;::::0;:17:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:10;:17:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31483:18;::::0;-1:-1:-1;;;;;31483:18:0;;::::1;:39:::0;::::1;;31480:146;;31597:10;::::0;31557:18:::1;::::0;31550:64:::1;::::0;-1:-1:-1;;;;;31557:18:0;;::::1;::::0;31597:10:::1;-1:-1:-1::0;;31550:38:0::1;:64::i;:::-;31667:10;::::0;31680:8:::1;::::0;31690:18:::1;::::0;31641:68:::1;::::0;;-1:-1:-1;;;;;31667:10:0;;::::1;13461:34:1::0;;31680:8:0;;::::1;13526:2:1::0;13511:18;;13504:43;31690:18:0;::::1;13563::1::0;;;13556:43;31641:68:0;;::::1;::::0;;;;13411:2:1;31641:68:0;;::::1;31749:8;::::0;31720:44:::1;::::0;-1:-1:-1;;;;;31749:8:0::1;::::0;31720:28:::1;:44::i;38710:198::-:0;-1:-1:-1;;;;;38800:20:0;;38776:7;38800:20;;;:11;:20;;;;;;;;38796:49;;;-1:-1:-1;;;;;;38829:16:0;;;;;:7;:16;;;;;;;38710:198::o;38796:49::-;-1:-1:-1;;;;;38883:16:0;;;;;;:7;:16;;;;;;38863:37;;:19;:37::i;5942:103::-;5672:13;:11;:13::i;:::-;6007:30:::1;6034:1;6007:18;:30::i;:::-;5942:103::o:0;49283:322::-;5672:13;:11;:13::i;:::-;49429:1:::1;49407:19;:23;49399:58;;;::::0;-1:-1:-1;;;49399:58:0;;13812:2:1;49399:58:0::1;::::0;::::1;13794:21:1::0;13851:2;13831:18;;;13824:30;-1:-1:-1;;;13870:18:1;;;13863:52;13932:18;;49399:58:0::1;13610:346:1::0;49399:58:0::1;49519:18;::::0;49473:65:::1;::::0;;6376:25:1;;;6432:2;6417:18;;6410:34;;;;49473:65:0::1;::::0;6349:18:1;49473:65:0::1;;;;;;;49549:18;:40:::0;49283:322::o;48632:643::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;48741:29:0;::::1;48733:68;;;::::0;-1:-1:-1;;;48733:68:0;;14163:2:1;48733:68:0::1;::::0;::::1;14145:21:1::0;14202:2;14182:18;;;14175:30;14241:28;14221:18;;;14214:56;14287:18;;48733:68:0::1;13961:350:1::0;48733:68:0::1;48847:4;-1:-1:-1::0;;;;;48820:32:0;::::1;::::0;48812:87:::1;;;::::0;-1:-1:-1;;;48812:87:0;;14518:2:1;48812:87:0::1;::::0;::::1;14500:21:1::0;14557:2;14537:18;;;14530:30;14596:34;14576:18;;;14569:62;-1:-1:-1;;;14647:18:1;;;14640:40;14697:19;;48812:87:0::1;14316:406:1::0;48812:87:0::1;48918:15;::::0;-1:-1:-1;;;;;48918:34:0;;::::1;:15:::0;::::1;:34:::0;48910:98:::1;;;;-1:-1:-1::0;;;48910:98:0::1;;;;;;;:::i;:::-;49075:14;::::0;49024:66:::1;::::0;-1:-1:-1;;;;;49075:14:0;;::::1;::::0;49024:66;::::1;::::0;::::1;::::0;49075:14:::1;::::0;49024:66:::1;49101:14;:32:::0;;-1:-1:-1;;;;;49101:32:0;;::::1;-1:-1:-1::0;;;;;;49101:32:0;;::::1;::::0;::::1;::::0;;:14:::1;49144:34:::0;;;:17:::1;:34;::::0;;;;;;;:41;;-1:-1:-1;;49144:41:0;;::::1;49101:32:::0;49144:41;;::::1;::::0;;;49200:51;;;;;:56;;;;::::1;::::0;;::::1;::::0;;48632:643::o;45397:834::-;5672:13;:11;:13::i;:::-;45617:11:::1;::::0;45632:6:::1;::::0;45617:11:::1;-1:-1:-1::0;;;45617:11:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;45599:15:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;45580:16:0;::::1;::::0;::::1;::::0;45544:33:::1;::::0;-1:-1:-1;;;45561:16:0;;::::1;;45544:14:::0;:33:::1;:::i;:::-;:52;;;;:::i;:::-;:70;;;;:::i;:::-;:84;;;;:::i;:::-;:94;;;;45522:165;;;;-1:-1:-1::0;;;45522:165:0::1;;;;;;;:::i;:::-;45789:10;::::0;45803:6:::1;::::0;45789:10:::1;-1:-1:-1::0;;;45789:10:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;45772:14:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;45754:15:0;::::1;::::0;::::1;::::0;45720:31:::1;::::0;-1:-1:-1;;;45736:15:0;;::::1;;45720:13:::0;:31:::1;:::i;:::-;:49;;;;:::i;:::-;:66;;;;:::i;:::-;:79;;;;:::i;:::-;:89;;;;45698:159;;;;-1:-1:-1::0;;;45698:159:0::1;;;;;;;:::i;:::-;45893:6;45876:14;:23;;;;45868:51;;;;-1:-1:-1::0;;;45868:51:0::1;;;;;;;:::i;:::-;45954:6;45938:13;:22;;;;45930:49;;;;-1:-1:-1::0;;;45930:49:0::1;;;;;;;:::i;:::-;46083:13;::::0;45995:140:::1;::::0;;46083:13:::1;10222:15:1::0;;;10204:34;;10274:15;;;10269:2;10254:18;;10247:43;46083:13:0::1;::::0;::::1;::::0;::::1;10306:18:1::0;;;10299:43;-1:-1:-1;;;46112:12:0;;::::1;::::0;;::::1;10373:2:1::0;10358:18;;10351:43;45995:140:0;::::1;::::0;;;;10164:3:1;45995:140:0;;::::1;46146:13;:30:::0;;-1:-1:-1;;46187:28:0;46146:30:::1;;::::0;;::::1;;-1:-1:-1::0;;46187:28:0;;-1:-1:-1;;;46187:28:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;45397:834::o;60508:207::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;60583:22:0;::::1;60591:4;60583:22:::0;60575:46:::1;;;::::0;-1:-1:-1;;;60575:46:0;;14929:2:1;60575:46:0::1;::::0;::::1;14911:21:1::0;14968:2;14948:18;;;14941:30;-1:-1:-1;;;14987:18:1;;;14980:41;15038:18;;60575:46:0::1;14727:335:1::0;60575:46:0::1;60632:75;60659:7;5757::::0;5784:6;-1:-1:-1;;;;;5784:6:0;;5711:87;60659:7:::1;60668:38;::::0;-1:-1:-1;;;60668:38:0;;60700:4:::1;60668:38;::::0;::::1;4179:51:1::0;-1:-1:-1;;;;;60668:23:0;::::1;::::0;::::1;::::0;4152:18:1;;60668:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;60632:26:0;::::1;::::0;:75;:26:::1;:75::i;:::-;60508:207:::0;:::o;58485:1827::-;58560:16;;;58574:1;58560:16;;;;;;;;58536:21;;58560:16;;;;;;;;-1:-1:-1;;58597:18:0;;58587:7;;;;-1:-1:-1;;;;;;58597:18:0;;58587:7;;-1:-1:-1;58597:18:0;;58587:7;;;;:::i;:::-;;;;;;:28;-1:-1:-1;;;;;58587:28:0;;;-1:-1:-1;;;;;58587:28:0;;;;;58644:4;58626;58631:1;58626:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;58626:23:0;;;:7;;;;;;;;;;:23;;;;58685:10;;:17;;;-1:-1:-1;;;58685:17:0;;;;:10;;;;;:15;;:17;;;;;58626:7;;58685:17;;;;;:10;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;58674:28:0;:4;58679:1;58674:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;58674:28:0;;58670:753;;58718:10;;58892:14;;58718:237;;-1:-1:-1;;;58718:237:0;;-1:-1:-1;;;;;58718:10:0;;;;:61;;58786:9;;58718:237;;:10;;58869:4;;58892:14;;;58925:15;;58718:237;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58670:753;;;59010:18;;58986:14;;-1:-1:-1;;;;;59010:18:0;59003:36;5270:10;59003:50;;-1:-1:-1;;;;;;59003:50:0;;;;;;;-1:-1:-1;;;;;4197:32:1;;;59003:50:0;;;4179:51:1;4152:18;;59003:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58986:67;-1:-1:-1;59068:80:0;5270:10;59075:18;;-1:-1:-1;;;;;59075:18:0;;59134:4;59141:6;59068:43;:80::i;:::-;59163:10;;59348:14;;59163:248;;-1:-1:-1;;;59163:248:0;;-1:-1:-1;;;;;59163:10:0;;;;:64;;:248;;59246:6;;59163:10;;59325:4;;59348:14;;;59381:15;;59163:248;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58971:452;58670:753;59489:14;;-1:-1:-1;;;;;59489:14:0;59477:27;;;;:11;:27;;;;;;;;59474:812;;;59552:14;;-1:-1:-1;;;;;59552:14:0;59544:23;;;;:7;:23;;;;;;59534:7;;:33;;59544:23;59534:33;:::i;:::-;59524:7;:43;59614:14;;-1:-1:-1;;;;;59614:14:0;59606:23;;;;:7;:23;;;;;;59596:7;;:33;;59606:23;59596:33;:::i;:::-;59586:7;:43;59659:14;;-1:-1:-1;;;;;59659:14:0;59677:1;59651:23;;;:7;:23;;;;;;:27;59648:119;;59715:14;;-1:-1:-1;;;;;59715:14:0;59739:1;59743:23;;;:7;:23;;;;;;;;;59706:61;;1659:25:1;;;59739:1:0;;59715:14;-1:-1:-1;;;;;;;;;;;59706:61:0;1632:18:1;59706:61:0;;;;;;;59648:119;59794:14;;;-1:-1:-1;;;;;59794:14:0;;;59812:1;59786:23;;;:7;:23;;;;;;;;:27;;;59840:14;;;;;59832:23;;:7;:23;;;;;;:27;60508:207;:::o;59474:812::-;59949:14;;-1:-1:-1;;;;;59949:14:0;59904;59941:23;;;:7;:23;;;;;;59921:44;;:19;:44::i;:::-;59904:61;;60004:6;59994:7;;:16;;;;:::i;:::-;59984:7;:26;60057:14;;-1:-1:-1;;;;;60057:14:0;60049:23;;;;:7;:23;;;;;;60039:7;;:33;;60049:23;60039:33;:::i;:::-;60029:7;:43;60094:10;;60091:85;;60141:14;;60132:44;;1659:25:1;;;60165:1:0;;-1:-1:-1;;;;;60141:14:0;;-1:-1:-1;;;;;;;;;;;60132:44:0;1647:2:1;1632:18;60132:44:0;;;;;;;60091:85;-1:-1:-1;60203:14:0;;;-1:-1:-1;;;;;60203:14:0;;;60221:1;60195:23;;;:7;:23;;;;;;;;:27;;;60249:14;;;;;60241:23;;:7;:23;;;;;;:27;58525:1787;58485:1827::o;38415:89::-;38456:13;38489:7;38482:14;;;;;:::i;49613:163::-;5672:13;:11;:13::i;:::-;49727:41:::1;49756:4;49762:5;49727:28;:41::i;40185:341::-:0;5270:10;40307:4;40401:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;40401:34:0;;;;;;;;;;40307:4;;40329:167;;40379:7;;40401:84;;40455:15;;40401:84;:::i;38916:201::-;39023:4;39045:42;5270:10;39069:9;39080:6;39045:9;:42::i;34695:366::-;5672:13;:11;:13::i;:::-;34856:5:::1;34846:7;;:15;;;;:::i;:::-;34823:21;:38;;34815:94;;;::::0;-1:-1:-1;;;34815:94:0;;17158:2:1;34815:94:0::1;::::0;::::1;17140:21:1::0;17197:2;17177:18;;;17170:30;17236:34;17216:18;;;17209:62;-1:-1:-1;;;17287:18:1;;;17280:41;17338:19;;34815:94:0::1;16956:407:1::0;34815:94:0::1;34977:20;::::0;34927:71:::1;::::0;;6376:25:1;;;6432:2;6417:18;;6410:34;;;;34927:71:0::1;::::0;6349:18:1;34927:71:0::1;;;;;;;35009:20;:44:::0;34695:366::o;43634:874::-;5672:13;:11;:13::i;:::-;43863:11:::1;::::0;43878:6:::1;::::0;43863:11:::1;-1:-1:-1::0;;;43863:11:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;43845:15:0;::::1;::::0;::::1;::::0;43863:11:::1;43829:13:::0;::::1;::::0;::::1;::::0;43790:36:::1;::::0;-1:-1:-1;;;43810:16:0;;::::1;;43790:17:::0;:36:::1;:::i;:::-;:52;;;;:::i;:::-;:70;;;;:::i;:::-;:84;;;;:::i;:::-;:94;;;;43768:165;;;;-1:-1:-1::0;;;43768:165:0::1;;;;;;;:::i;:::-;44035:10;::::0;44049:6:::1;::::0;44035:10:::1;-1:-1:-1::0;;;44035:10:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;44018:14:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;44003:12:0;::::1;::::0;::::1;::::0;43966:34:::1;::::0;-1:-1:-1;;;43985:15:0;;::::1;;43966:16:::0;:34:::1;:::i;:::-;:49;;;;:::i;:::-;:66;;;;:::i;:::-;:79;;;;:::i;:::-;:89;;;;43944:159;;;;-1:-1:-1::0;;;43944:159:0::1;;;;;;;:::i;:::-;44142:6;44122:17;:26;;;;44114:54;;;;-1:-1:-1::0;;;44114:54:0::1;;;;;;;:::i;:::-;44206:6;44187:16;:25;;;;44179:52;;;;-1:-1:-1::0;;;44179:52:0::1;;;;;;;:::i;:::-;44343:16;::::0;44247:153:::1;::::0;;44343:16:::1;10222:15:1::0;;;10204:34;;10274:15;;;10269:2;10254:18;;10247:43;-1:-1:-1;;;44343:16:0;::::1;::::0;::::1;10306:18:1::0;;;10299:43;-1:-1:-1;;;44374:15:0;;::::1;::::0;;::::1;10373:2:1::0;10358:18;;10351:43;44247:153:0;::::1;::::0;;;;10164:3:1;44247:153:0;;::::1;44411:16;:36:::0;;-1:-1:-1;;44458:34:0;-1:-1:-1;;;44411:36:0::1;::::0;;::::1;;-1:-1:-1::0;;;;44458:34:0;;-1:-1:-1;;;44458:34:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;43634:874::o;47109:806::-;5672:13;:11;:13::i;:::-;47321::::1;::::0;47338:6:::1;::::0;47321:13:::1;;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;47303:15:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;47284:16:0;::::1;::::0;::::1;::::0;47250:31:::1;::::0;-1:-1:-1;;;47265:16:0;;::::1;;47250:12:::0;:31:::1;:::i;:::-;:50;;;;:::i;:::-;:68;;;;:::i;:::-;:84;;;;:::i;:::-;:94;;;;47228:165;;;;-1:-1:-1::0;;;47228:165:0::1;;;;;;;:::i;:::-;47493:12;::::0;47509:6:::1;::::0;47493:12:::1;-1:-1:-1::0;;;47493:12:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;47476:14:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;47458:15:0;::::1;::::0;::::1;::::0;47426:29:::1;::::0;-1:-1:-1;;;47440:15:0;;::::1;;47426:11:::0;:29:::1;:::i;:::-;:47;;;;:::i;:::-;:64;;;;:::i;:::-;:79;;;;:::i;:::-;:89;;;;47404:159;;;;-1:-1:-1::0;;;47404:159:0::1;;;;;;;:::i;:::-;47597:6;47582:12;:21;;;;47574:49;;;;-1:-1:-1::0;;;47574:49:0::1;;;;;;;:::i;:::-;47656:6;47642:11;:20;;;;47634:47;;;;-1:-1:-1::0;;;47634:47:0::1;;;;;;;:::i;:::-;47779:11;::::0;47697:130:::1;::::0;;47779:11:::1;10222:15:1::0;;;10204:34;;10274:15;;;10269:2;10254:18;;10247:43;-1:-1:-1;;;47779:11:0;::::1;::::0;::::1;10306:18:1::0;;;10299:43;-1:-1:-1;;;47806:10:0;;::::1;::::0;;::::1;10373:2:1::0;10358:18;;10351:43;47697:130:0;::::1;::::0;;;;10164:3:1;47697:130:0;;::::1;47838:11;:26:::0;;-1:-1:-1;;;;47875:24:0;-1:-1:-1;;;47838:26:0::1;::::0;;::::1;;-1:-1:-1::0;;;;47875:24:0;;-1:-1:-1;;;47875:24:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;47109:806::o;50278:234::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;50368:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;:34;::::1;;:26;::::0;;::::1;:34;;::::0;50360:54:::1;;;::::0;-1:-1:-1;;;50360:54:0;;6790:2:1;50360:54:0::1;::::0;::::1;6772:21:1::0;6829:1;6809:18;;;6802:29;-1:-1:-1;;;6847:18:1;;;6840:37;6894:18;;50360:54:0::1;6588:330:1::0;50360:54:0::1;-1:-1:-1::0;;;;;50425:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;;;;:33;;-1:-1:-1;;50425:33:0::1;::::0;::::1;;::::0;;::::1;::::0;;;50474:30;;1266:41:1;;;50474:30:0::1;::::0;1239:18:1;50474:30:0::1;1126:187:1::0;60318:184:0;5672:13;:11;:13::i;:::-;60372:12:::1;5784:6:::0;;60388:55:::1;::::0;-1:-1:-1;;;;;5784:6:0;;;;60417:21:::1;::::0;60372:12;60388:55;60372:12;60388:55;60417:21;5784:6;60388:55:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60371:72;;;60462:7;60454:40;;;::::0;-1:-1:-1;;;60454:40:0;;17780:2:1;60454:40:0::1;::::0;::::1;17762:21:1::0;17819:2;17799:18;;;17792:30;-1:-1:-1;;;17838:18:1;;;17831:50;17898:18;;60454:40:0::1;17578:344:1::0;44516:873:0;5672:13;:11;:13::i;:::-;44745:11:::1;::::0;44760:6:::1;::::0;44745:11:::1;-1:-1:-1::0;;;44745:11:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;44727:15:0;::::1;::::0;::::1;::::0;44745:11:::1;44711:13:::0;::::1;::::0;::::1;::::0;44672:36:::1;::::0;-1:-1:-1;;;44692:16:0;;::::1;;44672:17:::0;:36:::1;:::i;:::-;:52;;;;:::i;:::-;:70;;;;:::i;:::-;:84;;;;:::i;:::-;:94;;;;44650:165;;;;-1:-1:-1::0;;;44650:165:0::1;;;;;;;:::i;:::-;44916:10;::::0;44930:6:::1;::::0;44916:10:::1;-1:-1:-1::0;;;44916:10:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;44899:14:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;44884:12:0;::::1;::::0;::::1;::::0;44848:34:::1;::::0;-1:-1:-1;;;44867:15:0;;::::1;;44848:16:::0;:34:::1;:::i;:::-;:48;;;;:::i;:::-;:65;;;;:::i;:::-;:78;;;;:::i;:::-;:88;;;;44826:158;;;;-1:-1:-1::0;;;44826:158:0::1;;;;;;;:::i;:::-;45023:6;45003:17;:26;;;;44995:54;;;;-1:-1:-1::0;;;44995:54:0::1;;;;;;;:::i;:::-;45087:6;45068:16;:25;;;;45060:52;;;;-1:-1:-1::0;;;45060:52:0::1;;;;;;;:::i;:::-;45224:16;::::0;45128:153:::1;::::0;;45224:16:::1;10222:15:1::0;;;10204:34;;10274:15;;;10269:2;10254:18;;10247:43;-1:-1:-1;;;45224:16:0;::::1;::::0;::::1;10306:18:1::0;;;10299:43;-1:-1:-1;;;45255:15:0;;::::1;::::0;;::::1;10373:2:1::0;10358:18;;10351:43;45128:153:0;::::1;::::0;;;;10164:3:1;45128:153:0;;::::1;45292:16;:36:::0;;-1:-1:-1;;;;45339:34:0;-1:-1:-1;;;45292:36:0::1;::::0;;::::1;;-1:-1:-1::0;;;;45339:34:0;;-1:-1:-1;;;45339:34:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;44516:873::o;6051:201::-;5672:13;:11;:13::i;:::-;-1:-1:-1;;;;;6140:22:0;::::1;6132:73;;;::::0;-1:-1:-1;;;6132:73:0;;18129:2:1;6132:73:0::1;::::0;::::1;18111:21:1::0;18168:2;18148:18;;;18141:30;18207:34;18187:18;;;18180:62;-1:-1:-1;;;18258:18:1;;;18251:36;18304:19;;6132:73:0::1;17927:402:1::0;6132:73:0::1;6216:28;6235:8;6216:18;:28::i;43135:371::-:0;-1:-1:-1;;;;;43262:19:0;;43254:68;;;;-1:-1:-1;;;43254:68:0;;18536:2:1;43254:68:0;;;18518:21:1;18575:2;18555:18;;;18548:30;18614:34;18594:18;;;18587:62;-1:-1:-1;;;18665:18:1;;;18658:34;18709:19;;43254:68:0;18334:400:1;43254:68:0;-1:-1:-1;;;;;43341:21:0;;43333:68;;;;-1:-1:-1;;;43333:68:0;;18941:2:1;43333:68:0;;;18923:21:1;18980:2;18960:18;;;18953:30;19019:34;18999:18;;;18992:62;-1:-1:-1;;;19070:18:1;;;19063:32;19112:19;;43333:68:0;18739:398:1;43333:68:0;-1:-1:-1;;;;;43414:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;43466:32;;1659:25:1;;;43466:32:0;;1632:18:1;43466:32:0;;;;;;;43135:371;;;:::o;5804:132::-;5757:7;5784:6;-1:-1:-1;;;;;5784:6:0;5270:10;5868:23;5860:68;;;;-1:-1:-1;;;5860:68:0;;19344:2:1;5860:68:0;;;19326:21:1;;;19363:18;;;19356:30;19422:34;19402:18;;;19395:62;19474:18;;5860:68:0;19142:356:1;50851:2282:0;-1:-1:-1;;;;;50973:18:0;;50965:68;;;;-1:-1:-1;;;50965:68:0;;19705:2:1;50965:68:0;;;19687:21:1;19744:2;19724:18;;;19717:30;19783:34;19763:18;;;19756:62;-1:-1:-1;;;19834:18:1;;;19827:35;19879:19;;50965:68:0;19503:401:1;50965:68:0;-1:-1:-1;;;;;51052:16:0;;51044:64;;;;-1:-1:-1;;;51044:64:0;;20111:2:1;51044:64:0;;;20093:21:1;20150:2;20130:18;;;20123:30;20189:34;20169:18;;;20162:62;-1:-1:-1;;;20240:18:1;;;20233:33;20283:19;;51044:64:0;19909:399:1;51044:64:0;51127:28;51158:24;51176:4;51158:9;:24::i;:::-;51127:55;;51203:24;51252:19;;51230;;:41;;;;:::i;:::-;51203:68;;51282:28;51346:18;;51313:16;:51;;:95;;;;;51388:20;51368:16;:40;;51313:95;51461:16;;51282:126;;-1:-1:-1;51461:16:0;;51460:17;:57;;;;;51494:23;51460:57;:97;;;;-1:-1:-1;51544:8:0;;51556:1;;51534:19;;-1:-1:-1;;;;;51544:8:0;51534:9;:19::i;:::-;:23;51460:97;:143;;;;-1:-1:-1;;;;;;51574:29:0;;;;;;:25;:29;;;;;;;;51460:143;51442:209;;;51630:9;:7;:9::i;:::-;51661:14;36773:10;;;36752:18;:31;36818:13;;;36794:21;:37;36866:13;;;36842:21;:37;36913:12;;;36890:20;:35;36955:8;;;36936:16;:27;-1:-1:-1;36976:12:0;;;;36999:16;;;;37026:17;;;;37054:14;;;;37079:17;36709:395;51661:14;51791:16;;;;51790:17;:58;;;;-1:-1:-1;;;;;;51825:23:0;;;;;;:17;:23;;;;;;;;51824:24;51790:58;:97;;;;-1:-1:-1;;;;;;51866:21:0;;;;;;:17;:21;;;;;;;;51865:22;51790:97;51772:786;;;-1:-1:-1;;;;;51938:31:0;;;;;;:25;:31;;;;;;;;51934:613;;;52003:12;;;-1:-1:-1;;;52003:12:0;;;;51990:10;:25;-1:-1:-1;;;52050:15:0;;;;52034:13;:31;-1:-1:-1;;;52100:15:0;;;;52084:13;:31;-1:-1:-1;;;52149:14:0;;;;52134:12;:29;-1:-1:-1;;;52193:10:0;;;;52182:8;:21;51934:613;;;-1:-1:-1;;;;;52263:29:0;;;;;;:25;:29;;;;;;;;52259:288;;;52326:13;;;;;;;;52313:10;:26;-1:-1:-1;;;52374:16:0;;;;52358:13;:32;-1:-1:-1;;;52425:16:0;;;;52409:13;:32;-1:-1:-1;;;52475:15:0;;;;;52460:30;-1:-1:-1;;;52520:11:0;;;;52509:8;:22;52259:288;52568:32;52583:4;52589:2;52593:6;52568:14;:32::i;:::-;52611:15;37167:16;;37156:8;:27;37209:20;;37194:12;:35;37253:18;;37240:10;:31;37298:21;;37282:13;:37;37346:21;;37330:13;:37;37112:263;52611:15;52642:16;;;;52637:489;;-1:-1:-1;;;;;52680:40:0;;;;;;:34;:40;;;;;;;;52675:215;;52781:20;;52771:6;:30;;52741:133;;;;-1:-1:-1;;;52741:133:0;;20515:2:1;52741:133:0;;;20497:21:1;20554:2;20534:18;;;20527:30;20593:31;20573:18;;;20566:59;20642:18;;52741:133:0;20313:353:1;52741:133:0;-1:-1:-1;;;;;52909:38:0;;;;;;:34;:38;;;;;;;;52904:211;;53015:9;;52998:13;53008:2;52998:9;:13::i;:::-;:26;;52968:131;;;;-1:-1:-1;;;52968:131:0;;20873:2:1;52968:131:0;;;20855:21:1;20912:2;20892:18;;;20885:30;20951:33;20931:18;;;20924:61;21002:18;;52968:131:0;20671:355:1;52968:131:0;50954:2179;;;50851:2282;;;:::o;35944:159::-;35986:7;36007:15;36024;36043:19;:17;:19::i;:::-;36006:56;;-1:-1:-1;36006:56:0;-1:-1:-1;36080:15:0;36006:56;;36080:15;:::i;:::-;36073:22;;;;35944:159;:::o;35245:691::-;35346:7;35368;35390;35412;35434;35469:17;35489:27;35508:7;35489:18;:27::i;:::-;35469:47;;35527:18;35548:30;35570:7;35548:21;:30::i;:::-;35527:51;;35589:18;35610:30;35632:7;35610:21;:30::i;:::-;35589:51;;35651:17;35671:29;35692:7;35671:20;:29::i;:::-;35651:49;;35711:13;35727:25;35744:7;35727:16;:25::i;:::-;35876:9;;35887:10;;-1:-1:-1;35899:10:0;;-1:-1:-1;35899:10:0;-1:-1:-1;35876:9:0;;-1:-1:-1;35245:691:0;-1:-1:-1;;;35245:691:0:o;7270:582::-;7600:10;;;7599:62;;-1:-1:-1;7616:39:0;;-1:-1:-1;;;7616:39:0;;7640:4;7616:39;;;13124:34:1;-1:-1:-1;;;;;13194:15:1;;;13174:18;;;13167:43;7616:15:0;;;;;13059:18:1;;7616:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;7599:62;7577:166;;;;-1:-1:-1;;;7577:166:0;;21233:2:1;7577:166:0;;;21215:21:1;21272:2;21252:18;;;21245:30;21311:34;21291:18;;;21284:62;-1:-1:-1;;;21362:18:1;;;21355:52;21424:19;;7577:166:0;21031:418:1;7577:166:0;7781:62;;-1:-1:-1;;;;;21646:32:1;;7781:62:0;;;21628:51:1;21695:18;;;21688:34;;;7754:90:0;;7774:5;;-1:-1:-1;;;7804:22:0;21601:18:1;;7781:62:0;;;;-1:-1:-1;;7781:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;7781:62:0;-1:-1:-1;;;;;;7781:62:0;;;;;;;;;;7754:19;:90::i;:::-;7270:582;;;:::o;49784:484::-;-1:-1:-1;;;;;49889:31:0;;;;;;:25;:31;;;;;;:40;;;:31;;;;:40;;;49867:146;;;;-1:-1:-1;;;49867:146:0;;21935:2:1;49867:146:0;;;21917:21:1;21974:2;21954:18;;;21947:30;22013:34;21993:18;;;21986:62;22084:26;22064:18;;;22057:54;22128:19;;49867:146:0;21733:420:1;49867:146:0;-1:-1:-1;;;;;50024:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;50024:39:0;;;;;;;;;;;;50074:71;;50085:23;50103:4;50085:17;:23::i;:::-;50074:71;;;50124:21;50140:4;50124:15;:21::i;:::-;-1:-1:-1;;;;;50156:40:0;;;;;;:34;:40;;;;;;;;:48;;-1:-1:-1;;50156:48:0;;;;;;;;;;50220:40;;1266:41:1;;;50220:40:0;;1239:18:1;50220:40:0;1126:187:1;6258:191:0;6332:16;6351:6;;-1:-1:-1;;;;;6368:17:0;;;-1:-1:-1;;;;;;6368:17:0;;;;;;6401:40;;6351:6;;;;;;;6401:40;;6332:16;6401:40;6321:128;6258:191;:::o;6876:177::-;6986:58;;-1:-1:-1;;;;;21646:32:1;;6986:58:0;;;21628:51:1;21695:18;;;21688:34;;;6959:86:0;;6979:5;;-1:-1:-1;;;7009:23:0;21601:18:1;;6986:58:0;21454:274:1;7059:205:0;7187:68;;-1:-1:-1;;;;;22416:15:1;;;7187:68:0;;;22398:34:1;22468:15;;22448:18;;;22441:43;22500:18;;;22493:34;;;7160:96:0;;7180:5;;-1:-1:-1;;;7210:27:0;22333:18:1;;7187:68:0;22158:375:1;7160:96:0;7059:205;;;;:::o;53141:3703::-;43548:16;:23;;-1:-1:-1;;43548:23:0;43567:4;43548:23;;;53269:19:::1;::::0;43548:16;;53269:23:::1;::::0;53291:1:::1;::::0;53269:23:::1;:::i;:::-;53240:52;;53303:31;53357:10;;;;;;;;;-1:-1:-1::0;;;;;53357:10:0::1;-1:-1:-1::0;;;;;53357:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53337:18;::::0;-1:-1:-1;;;;;53337:18:0;;::::1;:37:::0;::::1;;:128;;53421:18;::::0;53414:51:::1;::::0;-1:-1:-1;;;53414:51:0;;53459:4:::1;53414:51;::::0;::::1;4179::1::0;-1:-1:-1;;;;;53421:18:0;;::::1;::::0;53414:36:::1;::::0;4152:18:1;;53414:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53337:128;;;53377:21;53337:128;53303:162;;53476:29;53516:28:::0;53559:23:::1;;;;;;;;;;;53555:2143;;;53599:21;53662:18;;53640:19;;53621:18;:38;;;;:::i;:::-;:59;;;;:::i;:::-;53599:81:::0;-1:-1:-1;53698:15:0;;53695:74:::1;;53732:37;53755:13;53732:22;:37::i;:::-;53831:10;::::0;:17:::1;::::0;;-1:-1:-1;;;53831:17:0;;;;53784:24:::1;::::0;-1:-1:-1;;;;;53831:10:0::1;::::0;:15:::1;::::0;:17:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:10;:17:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53811:18;::::0;-1:-1:-1;;;;;53811:18:0;;::::1;:37:::0;::::1;;:180;;53923:18;::::0;53916:51:::1;::::0;-1:-1:-1;;;53916:51:0;;53961:4:::1;53916:51;::::0;::::1;4179::1::0;53968:23:0;;-1:-1:-1;;;;;53923:18:0::1;::::0;53916:36:::1;::::0;4152:18:1;;53916:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:75;;;;:::i;:::-;53811:180;;;53851:45;53873:23:::0;53851:21:::1;:45;:::i;:::-;53784:207;;54006:29;54075:13;54055:19;;54038:16;:36;;;;:::i;:::-;:50;;;;:::i;:::-;54006:82:::0;-1:-1:-1;54163:13:0;54127:35:::1;54144:18:::0;54127:16;:35:::1;:::i;:::-;:49;;;;:::i;:::-;54103:73:::0;-1:-1:-1;54103:73:0;54214:40:::1;54233:21:::0;54214:16;:40:::1;:::i;:::-;:64;;;;:::i;:::-;54191:87:::0;-1:-1:-1;54296:23:0;;54293:584:::1;;54362:10;;;;;;;;;-1:-1:-1::0;;;;;54362:10:0::1;-1:-1:-1::0;;;;;54362:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54342:18;::::0;-1:-1:-1;;;;;54342:37:0;;::::1;:18:::0;::::1;:37:::0;54339:516:::1;;54428:15;::::0;54420:63:::1;::::0;54404:12:::1;::::0;-1:-1:-1;;;;;54428:15:0::1;::::0;54457:21;;54404:12;54420:63;54404:12;54420:63;54457:21;54428:15;54420:63:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54403:80;;;54509:7;54506:133;;;54572:43;::::0;;54590:1:::1;6376:25:1::0;;6432:2;6417:18;;6410:34;;;54572:43:0::1;::::0;6349:18:1;54572:43:0::1;;;;;;;54506:133;54380:278;54339:516;;;54725:15;::::0;54692:18:::1;::::0;54685:79:::1;::::0;-1:-1:-1;;;;;54692:18:0;;::::1;::::0;54725:15:::1;54742:21:::0;54685:39:::1;:79::i;:::-;54792:43;::::0;;54810:1:::1;6376:25:1::0;;6432:2;6417:18;;6410:34;;;54792:43:0::1;::::0;6349:18:1;54792:43:0::1;;;;;;;54339:516;53584:1316;;;53555:2143;;;54921:21;54964:18;;54943;:39;;;;:::i;:::-;54921:61:::0;-1:-1:-1;55000:15:0;;54997:74:::1;;55034:37;55057:13;55034:22;:37::i;:::-;55133:10;::::0;:17:::1;::::0;;-1:-1:-1;;;55133:17:0;;;;55086:24:::1;::::0;-1:-1:-1;;;;;55133:10:0::1;::::0;:15:::1;::::0;:17:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:10;:17:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55113:18;::::0;-1:-1:-1;;;;;55113:18:0;;::::1;:37:::0;::::1;;:180;;55225:18;::::0;55218:51:::1;::::0;-1:-1:-1;;;55218:51:0;;55263:4:::1;55218:51;::::0;::::1;4179::1::0;55270:23:0;;-1:-1:-1;;;;;55225:18:0::1;::::0;55218:36:::1;::::0;4152:18:1;;55218:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:75;;;;:::i;:::-;55113:180;;;55153:45;55175:23:::0;55153:21:::1;:45;:::i;:::-;55086:207:::0;-1:-1:-1;55368:13:0;55332:35:::1;55349:18:::0;55086:207;55332:35:::1;:::i;:::-;:49;;;;:::i;:::-;55308:73:::0;-1:-1:-1;55419:40:0::1;55308:73:::0;55419:16;:40:::1;:::i;:::-;55491:19;::::0;55396:63;;-1:-1:-1;55491:21:0;55488:187:::1;;55557:15;::::0;55574:19:::1;::::0;55532:62:::1;::::0;55550:4:::1;::::0;-1:-1:-1;;;;;55557:15:0;;::::1;::::0;55532:9:::1;:62::i;:::-;55636:19;::::0;55618:41:::1;::::0;;6376:25:1;;;55657:1:0::1;6432:2:1::0;6417:18;;6410:34;55618:41:0::1;::::0;6349:18:1;55618:41:0::1;;;;;;;55488:187;54906:792;;53555:2143;55735:1;55714:18;:22;:51;;;;;55764:1;55740:21;:25;55714:51;55710:216;;;55782:55;55795:18;55815:21;55782:12;:55::i;:::-;55857:57;::::0;;6376:25:1;;;6432:2;6417:18;;6410:34;;;55857:57:0::1;::::0;6349:18:1;55857:57:0::1;;;;;;;55710:216;55939:22:::0;;55936:526:::1;;56000:10;;;;;;;;;-1:-1:-1::0;;;;;56000:10:0::1;-1:-1:-1::0;;;;;56000:15:0::1;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55980:18;::::0;-1:-1:-1;;;;;55980:37:0;;::::1;:18:::0;::::1;:37:::0;55977:467:::1;;56062:14;::::0;56054:61:::1;::::0;56038:12:::1;::::0;-1:-1:-1;;;;;56062:14:0::1;::::0;56090:20;;56038:12;56054:61;56038:12;56054:61;56090:20;56062:14;56054:61:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56037:78;;;56137:7;56134:117;;;56193:38;::::0;1659:25:1;;;56193:38:0::1;::::0;1647:2:1;1632:18;56193:38:0::1;;;;;;;56134:117;56018:248;55977:467;;;56329:14;::::0;56296:18:::1;::::0;56289:77:::1;::::0;-1:-1:-1;;;;;56296:18:0;;::::1;::::0;56329:14:::1;56345:20:::0;56289:39:::1;:77::i;:::-;56390:38;::::0;1659:25:1;;;56390:38:0::1;::::0;1647:2:1;1632:18;56390:38:0::1;;;;;;;55977:467;56494:1;56472:19;:23:::0;;;56506:18:::1;:22:::0;;;56539:19:::1;:23:::0;;;56576:24:::1;56594:4;56576:9;:24::i;:::-;:26;56573:264;;;56638:1;5784:6:::0;-1:-1:-1;;;;;5784:6:0;56621:19;56618:205:::1;;56659:59;56677:4;56684:7;5757::::0;5784:6;-1:-1:-1;;;;;5784:6:0;;5711:87;56684:7:::1;56693:24;56711:4;56693:9;:24::i;:::-;56659:9;:59::i;:::-;56618:205;;;56782:14;::::0;56757:66:::1;::::0;56775:4:::1;::::0;-1:-1:-1;;;;;56782:14:0::1;56798:24;56775:4:::0;56798:9:::1;:24::i;56757:66::-;-1:-1:-1::0;;43594:16:0;:24;;-1:-1:-1;;43594:24:0;;;-1:-1:-1;;53141:3703:0:o;31783:2652::-;31978:17;32010:18;32043;32076:17;32108:13;32135:19;32147:6;32135:11;:19::i;:::-;31911:243;;;;;;;;;;32165:23;32250:5;32238:9;32225:10;32212;32200:9;32191:6;:18;;;;:::i;:::-;:31;;;;:::i;:::-;:44;;;;:::i;:::-;:56;;;;:::i;:::-;:64;;;;:::i;:::-;32165:90;;32266:19;32288:10;:8;:10::i;:::-;32266:32;;32364:5;32354:7;;:15;;;;:::i;:::-;32344:7;:25;32404:17;32410:11;32404:5;:17;:::i;:::-;32394:7;;:27;;;;:::i;:::-;32384:7;:37;32439:9;;32436:71;;32472:35;;1659:25:1;;;32497:1:0;;-1:-1:-1;;;;;32472:35:0;;;-1:-1:-1;;;;;;;;;;;32472:35:0;1647:2:1;1632:18;32472:35:0;;;;;;;32436:71;32675:10;32655:19;;:30;;;;:::i;:::-;32633:19;:52;32722:19;;:30;;32742:10;;32722:30;:::i;:::-;32700:19;:52;32788:18;;:28;;32807:9;;32788:28;:::i;:::-;32767:18;:49;32831:17;32873:9;32851:21;32862:10;32851;:21;:::i;:::-;:31;;;;:::i;:::-;32831:51;-1:-1:-1;32945:23:0;32957:11;32831:51;32945:23;:::i;:::-;32938:4;32922:22;;;;:7;:22;;;;;;:46;;;;:::i;:::-;32913:4;32897:22;;;;:7;:22;;;;;;;;:71;;;;32987:11;:26;;;;;;32983:106;;;33073:4;33057:22;;;;:7;:22;;;;;;:32;;33080:9;;33057:32;:::i;:::-;33048:4;33032:22;;;;:7;:22;;;;;:57;32983:106;33107:13;;33104:82;;33144:42;;1659:25:1;;;33169:4:0;;-1:-1:-1;;;;;33144:42:0;;;-1:-1:-1;;;;;;;;;;;33144:42:0;1647:2:1;1632:18;33144:42:0;;;;;;;33104:82;-1:-1:-1;;;;;;33212:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;33236:22:0;;;;;;:11;:22;;;;;;;;33235:23;33212:46;33208:1067;;;-1:-1:-1;;;;;33293:15:0;;;;;;:7;:15;;;;;;:22;;33309:6;;33293:22;:::i;:::-;-1:-1:-1;;;;;33275:15:0;;;;;;:7;:15;;;;;:40;33364:18;33371:11;33364:6;:18;:::i;:::-;-1:-1:-1;;;;;33348:15:0;;;;;;:7;:15;;;;;;:34;;;;:::i;:::-;-1:-1:-1;;;;;33330:15:0;;;;;;:7;:15;;;;;:52;33437:27;33453:11;33437:15;:27;:::i;:::-;-1:-1:-1;;;;;33418:18:0;;;;;;:7;:18;;;;;;:46;;;;:::i;:::-;-1:-1:-1;;;;;33397:18:0;;;;;;:7;:18;;;;;:67;33208:1067;;;-1:-1:-1;;;;;33487:19:0;;;;;;:11;:19;;;;;;;;33486:20;:46;;;;-1:-1:-1;;;;;;33510:22:0;;;;;;:11;:22;;;;;;;;33486:46;33482:793;;;33583:18;33590:11;33583:6;:18;:::i;:::-;-1:-1:-1;;;;;33567:15:0;;;;;;:7;:15;;;;;;:34;;;;:::i;:::-;-1:-1:-1;;;;;33549:15:0;;;;;;;:7;:15;;;;;;;;:52;;;;33637:18;;;;;:7;:18;;;;;:34;;33656:15;;33637:34;:::i;:::-;-1:-1:-1;;;;;33616:18:0;;;;;;:7;:18;;;;;:55;33726:27;33742:11;33726:15;:27;:::i;33482:793::-;-1:-1:-1;;;;;33775:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;33798:22:0;;;;;;:11;:22;;;;;;;;33775:45;33771:504;;;-1:-1:-1;;;;;33855:15:0;;;;;;:7;:15;;;;;;:22;;33871:6;;33855:22;:::i;:::-;-1:-1:-1;;;;;33837:15:0;;;;;;:7;:15;;;;;:40;33926:18;33933:11;33926:6;:18;:::i;33771:504::-;34163:18;34170:11;34163:6;:18;:::i;:::-;-1:-1:-1;;;;;34147:15:0;;;;;;:7;:15;;;;;;:34;;;;:::i;:::-;-1:-1:-1;;;;;34129:15:0;;;;;;:7;:15;;;;;:52;34236:27;34252:11;34236:15;:27;:::i;:::-;-1:-1:-1;;;;;34217:18:0;;;;;;:7;:18;;;;;;:46;;;;:::i;:::-;-1:-1:-1;;;;;34196:18:0;;;;;;:7;:18;;;;;:67;33771:504;34285:45;34297:21;34307:11;34297:9;:21;:::i;:::-;34320:9;34285:11;:45::i;:::-;34344:19;;34341:86;;34400:9;-1:-1:-1;;;;;34383:44:0;34392:6;-1:-1:-1;;;;;34383:44:0;-1:-1:-1;;;;;;;;;;;34411:15:0;34383:44;;;;1659:25:1;;1647:2;1632:18;;1513:177;34383:44:0;;;;;;;;34341:86;31900:2535;;;;;;;31783:2652;;;:::o;36111:590::-;36209:7;;36245;;36162;;;;;36263:328;36287:9;:16;36283:20;;36263:328;;;36371:7;36347;:21;36355:9;36365:1;36355:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36355:12:0;36347:21;;;;;;;;;;;;;:31;;:83;;;36423:7;36399;:21;36407:9;36417:1;36407:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36407:12:0;36399:21;;;;;;;;;;;;;:31;36347:83;36325:146;;;36454:7;;36463;;36446:25;;;;;;;36111:590;;:::o;36325:146::-;36504:7;:21;36512:9;36522:1;36512:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36512:12:0;36504:21;;;;;;;;;;;;;36496:29;;:7;:29;:::i;:::-;36486:39;;36558:7;:21;36566:9;36576:1;36566:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;36566:12:0;36558:21;;;;;;;;;;;;;36550:29;;:7;:29;:::i;:::-;36540:39;-1:-1:-1;36305:3:0;;;;:::i;:::-;;;;36263:328;;;;36623:7;;36615;;:15;;;;:::i;:::-;36605:7;:25;36601:56;;;36640:7;;36649;;36632:25;;;;;;36111:590;;:::o;36601:56::-;36676:7;;36685;;-1:-1:-1;36111:590:0;-1:-1:-1;36111:590:0:o;37383:160::-;37477:7;37529:5;37517:10;;37509:7;:18;;;;:::i;:::-;:26;;;;:::i;37551:166::-;37648:7;37703:5;37688:13;;37680:7;:21;;;;:::i;37725:166::-;37822:7;37877:5;37862:13;;37854:7;:21;;;;:::i;37899:164::-;37995:7;38049:5;38035:12;;38027:7;:20;;;;:::i;38071:156::-;38163:7;38213:5;38203:8;;38195:7;:16;;;;:::i;9481:649::-;9905:23;9931:69;9959:4;9931:69;;;;;;;;;;;;;;;;;9939:5;-1:-1:-1;;;;;9931:27:0;;;:69;;;;;:::i;:::-;9905:95;;10019:10;:17;10040:1;10019:22;:56;;;;10056:10;10045:30;;;;;;;;;;;;:::i;:::-;10011:111;;;;-1:-1:-1;;;10011:111:0;;23512:2:1;10011:111:0;;;23494:21:1;23551:2;23531:18;;;23524:30;23590:34;23570:18;;;23563:62;-1:-1:-1;;;23641:18:1;;;23634:40;23691:19;;10011:111:0;23310:406:1;56856:830:0;56952:16;;;56966:1;56952:16;;;;;;;;56928:21;;56952:16;;;;;;;;;;-1:-1:-1;56952:16:0;56928:40;;56997:4;56979;56984:1;56979:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56979:23:0;;;:7;;;;;;;;;:23;57023:18;;57013:7;;57023:18;;;57013:4;;57023:18;;57013:7;;;;;;:::i;:::-;-1:-1:-1;;;;;57013:28:0;;;:7;;;;;;;;;;:28;;;;57067:10;;:17;;;-1:-1:-1;;;57067:17:0;;;;:10;;;;;:15;;:17;;;;;57013:7;;57067:17;;;;;:10;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;57056:28:0;:4;57061:1;57056:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;57056:28:0;;57052:627;;57100:10;;:249;;-1:-1:-1;;;57100:249:0;;-1:-1:-1;;;;;57100:10:0;;;;:61;;:249;;57180:11;;57100:10;;57264:4;;57295;;57319:15;;57100:249;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57052:627;57380:15;;57480:10;;57380:287;;-1:-1:-1;;;57380:287:0;;-1:-1:-1;;;;;57380:15:0;;;;:69;;:287;;57480:10;;;57514:11;;57380:15;;57606:4;;57633:15;;57380:287;;;:::i;57694:783::-;57815:10;;;;;;;;;-1:-1:-1;;;;;57815:10:0;-1:-1:-1;;;;;57815:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57793:18;;-1:-1:-1;;;;;57793:39:0;;;:18;;:39;57789:669;;57848:10;;:289;;-1:-1:-1;;;57848:289:0;;57925:4;57848:289;;;24649:34:1;24699:18;;;24692:34;;;57848:10:0;24742:18:1;;;24735:34;;;24785:18;;;24778:34;58081:6:0;24828:19:1;;;24821:44;58107:15:0;24881:19:1;;;24874:35;-1:-1:-1;;;;;57848:10:0;;;;:26;;57882:15;;24583:19:1;;57848:289:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;42651:469:::1;42514:613:::0;:::o;57789:669::-;58167:10;;58241:18;;58167:279;;-1:-1:-1;;;58167:279:0;;58217:4;58167:279;;;25628:34:1;-1:-1:-1;;;;;58241:18:0;;;25678::1;;;25671:43;25730:18;;;25723:34;;;25773:18;;;25766:34;;;58167:10:0;25816:19:1;;;25809:35;;;25860:19;;;25853:35;58390:6:0;25904:19:1;;;25897:44;58416:15:0;25957:19:1;;;25950:35;58167:10:0;;;:23;;25562:19:1;;58167:279:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35070:167::-;35166:9;35158:7;;:17;;;;:::i;:::-;35148:7;:27;35204:15;;:25;;35220:9;;35204:25;:::i;:::-;35186:15;:43;-1:-1:-1;;35070:167:0:o;933:229::-;1070:12;1102:52;1124:6;1132:4;1138:1;1141:12;1102:21;:52::i;:::-;1095:59;933:229;-1:-1:-1;;;;933:229:0:o;1400:455::-;1570:12;1628:5;1603:21;:30;;1595:81;;;;-1:-1:-1;;;1595:81:0;;26198:2:1;1595:81:0;;;26180:21:1;26237:2;26217:18;;;26210:30;26276:34;26256:18;;;26249:62;-1:-1:-1;;;26327:18:1;;;26320:36;26373:19;;1595:81:0;25996:402:1;1595:81:0;1688:12;1702:23;1729:6;-1:-1:-1;;;;;1729:11:0;1748:5;1755:4;1729:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1687:73;;;;1778:69;1805:6;1813:7;1822:10;1834:12;1778:26;:69::i;:::-;1771:76;1400:455;-1:-1:-1;;;;;;;1400:455:0:o;2949:644::-;3134:12;3163:7;3159:427;;;3191:10;:17;3212:1;3191:22;3187:290;;-1:-1:-1;;;;;380:19:0;;;3401:60;;;;-1:-1:-1;;;3401:60:0;;26897:2:1;3401:60:0;;;26879:21:1;26936:2;26916:18;;;26909:30;26975:31;26955:18;;;26948:59;27024:18;;3401:60:0;26695:353:1;3401:60:0;-1:-1:-1;3498:10:0;3491:17;;3159:427;3541:33;3549:10;3561:12;4071:17;;:21;4067:388;;4303:10;4297:17;4360:15;4347:10;4343:2;4339:19;4332:44;4067:388;4430:12;4423:20;;-1:-1:-1;;;4423:20:0;;;;;;;;:::i;14:250:1:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:396::-;418:2;407:9;400:21;381:4;450:6;444:13;493:6;488:2;477:9;473:18;466:34;509:79;581:6;576:2;565:9;561:18;556:2;548:6;544:15;509:79;:::i;:::-;649:2;628:15;-1:-1:-1;;624:29:1;609:45;;;;656:2;605:54;;269:396;-1:-1:-1;;269:396:1:o;670:131::-;-1:-1:-1;;;;;745:31:1;;735:42;;725:70;;791:1;788;781:12;806:315;874:6;882;935:2;923:9;914:7;910:23;906:32;903:52;;;951:1;948;941:12;903:52;990:9;977:23;1009:31;1034:5;1009:31;:::i;:::-;1059:5;1111:2;1096:18;;;;1083:32;;-1:-1:-1;;;806:315:1:o;1695:180::-;1754:6;1807:2;1795:9;1786:7;1782:23;1778:32;1775:52;;;1823:1;1820;1813:12;1775:52;-1:-1:-1;1846:23:1;;1695:180;-1:-1:-1;1695:180:1:o;1880:456::-;1957:6;1965;1973;2026:2;2014:9;2005:7;2001:23;1997:32;1994:52;;;2042:1;2039;2032:12;1994:52;2081:9;2068:23;2100:31;2125:5;2100:31;:::i;:::-;2150:5;-1:-1:-1;2207:2:1;2192:18;;2179:32;2220:33;2179:32;2220:33;:::i;:::-;1880:456;;2272:7;;-1:-1:-1;;;2326:2:1;2311:18;;;;2298:32;;1880:456::o;2341:118::-;2427:5;2420:13;2413:21;2406:5;2403:32;2393:60;;2449:1;2446;2439:12;2464:382;2529:6;2537;2590:2;2578:9;2569:7;2565:23;2561:32;2558:52;;;2606:1;2603;2596:12;2558:52;2645:9;2632:23;2664:31;2689:5;2664:31;:::i;:::-;2714:5;-1:-1:-1;2771:2:1;2756:18;;2743:32;2784:30;2743:32;2784:30;:::i;:::-;2833:7;2823:17;;;2464:382;;;;;:::o;3040:247::-;3099:6;3152:2;3140:9;3131:7;3127:23;3123:32;3120:52;;;3168:1;3165;3158:12;3120:52;3207:9;3194:23;3226:31;3251:5;3226:31;:::i;3292:161::-;3359:20;;3419:8;3408:20;;3398:31;;3388:59;;3443:1;3440;3433:12;3388:59;3292:161;;;:::o;3458:256::-;3524:6;3532;3585:2;3573:9;3564:7;3560:23;3556:32;3553:52;;;3601:1;3598;3591:12;3553:52;3624:28;3642:9;3624:28;:::i;:::-;3614:38;;3671:37;3704:2;3693:9;3689:18;3671:37;:::i;:::-;3661:47;;3458:256;;;;;:::o;3719:309::-;3784:6;3792;3845:2;3833:9;3824:7;3820:23;3816:32;3813:52;;;3861:1;3858;3851:12;3813:52;3897:9;3884:23;3874:33;;3957:2;3946:9;3942:18;3929:32;3970:28;3992:5;3970:28;:::i;4241:388::-;4309:6;4317;4370:2;4358:9;4349:7;4345:23;4341:32;4338:52;;;4386:1;4383;4376:12;4338:52;4425:9;4412:23;4444:31;4469:5;4444:31;:::i;:::-;4494:5;-1:-1:-1;4551:2:1;4536:18;;4523:32;4564:33;4523:32;4564:33;:::i;5102:380::-;5181:1;5177:12;;;;5224;;;5245:61;;5299:4;5291:6;5287:17;5277:27;;5245:61;5352:2;5344:6;5341:14;5321:18;5318:38;5315:161;;5398:10;5393:3;5389:20;5386:1;5379:31;5433:4;5430:1;5423:15;5461:4;5458:1;5451:15;5315:161;;5102:380;;;:::o;5487:127::-;5548:10;5543:3;5539:20;5536:1;5529:31;5579:4;5576:1;5569:15;5603:4;5600:1;5593:15;5619:217;5659:1;5685;5675:132;;5729:10;5724:3;5720:20;5717:1;5710:31;5764:4;5761:1;5754:15;5792:4;5789:1;5782:15;5675:132;-1:-1:-1;5821:9:1;;5619:217::o;6455:128::-;6522:9;;;6543:11;;;6540:37;;;6557: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:168;7891:9;;;7922;;7939:15;;;7933:22;;7919:37;7909:71;;7960:18;;:::i;7991:125::-;8056:9;;;8077:10;;;8074:36;;;8090:18;;:::i;8121:127::-;8182:10;8177:3;8173:20;8170:1;8163:31;8213:4;8210:1;8203:15;8237:4;8234:1;8227:15;8253:135;8292:3;8313:17;;;8310:43;;8333:18;;:::i;:::-;-1:-1:-1;8380:1:1;8369:13;;8253:135::o;8393:170::-;8460:8;8488:10;;;8500;;;8484:27;;8523:11;;;8520:37;;;8537:18;;:::i;8568:345::-;8770:2;8752:21;;;8809:2;8789:18;;;8782:30;-1:-1:-1;;;8843:2:1;8828:18;;8821:51;8904:2;8889:18;;8568:345::o;8918:344::-;9120:2;9102:21;;;9159:2;9139:18;;;9132:30;-1:-1:-1;;;9193:2:1;9178:18;;9171:50;9253:2;9238:18;;8918:344::o;9267:339::-;9469:2;9451:21;;;9508:2;9488:18;;;9481:30;-1:-1:-1;;;9542:2:1;9527:18;;9520:45;9597:2;9582:18;;9267:339::o;9611:338::-;9813:2;9795:21;;;9852:2;9832:18;;;9825:30;-1:-1:-1;;;9886:2:1;9871:18;;9864:44;9940:2;9925:18;;9611:338::o;11121:415::-;11323:2;11305:21;;;11362:2;11342:18;;;11335:30;11401:34;11396:2;11381:18;;11374:62;-1:-1:-1;;;11467:2:1;11452:18;;11445:49;11526:3;11511:19;;11121:415::o;12656:251::-;12726:6;12779:2;12767:9;12758:7;12754:23;12750:32;12747:52;;;12795:1;12792;12785:12;12747:52;12827:9;12821:16;12846:31;12871:5;12846:31;:::i;15067:184::-;15137:6;15190:2;15178:9;15169:7;15165:23;15161:32;15158:52;;;15206:1;15203;15196:12;15158:52;-1:-1:-1;15229:16:1;;15067:184;-1:-1:-1;15067:184:1:o;15388:461::-;15441:3;15479:5;15473:12;15506:6;15501:3;15494:19;15532:4;15561:2;15556:3;15552:12;15545:19;;15598:2;15591:5;15587:14;15619:1;15629:195;15643:6;15640:1;15637:13;15629:195;;;15708:13;;-1:-1:-1;;;;;15704:39:1;15692:52;;15764:12;;;;15799:15;;;;15740:1;15658:9;15629:195;;;-1:-1:-1;15840:3:1;;15388:461;-1:-1:-1;;;;;15388:461:1:o;15854:510::-;16125:6;16114:9;16107:25;16168:3;16163:2;16152:9;16148:18;16141:31;16088:4;16189:57;16241:3;16230:9;16226:19;16218:6;16189:57;:::i;:::-;-1:-1:-1;;;;;16282:32:1;;;;16277:2;16262:18;;16255:60;-1:-1:-1;16346:2:1;16331:18;16324:34;16181:65;15854:510;-1:-1:-1;;15854:510:1:o;16369:582::-;16668:6;16657:9;16650:25;16711:6;16706:2;16695:9;16691:18;16684:34;16754:3;16749:2;16738:9;16734:18;16727:31;16631:4;16775:57;16827:3;16816:9;16812:19;16804:6;16775:57;:::i;:::-;-1:-1:-1;;;;;16868:32:1;;;;16863:2;16848:18;;16841:60;-1:-1:-1;16932:3:1;16917:19;16910:35;16767:65;16369:582;-1:-1:-1;;;16369:582:1:o;23060:245::-;23127:6;23180:2;23168:9;23159:7;23155:23;23151:32;23148:52;;;23196:1;23193;23186:12;23148:52;23228:9;23222:16;23247:28;23269:5;23247:28;:::i;23721:582::-;24049:1;24045;24040:3;24036:11;24032:19;24024:6;24020:32;24009:9;24002:51;24089:6;24084:2;24073:9;24069:18;24062:34;24132:6;24127:2;24116:9;24112:18;24105:34;24175:3;24170:2;24159:9;24155:18;24148:31;23983:4;24196:57;24248:3;24237:9;24233:19;24225:6;24196:57;:::i;:::-;24188:65;;24290:6;24284:3;24273:9;24269:19;24262:35;23721:582;;;;;;;;:::o;24920:306::-;25008:6;25016;25024;25077:2;25065:9;25056:7;25052:23;25048:32;25045:52;;;25093:1;25090;25083:12;25045:52;25122:9;25116:16;25106:26;;25172:2;25161:9;25157:18;25151:25;25141:35;;25216:2;25205:9;25201:18;25195:25;25185:35;;24920:306;;;;;:::o;26403:287::-;26532:3;26570:6;26564:13;26586:66;26645:6;26640:3;26633:4;26625:6;26621:17;26586:66;:::i;:::-;26668:16;;;;;26403:287;-1:-1:-1;;26403:287:1:o

Swarm Source

ipfs://394381c3913f18d5a2782a2384120dcf856d803aa2e8b1156da8da472c4cc7ac
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.