ETH Price: $3,348.88 (-1.34%)

Token

INUMAKITOGE (TOGE)
 

Overview

Max Total Supply

9,990,600,848.406524394057817105 TOGE

Holders

19

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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

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

Contract Source Code Verified (Exact Match)

Contract Name:
INUMAKITOGE

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/**
                                                                                                                             
                                                                                                                             
     Y5.  .557  .5J   ?P:   YY   ^PPY   JPP~    :?5P55?   ?P:  :55   J5.        YPP55PPY   ~YPPPJ^    .75PP57.   Y55555P:    
    .@@^  7@@@B ^@@   @@7  .@@:  P@@@P P@@@P   !@@!:P@&   &@5.7@@!   @@~        ^~?@@?~^  B@B^:~&@5  ~@@7~~J&G  .@@GJYY?.    
    .@@^  !@&?@@5@&   &@7  .@@.  5@PP@G@G5@P   @@&JJ#@&   &@&B@@5    @@~          .@@.   .@@~   J@&  P@#  ?B&&. .@@BPPG7     
    .@@^  !@& :&@@&   ?@&PP#@P   5@P &@& P@P  Y@&!!!G@&   &@7 .B@B   @@^          :@@.    7@&P5G@&~  .#@BPG&@P  .@@BPPPP:    
     ::    ^.   :^.     :^^:.    .^. .^. .^.  .^     ^.   .^    :^   ::            ::       :~~^.      .^^^:     :^^^^^^     
                                                                                                                             
                                                                                                                             
                                                                                                                             
                                                          .:::^^::..:::::...                                                 
                                                  .~??!^^~!!~~?Y5P5Y?!~~~~~~^..                                              
                                                :P@@@@@@#P55PP55YYB#BGY~^^^^^^^^:..                                          
                                           .~7?P@@@@@@@@@@@@@@@@&&@@@@&BJ7!~~~~~~^::..                                       
                                      ^7P&&@@@@@@@&B&@@&&&@@@@@@&&&###B####B5Y!~~^^:...:.                                    
                                      ^G&&GP@@@@BY?G@@@@@@@@@@@@@@@@@@&BYY5PGBY7!~~~^^^~~:.                                  
                                     5@&GG#@@@&##&@&#&@@@@@&@@&#&&@@&Y7~~~^^~?B@@J^^^:^~~^:.                                 
                                    P@&&@@@@@@@&BPPGG&@@@@@@@@&B?!7JJ^!GP~~^^::~Y5^^~~~~~~^^^:                               
                                  .#@@@@@@@@@&&#&@@@@@&@&&#GGB&#7:^::^!@#^~^^^::::^^^^^~~~!!~~~:.                            
                                !B&&@@@@@@@&&@@@@@@@@&@@@@@&P^^~~^:^^^^#B^^^:~7^^^^^^^^^^^^^^^^~~^.                          
                             .!##5?Y@@@@@@@@@@&&@@@@@@@@@@@5!~^~!^:^^^:BP^^^:^B@5^^^:^^^^^^:^^^~~~!~.                        
                              YGB&@@@&&@@@@@&&@@@@@@@@@@@&?^^^^^7^^^^^:P7^^^^:~&@Y^~^^^^^^^^~!^^~~^..                        
                             P@@@@@@&&@@@@#B@@@@@@@@@#&&GJ~~^^^^!^^^^^^Y^^^^^^:J@&~~!^^^^^^:^JY!^^~!.                        
                            ?@@@@@@@@&@@@YG@@@@@@@#P7~B777~^^^^^^^^^^^~!:!~:^^:~@&!^~^^^^^^^^:7&P~^~!^                       
                           :@@@@@@@@@@@@JG@@@@@@@&~^:!&!?7^^^^^^~^^^^^^^:JP~^^^^@G~~^:^^^^^^^^:!&?!^~^^.                     
                           B@@@&@@@@&@@B5@@@@@5!@@!!^7&!?7^^^^~^~^^^^^^^:7@7:^:J&7!~^^^^^^^^^^^:JJ^!:^~~                     
                          .@@&&#@@@@&@@P@@@@@@!:G@5!~7#!7~^^^~^~^~^^^^^^:7#~::~5!!~^^^^^:^^^^^^^^^:~~^!7:                    
                          7@@&&?B@@@@@@@@@@@@@#5?&&7~!#!~^^^^~^~^~^^^^^^~!~:^^^^^^:^^^^^~^^^^^^^^:^:^^~?~                    
                          P@@&@??@@@@@@@@@@@@@G&&P@&7~B!^~^^~7~~~^:^^^:~~^:^^^^^^^^^::^:~~^:^^^^:~!:::~!:                    
                          !B&#&P#@@#@@@@@@@@@B!?@#&@@JPY:7G~!5~^~^^^^^^~~~^^^^^~~^^^7~:^^~~^:^^^^~!^^~^!.                    
                          :.YBG&@@@B@@@@@@@@&PY~YJY#@@#&^~&#!#?^~^^^^^^!^!^^^^^!~~^:YG:^^~~~^^^^^~!^~~^7                     
                             #GG@@@B@@@@@&@@YP@B!^PPY&&#J~Y&^BB~~^^^^^!~:7~:^:~!!~^^:Y^^^~77^^^^^!~J7:^~                     
                             PBJ&@@##@@&B&@B!.^G&57&Y7?!BYG7~J&7~^^^^^^^:BJ::~JP!!^^:!^^^^!B^^^^~!~5G:^:                     
                             57?P&@@&P&@YG?7!:..!PGGG57!?G&?^!GB?^^^^~~!~BP^^!7B!7~:^?~:^^?@7~^^^7^B&:~.                     
                             ~ ^Y?YB&5G@?7!~~::...:~^~!7~75G!!#Y5!^^^~!!5~!!!7:J7?~:~#~~^!G@77!^!~!&J^~                      
                                ~!???G5@?!:^~?7?7!:..  .::^?J!B&?!~^~~!?7:!~^..7?:~:?&!~~777!?GY7~7: !~                      
                                  ~!Y#7BB:...:...7G55J!^.....^7P&P?!~!^.......^7~~??JG!^~77~!!&@?~   .7.                     
                                   :.BB!P......:. ^7JY!?~~:....:^5#B!!.:^?5P#B5P7!~?5Y~JG77~!~B@#.                           
                                    :G&::..........:::.  .:...... .!~..:::77?!^: .:^?7G@BGB!J!.~P!                           
                                     ~Y7:..................................::::::.:!:5@BY@&^!!                               
                                      Y#!:...........................................&&5@@~ ^                                
                                       :^!:::!!~~...................................B&!^7                                    
                                    :!J?^....^!!!..................:.......::..... 7J.    .....                              
                                 ^?5PB&?......^!^.:^:....................^!~~7... J@&&@@@@@@@@@@@&P?^                        
                              :?5GGP#@@G^:::::?G^:!!7^ ..................^J!^7.  Y@@@@@@@@@@@@&&#GGGG:                       
                             ^?JJ5G&@@@&J^::::^BB7!!!?!^................:Y!::...P@@@@@@@@&##BGPPGPPPP.                       
                           .......~PB##&GP?~^~?:B@B!..^?!:..............!^. .^^&@@@@&#BGGPPPPPGPPPPPY                        
                           ^.......!!JGGBJ@@@@&.7@@@G^........:.........  :7?^:#&B5Y5PPPGGGGPPPPPPPG7                        
                           .~.......!?7G&!#@@@#..G&&@@G~. ....::::...  :7P577JPPY55PGGPPPPPPPPPPPP5Y:                        
                             ^:..... ~!^&Y^@@@7 .^PPPG#&BY~..      .:7G&GJYPPPP5##PPGPPPPPPPPP55J??Y.                        
                              ?7......:.~~.^?!....~?PPPPGB##B57!~!Y#@@GY5PPPP5B@@PPGPPPP55YYJ??777J7                         
                               ##~::..:^^....::.....:YPPPPPPB&@@@@@@P75PPPP5P&@@BGGPP5YJ????J7??77Y:                         
                               .@@5~::^^^^....::......JGPPPPPPPB@&5~7PP5PGB#@@@&PJY5J???7777J?77?YY                          
                           .^:..Y@@@Y~::~&~.:::::::....7PPPPPPPPPGBBPPG&@@@@@@@B~::PP7777?J??JJY5G^                          
                          ~&J.....7&Y!#&@@?.:::::::..:::~J55G#&@@&#GY#@@@@@@@@@P^^:~&5?PG55G#&GPGP.                          
                  .!77JJ5#&@5.....?BJ.~G&B!^^:::::.........:^?PB####BYB@@@@@@@B~:^:.!&&#PGG@&BPG&@&5J7!^^7~^.   

                  
                  
This is a relaunch of original Inumaki, same contract but changed a few functions to facilitate trading.
We will airdrop the previous 37 holders their tokens as per the snapshot.
💵 TOKENS WILL BE PAIRED WITH USDC IN LP POOL

TOKENOMICS
1, 000, 000, 000
Total Supply

2%
Max Wallet

1%
Max TX

Our huge plans call for massive Marketing, so we have a 5% marketing fee.

To keep the token value and liquidity strong we add 2% back to the liquidity pool.
BUY/ SELL TAX - 4%
SLIPPAGE - 4%
TELEGRAM : https://t.me/inumakitogeETH
Web : https://inumakitogeerc.live/
medium : https://medium.com/@inumakitogeeth/toge-inumaki-anime-meme-coin-on-erc-2e2bca174baf
Twitter : https://twitter.com/togeERC
*/
// File: @openzeppelin/contracts/utils/Context.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol

// 
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/security/Pausable.sol

// 
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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

// 
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

// 
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

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

// 
// OpenZeppelin Contracts v4.4.1 (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;



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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

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

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

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol

// 
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

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

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

// 
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}



// 
pragma solidity ^0.8.5;







interface IPancakeFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    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(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

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

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


// pragma solidity >=0.5.0;

interface IPancakePair {
    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 IPancakeRouter01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}



// pragma solidity >=0.6.2;

interface IPancakeRouter02 is IPancakeRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

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

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

    mapping (address => bool) public _isExcludedFromAntiWhale;
    
    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private _isExcluded;
    mapping (address => bool) private _isBlacklisted;
    mapping (address => bool) private _isExcludedFromMaxTxAmount;

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

    address[] private _excluded;
   
    address payable public _externalAddress  = payable(0x1598f474B3b25c48e8D29798fCb6fd5Be303eDa4);
    address payable public _burnAddress      = payable(0x000000000000000000000000000000000000dEaD);
    address payable public autoLiquidityReceiver; 

    string private _name    = "INUMAKITOGE";
    string private _symbol  = "TOGE";
    uint8 private _decimals = 18;
    
    uint256 private constant MAX    = ~uint256(0);
    uint256 private _tTotal         = 10 * 10**9 * 10**_decimals;
    uint256 private _rTotal         = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
    
    uint256 public _burnFee                 = 10;
    uint256 private _previousBurnFee        = _burnFee;

    uint256 public _reflectionFee           = 10;
    uint256 private _previousReflectionFee  = _reflectionFee;

    uint256 public _externalFee             = 10;
    uint256 private _previousExternalFee    = _externalFee;
    
    uint256 public _liquidityFee            = 10;
    uint256 private _previousLiquidityFee   = _liquidityFee;

    uint256 private _totalLiquidityFee      = _externalFee.add(_liquidityFee);
    uint256 private _previousTLiquidityFee  = _totalLiquidityFee;

    IPancakeRouter02 public pancakeRouter;
    address public pancakePair;
    
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled       = true;
    
    uint256 public _maxTxAmountBuy                  = 1000000000 * 10**6 * 10**_decimals;
    uint256 public _maxTxAmountSell                 = 1000000000 * 10**6 * 10**_decimals;
    uint256 public _numTokensSellToAndTransfer      = 10 * 10**6 * 10**_decimals;
    uint256 public _maxTokensPerAddress             = 100 * 10**6 * 10**_decimals;

    address public constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; //USDC ADDRESS

    
    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqiudity
    );
    
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    
    constructor () {
        _rOwned[_msgSender()] = _rTotal; 
        
        IPancakeRouter02 _pancakeRouter = IPancakeRouter02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); //UNISWAP ROUTER ADDRESS
        // IPancakeRouter02 _pancakeRouter = IPancakeRouter02(0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3);
         // Create a pancakeswap pair for this new token
        // pancakePair = IPancakeFactory(_pancakeRouter.factory())
        //     .createPair(address(this), _pancakeRouter.WETH());    
        pancakePair = IPancakeFactory(_pancakeRouter.factory())
            .createPair(address(this), USDC); 
            
        pancakeRouter = _pancakeRouter;
        
        _isExcludedFromFee[owner()]             = true;
        _isExcludedFromFee[address(this)]       = true;
        _isExcludedFromFee[_externalAddress]    = true;
        
        _isExcludedFromMaxTxAmount[owner()]                 = true;
        _isExcludedFromMaxTxAmount[address(this)]           = true;
        _isExcludedFromMaxTxAmount[pancakePair]             = true;
        _isExcludedFromMaxTxAmount[address(_pancakeRouter)] = true;
        _isExcludedFromMaxTxAmount[_burnAddress]            = true;
        
        _isExcludedFromAntiWhale[owner()]                   = true;
        _isExcludedFromAntiWhale[address(this)]             = true;
        _isExcludedFromAntiWhale[pancakePair]               = true;
        _isExcludedFromAntiWhale[address(_pancakeRouter)]   = true;
        _isExcludedFromAntiWhale[_burnAddress]              = true;
        
        _isExcluded[address(0)]     = true;
        _isExcluded[_burnAddress]   = true;

        autoLiquidityReceiver = payable(0xF9d46d6F0A0a662dE6A1C5d417f245da00fb4475);
        
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

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

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

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

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

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

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

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }
    
    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }
    
    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
         return true;
    }
    
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }
    
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }
    
    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }
    
    function totalFeesCollected() public view returns (uint256) {
        return _tFeeTotal;
    }
    
    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,,,) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }
    
    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,,,) = _getValues(tAmount);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,,,) = _getValues(tAmount);
            return rTransferAmount;
        }
    }
    
    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }
    
    function excludeFromReward(address account) public onlyOwner() {
        require(account != 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 'We can not exclude pancakeswap router.');
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }
    
    function includeInReward(address account) external onlyOwner() {
        require(_isExcluded[account], "Account is already excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }
    
    function _burn(address account, uint256 amount) internal {
        if(amount > 0)// No need to burn if collected burn fee is zero
        {
            require(account != address(0), "ERC20: burn from the zero address");

            //add the reflections of the token to the address(0) balance.
            //This reduces the supply of reflectedTokens
            //without double altering the reflection/token ratio.
            
            _tTotal = _tTotal.sub(amount);
            _rTotal = _rTotal.sub(amount.mul(_getRate()));
            
            emit Transfer(msg.sender, address(this), amount);
        }
    }
    
    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }
    
    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }
    
    function excludedFromMaxTxAmount(address account) public onlyOwner {
        _isExcludedFromMaxTxAmount[account] = true;
    }
    
    function includeInMaxTxAmount(address account) public onlyOwner {
        _isExcludedFromMaxTxAmount[account] = false;
    }
    
    function excludedFromAntiWhale(address account) public onlyOwner {
        _isExcludedFromAntiWhale[account] = true;
    }
    
    function includeInAntiWhale(address account) public onlyOwner {
        _isExcludedFromAntiWhale[account] = false;
    }
    
    function setBurnFeePercent(uint256 Fee) external onlyOwner() {
        _burnFee = Fee;
    }
    
    function setExternalFeePercent(uint256 Fee) external onlyOwner() {
        _externalFee = Fee;
        _totalLiquidityFee = _liquidityFee.add(_externalFee);
    }
    
    function setReflectFeePercent(uint256 Fee) external onlyOwner() {
        _reflectionFee = Fee;
    }
    
    function setLiquidityFeePercent(uint256 Fee) external onlyOwner() {
        _liquidityFee = Fee;
        _totalLiquidityFee = _liquidityFee.add(_externalFee);
    }
    
    function setMaxTxTokensSell(uint256 maxTxTokens) external onlyOwner() {
        _maxTxAmountSell = maxTxTokens.mul( 10**_decimals );
    }
    
    function setMaxTxTokensBuy(uint256 maxTxTokens) external onlyOwner() {
        _maxTxAmountBuy = maxTxTokens.mul( 10**_decimals );
    }
    
    function setMaxTokenPerAddress(uint256 maxTokens) external onlyOwner() {
        _maxTokensPerAddress = maxTokens.mul( 10**_decimals );
    }
    
    function setExternalAddress(address payable externalAddress) external onlyOwner() {
        _externalAddress = externalAddress;
    }
    
    function setLiquidityAddress(address payable liquidityAddress) external onlyOwner() {
        autoLiquidityReceiver = liquidityAddress;
    }
	
    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }
	
    receive() external payable {}
    
    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }
    
    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 bFee, uint256 tLiquidity) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, bFee, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, bFee, tLiquidity);
    }
    
    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256) {
        uint256 tFee = calculateReflectionFee(tAmount);
        uint256 bFee = calculateBurnFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity).sub(bFee);
        return (tTransferAmount, tFee, bFee, tLiquidity);
    }
    
    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 bFee, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rbFee = bFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity).sub(rbFee);
        return (rAmount, rTransferAmount, rFee);
    }
    
    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }
    
    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;      
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }
    
    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if(_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }
    
    function calculateBurnFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_burnFee).div(
            10**3
        );
    }
    
    function calculateReflectionFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_reflectionFee).div(
            10**3
        );
    }
    
    function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_totalLiquidityFee).div(
            10**3
        );
    }
    
    function removeAllFee() private {
        if(_totalLiquidityFee == 0 && _burnFee == 0 && _liquidityFee == 0
           && _externalFee == 0 && _reflectionFee == 0 ) return;
        
        _previousLiquidityFee   = _liquidityFee; 
        _previousBurnFee        = _burnFee;
        _previousExternalFee    = _externalFee;
        _previousReflectionFee  = _reflectionFee;
        _previousTLiquidityFee  = _totalLiquidityFee;
        
        _burnFee        = 0;
        _externalFee    = 0;
        _reflectionFee  = 0;
        _liquidityFee   = 0;
        _totalLiquidityFee = 0;
    }
    
    function restoreAllFee() private {
        _liquidityFee       = _previousLiquidityFee;
        _burnFee            = _previousBurnFee;
        _externalFee        = _previousExternalFee;
        _reflectionFee      = _previousReflectionFee;
        _totalLiquidityFee  = _previousTLiquidityFee;
    }
    
    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }
    
    function setMinTokensSellToAndTransfer(uint256 minTokensValue) public onlyOwner()
    {
        _numTokensSellToAndTransfer = minTokensValue.mul( 10**_decimals );
    }
    
    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
    
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(_isExcludedFromAntiWhale[to] || balanceOf(to) + amount <= _maxTokensPerAddress,
        "Max tokens limit for this account reached. Or try lower amount");
        require(!_isBlacklisted[from], "You are banned");
        require(!_isBlacklisted[to], "The recipient is banned");
        if(from == pancakePair)
        {
            if(!_isExcludedFromMaxTxAmount[to])
                require(amount <= _maxTxAmountBuy, "Buy amount exceeds the maxTxAmount.");		    
        }
        else if(!_isExcludedFromMaxTxAmount[from] && to == pancakePair)
        {
            require(amount <= _maxTxAmountSell, "Sell amount exceeds the maxTxAmount.");
        }

        // is the token balance of this contract address over the min number of
        // tokens that we need to initiate a swap + liquidity lock?
        // also, don't get caught in a circular liquidity event.
        // also, don't swap & liquify if sender is pancakeswap pair.
        uint256 contractTokenBalance = balanceOf(address(this));
        
        bool overMinTokenBalance = contractTokenBalance >= _numTokensSellToAndTransfer;
        if (
            overMinTokenBalance &&
            !inSwapAndLiquify &&
            from != pancakePair &&
            swapAndLiquifyEnabled
        ) {
            contractTokenBalance = _numTokensSellToAndTransfer;
            //add liquidity
            swapAndLiquify(contractTokenBalance);
        }
        
        //indicates if fee should be deducted from transfer
        bool takeFee = true;
        
        //if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;
        }
        
        //transfer amount, it will take tax, burn, liquidity fee
        _tokenTransfer(from,to,amount,takeFee);
    }
    
    function swapAndLiquify(uint256 tokenBalance) private lockTheSwap {
        // first split contract into  fee and liquidity fee
        uint256 liquidityAmount = tokenBalance;
        // uint256 initialBalance = address(this).balance;
        IERC20 usdcContract = IERC20(USDC);
        uint256 initialBalance = usdcContract.balanceOf(address(this));


        if(_externalFee > 0)
        {
            uint256 externalAmount = tokenBalance.mul(_externalFee);
            externalAmount = externalAmount.div(_totalLiquidityFee);
            liquidityAmount = tokenBalance.sub(externalAmount);

            // send tokens to external
            // swapTokensForEth(_externalAddress, externalAmount);
            swapTokensForusdc(_externalAddress, externalAmount);
            initialBalance = usdcContract.balanceOf(address(this));
        }
        
        if(_liquidityFee > 0)
        {
            // split the liquidity token balance into halves
            uint256 half = liquidityAmount.div(2);
            uint256 otherHalf = liquidityAmount.sub(half);

            // capture the contract's current ETH balance.
            // this is so that we can capture exactly the amount of ETH that the
            // swap creates, and not make the liquidity event include any ETH that
            // has been manually sent to the contract

            // swap half liquidity tokens for ETH
            // swapTokensForEth(address(this), half);
            swapTokensForusdc(address(this), half);
            
            // how much ETH did we just swap into?
            uint256 newBalance = usdcContract.balanceOf(address(this)).sub(initialBalance);

            // add liquidity to pancakeswap
            addLiquidity(autoLiquidityReceiver, otherHalf, newBalance);
            
            emit SwapAndLiquify(half, newBalance, otherHalf);
        }
    }

    function swapTokensForusdc(address recipient, uint256 tokenAmount) private {
        // generate the pancakeswap pair path of token -> usdc
        address[] memory path = new address[](3);
        path[0] = address(this);
        path[1] = pancakeRouter.WETH();
        path[2] = USDC;

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

        // make the swap
        pancakeRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of USDC
            path,
            recipient,
            block.timestamp
        );
    }
    
    function addLiquidity(address recipient, uint256 tokenAmount, uint256 usdcAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(pancakeRouter), tokenAmount);
        IERC20(USDC).approve(address(pancakeRouter), usdcAmount);

        // add the liquidity
        pancakeRouter.addLiquidity(
            address(this),
            USDC,
            tokenAmount,
            usdcAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            recipient,
            block.timestamp
        );
    }
    
    function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private {
        if(!takeFee)
            removeAllFee();
        
        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
        
        if(!takeFee)
            restoreAllFee();
    }
    
    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 bFee, uint256 tLiquidity) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);

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

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

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

        _burn(sender, bFee);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }
    
    function blacklistSingleWallet(address addresses) public onlyOwner(){
        if(_isBlacklisted[addresses] == true) return;
        _isBlacklisted[addresses] = true;
    }
    
    function blacklistMultipleWallets(address[] calldata addresses) public onlyOwner(){
        require(addresses.length <= 800, "Can only blacklist 800 addresses per transaction");
        for (uint256 i; i < addresses.length; ++i) {
            _isBlacklisted[addresses[i]] = true;
        }
    }
    
    function isBlacklisted(address addresses) public view returns (bool){
        return _isBlacklisted[addresses];
    }
    
    function unBlacklistSingleWallet(address addresses) external onlyOwner(){
         if(_isBlacklisted[addresses] == false) return;
        _isBlacklisted[addresses] = false;
    }
    
    function unBlacklistMultipleWallets(address[] calldata addresses) public onlyOwner(){
        require(addresses.length <= 800, "Can only unblacklist 800 addresses per transaction");
        for (uint256 i; i < addresses.length; ++i) {
            _isBlacklisted[addresses[i]] = false;
        }
    }

    function burnTokens(uint256 tokens) external {
        tokens = tokens.mul( 10**_decimals );
        require(msg.sender != address(0), "ERC20: burn from the zero address");
        require(tokens > 0, "Tokens value should be greater then Zero");
        require(tokens <= balanceOf(msg.sender), "Tokens value should be less then equal to your balance");
        
        uint256 rTokens = tokens.mul(_getRate());
        if(_isExcluded[msg.sender])
            _tOwned[msg.sender] = _tOwned[msg.sender].sub(tokens);
        _rOwned[msg.sender] = _rOwned[msg.sender].sub(rTokens);
        _tTotal = _tTotal.sub(tokens);
        _rTotal = _rTotal.sub(rTokens);

        emit Transfer(msg.sender, address(this), tokens);
    }
    
    function recoverBNB() public onlyOwner()
    {
        address payable recipient = payable(_msgSender());
        if(address(this).balance > 0)
            recipient.transfer(address(this).balance);
    }
    
    //New Pancakeswap router version?
    //No problem, just change it!
    function setRouterAddress(address newRouter) public onlyOwner() {
        IPancakeRouter02 _newPancakeRouter = IPancakeRouter02(newRouter);
        // pancakePair = IPancakeFactory(_newPancakeRouter.factory()).createPair(address(this), _newPancakeRouter.WETH());
        address getPair = IPancakeFactory(_newPancakeRouter.factory()).getPair(address(this), USDC);
        if (getPair == address(0)) {
            pancakePair = IPancakeFactory(_newPancakeRouter.factory()).createPair(address(this), USDC);
        } else {
            pancakePair = getPair;
        }
        pancakeRouter = _newPancakeRouter;
    }

    function withdraw(IERC20 token, address recipient, uint256 amount) public onlyOwner {
        require(token.balanceOf(address(this)) >= amount, "Withdraw: Insufficient balance");
        token.transfer(recipient, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqiudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"USDC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_burnAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_externalAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_externalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromAntiWhale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTokensPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmountBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmountSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_numTokensSellToAndTransfer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_reflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoLiquidityReceiver","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"blacklistMultipleWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addresses","type":"address"}],"name":"blacklistSingleWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"burnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","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":"excludedFromAntiWhale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludedFromMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInAntiWhale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInMaxTxAmount","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":"addresses","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[],"name":"pancakePair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pancakeRouter","outputs":[{"internalType":"contract IPancakeRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverBNB","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"Fee","type":"uint256"}],"name":"setBurnFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"externalAddress","type":"address"}],"name":"setExternalAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"Fee","type":"uint256"}],"name":"setExternalFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"liquidityAddress","type":"address"}],"name":"setLiquidityAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"Fee","type":"uint256"}],"name":"setLiquidityFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTokens","type":"uint256"}],"name":"setMaxTokenPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxTokens","type":"uint256"}],"name":"setMaxTxTokensBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxTokens","type":"uint256"}],"name":"setMaxTxTokensSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minTokensValue","type":"uint256"}],"name":"setMinTokensSellToAndTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"Fee","type":"uint256"}],"name":"setReflectFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeesCollected","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":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"unBlacklistMultipleWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addresses","type":"address"}],"name":"unBlacklistSingleWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

600a80546001600160a01b0319908116731598f474b3b25c48e8d29798fcb6fd5be303eda417909155600b805490911661dead17815560c060405260808190526a494e554d414b49544f474560a81b60a09081526200006291600d919062000621565b5060408051808201909152600480825263544f474560e01b60209092019182526200009091600e9162000621565b50600f805460ff19166012908117909155620000ae90600a620007da565b620000bf906402540be400620007eb565b6010819055620000d2906000196200080d565b620000e09060001962000830565b601155600a601355601354601455600a601555601554601655600a601755601754601855600a601955601954601a556200012d601954601754620005ba60201b620022d61790919060201c565b601b819055601c55601e805460ff60a81b1916600160a81b179055600f546200015b9060ff16600a620007da565b6200016e9066038d7ea4c68000620007eb565b601f55600f54620001849060ff16600a620007da565b620001979066038d7ea4c68000620007eb565b602055600f54620001ad9060ff16600a620007da565b620001bc9062989680620007eb565b602155600f54620001d29060ff16600a620007da565b620001e2906305f5e100620007eb565b602255348015620001f257600080fd5b50620001fe33620005d1565b6011543360009081526001602090815260409182902092909255805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d92839263c45a01559260048083019392829003018186803b1580156200026057600080fd5b505afa15801562000275573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029b91906200084a565b6040516364e329cb60e11b815230600482015273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860248201526001600160a01b03919091169063c9c6539690604401602060405180830381600087803b158015620002f957600080fd5b505af11580156200030e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200033491906200084a565b601e80546001600160a01b03199081166001600160a01b0393841617909155601d80549091169183169190911790556001600460006200037c6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790553081526004909352818320805485166001908117909155600a54909116835290822080549093168117909255600790620003ec6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790553081526007909352818320805485166001908117909155601e5482168452828420805486168217905585821684528284208054861682179055600b549091168352908220805490931681179092556003906200047e6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530815260038452828120805486166001908117909155601e5483168252838220805487168217905586831682528382208054871682179055600b805484168352848320805488168317905560059095527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc805487168217905593549091168152208054909216179055600c80546001600160a01b03191673f9d46d6f0a0a662de6a1c5d417f245da00fb4475179055620005633390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef601054604051620005ab91815260200190565b60405180910390a350620008d4565b6000620005c882846200087c565b90505b92915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200062f9062000897565b90600052602060002090601f0160209004810192826200065357600085556200069e565b82601f106200066e57805160ff19168380011785556200069e565b828001600101855582156200069e579182015b828111156200069e57825182559160200191906001019062000681565b50620006ac929150620006b0565b5090565b5b80821115620006ac5760008155600101620006b1565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200071e578160001904821115620007025762000702620006c7565b808516156200071057918102915b93841c9390800290620006e2565b509250929050565b6000826200073757506001620005cb565b816200074657506000620005cb565b81600181146200075f57600281146200076a576200078a565b6001915050620005cb565b60ff8411156200077e576200077e620006c7565b50506001821b620005cb565b5060208310610133831016604e8410600b8410161715620007af575081810a620005cb565b620007bb8383620006dd565b8060001904821115620007d257620007d2620006c7565b029392505050565b6000620005c860ff84168362000726565b6000816000190483118215151615620008085762000808620006c7565b500290565b6000826200082b57634e487b7160e01b600052601260045260246000fd5b500690565b600082821015620008455762000845620006c7565b500390565b6000602082840312156200085d57600080fd5b81516001600160a01b03811681146200087557600080fd5b9392505050565b60008219821115620008925762000892620006c7565b500190565b600181811c90821680620008ac57607f821691505b60208210811415620008ce57634e487b7160e01b600052602260045260246000fd5b50919050565b613e1a80620008e46000396000f3fe6080604052600436106103c75760003560e01c806370a08231116101f2578063c0b0fda21161010d578063dd62ed3e116100a0578063f2fde38b1161006f578063f2fde38b14610b86578063f560b92e14610ba6578063f59d047c14610bc6578063fe575a8714610bdc57600080fd5b8063dd62ed3e14610aea578063ea2f0b3714610b30578063f011de1c14610b50578063f157ce4014610b6657600080fd5b8063cad6ebf9116100dc578063cad6ebf914610a6a578063cea2695814610a8a578063d9caed1214610aaa578063dc56f2b614610aca57600080fd5b8063c0b0fda2146109f4578063c21ebd0714610a0a578063c49b9a8014610a2a578063ca33e64c14610a4a57600080fd5b8063a1bdc39911610185578063b8c9d25c11610154578063b8c9d25c14610974578063bd3900c014610994578063bf323719146109b4578063bfd5bf1c146109d457600080fd5b8063a1bdc399146108f4578063a457c2d714610914578063a9059cbb14610934578063ade1ba0e1461095457600080fd5b806389a30271116101c157806389a30271146108615780638da5cb5b146108a15780638ee88c53146108bf57806395d89b41146108df57600080fd5b806370a08231146107d3578063715018a6146107f3578063772558ce1461080857806388f820201461082857600080fd5b806343743e42116102e257806354c694aa116102755780636bfdf8a0116102445780636bfdf8a01461075e5780636d1b229d146107735780636de20a09146107935780636fd36cd6146107b357600080fd5b806354c694aa146106fd57806360c6d8ae1461071d5780636125a72c146107325780636bc87c3a1461074857600080fd5b80634a74bb02116102b15780634a74bb021461066357806352390c0214610684578063525fa81f146106a45780635342acb4146106c457600080fd5b806343743e42146105f7578063437823ec1461060d5780634549b0391461062d57806346469ae71461064d57600080fd5b80632f1191431161035a578063395093511161032957806339509351146105775780633bb48ff7146105975780633bd5d173146105b757806341cb87fc146105d757600080fd5b80632f119143146104ff578063313ce5671461051f5780633206b4aa146105415780633685d4191461055757600080fd5b806323b872dd1161039657806323b872dd1461046f57806325a6cc061461048f5780632c505e90146104af5780632d838119146104df57600080fd5b806306fdde03146103d3578063095ea7b3146103fe578063180ea6051461042e57806318160ddd1461045057600080fd5b366103ce57005b600080fd5b3480156103df57600080fd5b506103e8610c15565b6040516103f59190613829565b60405180910390f35b34801561040a57600080fd5b5061041e610419366004613893565b610ca7565b60405190151581526020016103f5565b34801561043a57600080fd5b5061044e6104493660046138bf565b610cbe565b005b34801561045c57600080fd5b506010545b6040519081526020016103f5565b34801561047b57600080fd5b5061041e61048a3660046138d8565b610d13565b34801561049b57600080fd5b5061044e6104aa3660046138bf565b610d7c565b3480156104bb57600080fd5b5061041e6104ca366004613919565b60036020526000908152604090205460ff1681565b3480156104eb57600080fd5b506104616104fa3660046138bf565b610dc1565b34801561050b57600080fd5b5061044e61051a366004613919565b610e45565b34801561052b57600080fd5b50600f5460405160ff90911681526020016103f5565b34801561054d57600080fd5b5061046160155481565b34801561056357600080fd5b5061044e610572366004613919565b610e90565b34801561058357600080fd5b5061041e610592366004613893565b611047565b3480156105a357600080fd5b5061044e6105b23660046138bf565b61107d565b3480156105c357600080fd5b5061044e6105d23660046138bf565b6110ac565b3480156105e357600080fd5b5061044e6105f2366004613919565b611198565b34801561060357600080fd5b5061046160175481565b34801561061957600080fd5b5061044e610628366004613919565b611448565b34801561063957600080fd5b50610461610648366004613944565b611496565b34801561065957600080fd5b50610461601f5481565b34801561066f57600080fd5b50601e5461041e90600160a81b900460ff1681565b34801561069057600080fd5b5061044e61069f366004613919565b611525565b3480156106b057600080fd5b5061044e6106bf366004613919565b6116f4565b3480156106d057600080fd5b5061041e6106df366004613919565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561070957600080fd5b5061044e6107183660046138bf565b611740565b34801561072957600080fd5b50601254610461565b34801561073e57600080fd5b5061046160215481565b34801561075457600080fd5b5061046160195481565b34801561076a57600080fd5b5061044e611785565b34801561077f57600080fd5b5061044e61078e3660046138bf565b6117ee565b34801561079f57600080fd5b5061044e6107ae366004613919565b6119da565b3480156107bf57600080fd5b5061044e6107ce366004613919565b611a28565b3480156107df57600080fd5b506104616107ee366004613919565b611a74565b3480156107ff57600080fd5b5061044e611ad3565b34801561081457600080fd5b5061044e610823366004613974565b611b09565b34801561083457600080fd5b5061041e610843366004613919565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561086d57600080fd5b5061088973a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b6040516001600160a01b0390911681526020016103f5565b3480156108ad57600080fd5b506000546001600160a01b0316610889565b3480156108cb57600080fd5b5061044e6108da3660046138bf565b611c13565b3480156108eb57600080fd5b506103e8611c56565b34801561090057600080fd5b5061044e61090f366004613974565b611c65565b34801561092057600080fd5b5061041e61092f366004613893565b611d6c565b34801561094057600080fd5b5061041e61094f366004613893565b611dbb565b34801561096057600080fd5b5061044e61096f3660046138bf565b611dc8565b34801561098057600080fd5b50601e54610889906001600160a01b031681565b3480156109a057600080fd5b50600b54610889906001600160a01b031681565b3480156109c057600080fd5b5061044e6109cf366004613919565b611e0d565b3480156109e057600080fd5b50600a54610889906001600160a01b031681565b348015610a0057600080fd5b5061046160135481565b348015610a1657600080fd5b50601d54610889906001600160a01b031681565b348015610a3657600080fd5b5061044e610a453660046139e9565b611e58565b348015610a5657600080fd5b50600c54610889906001600160a01b031681565b348015610a7657600080fd5b5061044e610a85366004613919565b611eda565b348015610a9657600080fd5b5061044e610aa53660046138bf565b611f53565b348015610ab657600080fd5b5061044e610ac53660046138d8565b611f82565b348015610ad657600080fd5b5061044e610ae53660046138bf565b6120fb565b348015610af657600080fd5b50610461610b05366004613a06565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b348015610b3c57600080fd5b5061044e610b4b366004613919565b612137565b348015610b5c57600080fd5b5061046160225481565b348015610b7257600080fd5b5061044e610b81366004613919565b612182565b348015610b9257600080fd5b5061044e610ba1366004613919565b6121f0565b348015610bb257600080fd5b5061044e610bc1366004613919565b612288565b348015610bd257600080fd5b5061046160205481565b348015610be857600080fd5b5061041e610bf7366004613919565b6001600160a01b031660009081526006602052604090205460ff1690565b6060600d8054610c2490613a34565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5090613a34565b8015610c9d5780601f10610c7257610100808354040283529160200191610c9d565b820191906000526020600020905b815481529060010190602001808311610c8057829003601f168201915b5050505050905090565b6000610cb43384846122e2565b5060015b92915050565b6000546001600160a01b03163314610cf15760405162461bcd60e51b8152600401610ce890613a6f565b60405180910390fd5b600f54610d0d90610d069060ff16600a613b9e565b8290612406565b60205550565b6000610d20848484612412565b610d728433610d6d85604051806060016040528060288152602001613d98602891396001600160a01b038a16600090815260086020908152604080832033845290915290205491906128aa565b6122e2565b5060019392505050565b6000546001600160a01b03163314610da65760405162461bcd60e51b8152600401610ce890613a6f565b600f54610dbb90610d069060ff16600a613b9e565b60225550565b6000601154821115610e285760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610ce8565b6000610e326128d6565b9050610e3e83826128f9565b9392505050565b6000546001600160a01b03163314610e6f5760405162461bcd60e51b8152600401610ce890613a6f565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6000546001600160a01b03163314610eba5760405162461bcd60e51b8152600401610ce890613a6f565b6001600160a01b03811660009081526005602052604090205460ff16610f225760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610ce8565b60005b60095481101561104357816001600160a01b031660098281548110610f4c57610f4c613bad565b6000918252602090912001546001600160a01b031614156110315760098054610f7790600190613bc3565b81548110610f8757610f87613bad565b600091825260209091200154600980546001600160a01b039092169183908110610fb357610fb3613bad565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600590925220805460ff19169055600980548061100b5761100b613bda565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b8061103b81613bf0565b915050610f25565b5050565b3360008181526008602090815260408083206001600160a01b03871684529091528120549091610cb4918590610d6d90866122d6565b6000546001600160a01b031633146110a75760405162461bcd60e51b8152600401610ce890613a6f565b601555565b3360008181526005602052604090205460ff16156111215760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610ce8565b600061112c83612905565b5050506001600160a01b03861660009081526001602052604090205493945061115a93925084915050612960565b6001600160a01b0383166000908152600160205260409020556011546111809082612960565b60115560125461119090846122d6565b601255505050565b6000546001600160a01b031633146111c25760405162461bcd60e51b8152600401610ce890613a6f565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561120257600080fd5b505afa158015611216573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123a9190613c0b565b60405163e6a4390560e01b815230600482015273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860248201526001600160a01b03919091169063e6a439059060440160206040518083038186803b15801561129557600080fd5b505afa1580156112a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cd9190613c0b565b90506001600160a01b03811661140857816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561131657600080fd5b505afa15801561132a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134e9190613c0b565b6040516364e329cb60e11b815230600482015273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860248201526001600160a01b03919091169063c9c6539690604401602060405180830381600087803b1580156113ab57600080fd5b505af11580156113bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e39190613c0b565b601e80546001600160a01b0319166001600160a01b0392909216919091179055611424565b601e80546001600160a01b0319166001600160a01b0383161790555b50601d80546001600160a01b0319166001600160a01b039290921691909117905550565b6000546001600160a01b031633146114725760405162461bcd60e51b8152600401610ce890613a6f565b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b60006010548311156114ea5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610ce8565b8161150a5760006114fa84612905565b50949650610cb895505050505050565b600061151584612905565b50939650610cb895505050505050565b6000546001600160a01b0316331461154f5760405162461bcd60e51b8152600401610ce890613a6f565b737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03821614156115cb5760405162461bcd60e51b815260206004820152602660248201527f57652063616e206e6f74206578636c7564652070616e63616b6573776170207260448201526537baba32b91760d11b6064820152608401610ce8565b6001600160a01b03811660009081526005602052604090205460ff16156116345760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610ce8565b6001600160a01b0381166000908152600160205260409020541561168e576001600160a01b03811660009081526001602052604090205461167490610dc1565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600560205260408120805460ff191660019081179091556009805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319169091179055565b6000546001600160a01b0316331461171e5760405162461bcd60e51b8152600401610ce890613a6f565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461176a5760405162461bcd60e51b8152600401610ce890613a6f565b600f5461177f90610d069060ff16600a613b9e565b601f5550565b6000546001600160a01b031633146117af5760405162461bcd60e51b8152600401610ce890613a6f565b3347156117eb576040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015611043573d6000803e3d6000fd5b50565b600f5461180390610d069060ff16600a613b9e565b9050336118225760405162461bcd60e51b8152600401610ce890613c28565b600081116118835760405162461bcd60e51b815260206004820152602860248201527f546f6b656e732076616c75652073686f756c642062652067726561746572207460448201526768656e205a65726f60c01b6064820152608401610ce8565b61188c33611a74565b8111156118fa5760405162461bcd60e51b815260206004820152603660248201527f546f6b656e732076616c75652073686f756c64206265206c657373207468656e60448201527520657175616c20746f20796f75722062616c616e636560501b6064820152608401610ce8565b600061190e6119076128d6565b8390612406565b3360009081526005602052604090205490915060ff161561195457336000908152600260205260409020546119439083612960565b336000908152600260205260409020555b3360009081526001602052604090205461196e9082612960565b3360009081526001602052604090205560105461198b9083612960565b60105560115461199b9082612960565b601155604051828152309033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6000546001600160a01b03163314611a045760405162461bcd60e51b8152600401610ce890613a6f565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000546001600160a01b03163314611a525760405162461bcd60e51b8152600401610ce890613a6f565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526005602052604081205460ff1615611ab157506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610cb890610dc1565b6000546001600160a01b03163314611afd5760405162461bcd60e51b8152600401610ce890613a6f565b611b07600061296c565b565b6000546001600160a01b03163314611b335760405162461bcd60e51b8152600401610ce890613a6f565b610320811115611b9e5760405162461bcd60e51b815260206004820152603060248201527f43616e206f6e6c7920626c61636b6c697374203830302061646472657373657360448201526f103832b9103a3930b739b0b1ba34b7b760811b6064820152608401610ce8565b60005b81811015611c0e57600160066000858585818110611bc157611bc1613bad565b9050602002016020810190611bd69190613919565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055611c0781613bf0565b9050611ba1565b505050565b6000546001600160a01b03163314611c3d5760405162461bcd60e51b8152600401610ce890613a6f565b6019819055601754611c509082906122d6565b601b5550565b6060600e8054610c2490613a34565b6000546001600160a01b03163314611c8f5760405162461bcd60e51b8152600401610ce890613a6f565b610320811115611cfc5760405162461bcd60e51b815260206004820152603260248201527f43616e206f6e6c7920756e626c61636b6c69737420383030206164647265737360448201527132b9903832b9103a3930b739b0b1ba34b7b760711b6064820152608401610ce8565b60005b81811015611c0e57600060066000858585818110611d1f57611d1f613bad565b9050602002016020810190611d349190613919565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055611d6581613bf0565b9050611cff565b6000610cb43384610d6d85604051806060016040528060258152602001613dc0602591393360009081526008602090815260408083206001600160a01b038d16845290915290205491906128aa565b6000610cb4338484612412565b6000546001600160a01b03163314611df25760405162461bcd60e51b8152600401610ce890613a6f565b600f54611e0790610d069060ff16600a613b9e565b60215550565b6000546001600160a01b03163314611e375760405162461bcd60e51b8152600401610ce890613a6f565b6001600160a01b03166000908152600360205260409020805460ff19169055565b6000546001600160a01b03163314611e825760405162461bcd60e51b8152600401610ce890613a6f565b601e8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611ecf90831515815260200190565b60405180910390a150565b6000546001600160a01b03163314611f045760405162461bcd60e51b8152600401610ce890613a6f565b6001600160a01b03811660009081526006602052604090205460ff16151560011415611f2d5750565b6001600160a01b0381166000908152600660205260409020805460ff1916600117905550565b6000546001600160a01b03163314611f7d5760405162461bcd60e51b8152600401610ce890613a6f565b601355565b6000546001600160a01b03163314611fac5760405162461bcd60e51b8152600401610ce890613a6f565b6040516370a0823160e01b815230600482015281906001600160a01b038516906370a082319060240160206040518083038186803b158015611fed57600080fd5b505afa158015612001573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120259190613c69565b10156120735760405162461bcd60e51b815260206004820152601e60248201527f57697468647261773a20496e73756666696369656e742062616c616e636500006044820152606401610ce8565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401602060405180830381600087803b1580156120bd57600080fd5b505af11580156120d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f59190613c82565b50505050565b6000546001600160a01b031633146121255760405162461bcd60e51b8152600401610ce890613a6f565b6017819055601954611c5090826122d6565b6000546001600160a01b031633146121615760405162461bcd60e51b8152600401610ce890613a6f565b6001600160a01b03166000908152600460205260409020805460ff19169055565b6000546001600160a01b031633146121ac5760405162461bcd60e51b8152600401610ce890613a6f565b6001600160a01b03811660009081526006602052604090205460ff166121cf5750565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b0316331461221a5760405162461bcd60e51b8152600401610ce890613a6f565b6001600160a01b03811661227f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ce8565b6117eb8161296c565b6000546001600160a01b031633146122b25760405162461bcd60e51b8152600401610ce890613a6f565b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b6000610e3e8284613c9f565b6001600160a01b0383166123445760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ce8565b6001600160a01b0382166123a55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ce8565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610e3e8284613cb7565b6001600160a01b0383166124765760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ce8565b6001600160a01b0382166124d85760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ce8565b6000811161253a5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610ce8565b6001600160a01b03821660009081526003602052604090205460ff168061257657506022548161256984611a74565b6125739190613c9f565b11155b6125e85760405162461bcd60e51b815260206004820152603e60248201527f4d617820746f6b656e73206c696d697420666f722074686973206163636f756e60448201527f7420726561636865642e204f7220747279206c6f77657220616d6f756e7400006064820152608401610ce8565b6001600160a01b03831660009081526006602052604090205460ff16156126425760405162461bcd60e51b815260206004820152600e60248201526d165bdd48185c994818985b9b995960921b6044820152606401610ce8565b6001600160a01b03821660009081526006602052604090205460ff16156126ab5760405162461bcd60e51b815260206004820152601760248201527f54686520726563697069656e742069732062616e6e65640000000000000000006044820152606401610ce8565b601e546001600160a01b0384811691161415612744576001600160a01b03821660009081526007602052604090205460ff1661273f57601f5481111561273f5760405162461bcd60e51b815260206004820152602360248201527f42757920616d6f756e74206578636565647320746865206d61785478416d6f75604482015262373a1760e91b6064820152608401610ce8565b6127dd565b6001600160a01b03831660009081526007602052604090205460ff1615801561277a5750601e546001600160a01b038381169116145b156127dd576020548111156127dd5760405162461bcd60e51b8152602060048201526024808201527f53656c6c20616d6f756e74206578636565647320746865206d61785478416d6f6044820152633ab73a1760e11b6064820152608401610ce8565b60006127e830611a74565b602154909150811080159081906128095750601e54600160a01b900460ff16155b80156128235750601e546001600160a01b03868116911614155b80156128385750601e54600160a81b900460ff165b1561284b57602154915061284b826129bc565b6001600160a01b03851660009081526004602052604090205460019060ff168061288d57506001600160a01b03851660009081526004602052604090205460ff165b15612896575060005b6128a286868684612c58565b505050505050565b600081848411156128ce5760405162461bcd60e51b8152600401610ce89190613829565b505050900390565b60008060006128e3612de1565b90925090506128f282826128f9565b9250505090565b6000610e3e8284613cd6565b600080600080600080600080600080600061291f8c612f63565b935093509350935060008060006129408f87868861293b6128d6565b612fb2565b919f509d509b509599509397509195509350505050919395979092949650565b6000610e3e8284613bc3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b601e805460ff60a01b1916600160a01b1790556040516370a0823160e01b8152306004820152819073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489060009082906370a082319060240160206040518083038186803b158015612a2057600080fd5b505afa158015612a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a589190613c69565b60175490915015612b31576000612a7a6017548661240690919063ffffffff16565b9050612a91601b54826128f990919063ffffffff16565b9050612a9d8582612960565b600a54909450612ab6906001600160a01b031682613014565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a082319060240160206040518083038186803b158015612af557600080fd5b505afa158015612b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2d9190613c69565b9150505b60195415612c45576000612b468460026128f9565b90506000612b548583612960565b9050612b603083613014565b6040516370a0823160e01b8152306004820152600090612be69085906001600160a01b038816906370a082319060240160206040518083038186803b158015612ba857600080fd5b505afa158015612bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be09190613c69565b90612960565b600c54909150612c00906001600160a01b031683836131c8565b60408051848152602081018390529081018390527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505b5050601e805460ff60a01b191690555050565b80612c6557612c6561333a565b6001600160a01b03841660009081526005602052604090205460ff168015612ca657506001600160a01b03831660009081526005602052604090205460ff16155b15612cbb57612cb68484846133ad565b612db9565b6001600160a01b03841660009081526005602052604090205460ff16158015612cfc57506001600160a01b03831660009081526005602052604090205460ff165b15612d0c57612cb68484846134f4565b6001600160a01b03841660009081526005602052604090205460ff16158015612d4e57506001600160a01b03831660009081526005602052604090205460ff16155b15612d5e57612cb68484846135b3565b6001600160a01b03841660009081526005602052604090205460ff168015612d9e57506001600160a01b03831660009081526005602052604090205460ff165b15612dae57612cb684848461360d565b612db98484846135b3565b806120f5576120f5601a54601955601454601355601854601755601654601555601c54601b55565b6011546010546000918291825b600954811015612f3357826001600060098481548110612e1057612e10613bad565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612e7b5750816002600060098481548110612e5457612e54613bad565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612e9157601154601054945094505050509091565b612ed76001600060098481548110612eab57612eab613bad565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612960565b9250612f1f6002600060098481548110612ef357612ef3613bad565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612960565b915080612f2b81613bf0565b915050612dee565b50601054601154612f43916128f9565b821015612f5a576011546010549350935050509091565b90939092509050565b6000806000806000612f7486613696565b90506000612f81876136b9565b90506000612f8e886136d6565b90506000612fa283612be084818d89612960565b9993985091965094509092505050565b6000808080612fc18986612406565b90506000612fcf8987612406565b90506000612fdd8888612406565b90506000612feb8a89612406565b90506000612fff83612be084818989612960565b949d949c50929a509298505050505050505050565b6040805160038082526080820190925260009160208201606080368337019050509050308160008151811061304b5761304b613bad565b6001600160a01b03928316602091820292909201810191909152601d54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561309f57600080fd5b505afa1580156130b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d79190613c0b565b816001815181106130ea576130ea613bad565b60200260200101906001600160a01b031690816001600160a01b03168152505073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488160028151811061313257613132613bad565b6001600160a01b039283166020918202929092010152601d5461315891309116846122e2565b601d54604051635c11d79560e01b81526001600160a01b0390911690635c11d79590613191908590600090869089904290600401613cf8565b600060405180830381600087803b1580156131ab57600080fd5b505af11580156131bf573d6000803e3d6000fd5b50505050505050565b601d546131e09030906001600160a01b0316846122e2565b601d5460405163095ea7b360e01b81526001600160a01b0390911660048201526024810182905273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489063095ea7b390604401602060405180830381600087803b15801561324057600080fd5b505af1158015613254573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132789190613c82565b50601d5460405162e8e33760e81b815230600482015273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486024820152604481018490526064810183905260006084820181905260a48201526001600160a01b0385811660c48301524260e48301529091169063e8e337009061010401606060405180830381600087803b15801561330257600080fd5b505af1158015613316573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a29190613d69565b601b5415801561334a5750601354155b80156133565750601954155b80156133625750601754155b801561336e5750601554155b1561337557565b60198054601a55601380546014556017805460185560158054601655601b8054601c5560009384905591839055829055918190559055565b60008060008060008060006133c188612905565b965096509650965096509650965061340788600260008d6001600160a01b03166001600160a01b031681526020019081526020016000205461296090919063ffffffff16565b6001600160a01b038b166000908152600260209081526040808320939093556001905220546134369088612960565b6001600160a01b03808c1660009081526001602052604080822093909355908b168152205461346590876122d6565b6001600160a01b038a166000908152600160205260409020556134888a836136f3565b6134918161377d565b61349b8584613805565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516134e091815260200190565b60405180910390a350505050505050505050565b600080600080600080600061350888612905565b965096509650965096509650965061354e87600160008d6001600160a01b03166001600160a01b031681526020019081526020016000205461296090919063ffffffff16565b6001600160a01b03808c16600090815260016020908152604080832094909455918c1681526002909152205461358490856122d6565b6001600160a01b038a1660009081526002602090815260408083209390935560019052205461346590876122d6565b60008060008060008060006135c788612905565b965096509650965096509650965061343687600160008d6001600160a01b03166001600160a01b031681526020019081526020016000205461296090919063ffffffff16565b600080600080600080600061362188612905565b965096509650965096509650965061366788600260008d6001600160a01b03166001600160a01b031681526020019081526020016000205461296090919063ffffffff16565b6001600160a01b038b1660009081526002602090815260408083209390935560019052205461354e9088612960565b6000610cb86103e86136b36015548561240690919063ffffffff16565b906128f9565b6000610cb86103e86136b36013548561240690919063ffffffff16565b6000610cb86103e86136b3601b548561240690919063ffffffff16565b8015611043576001600160a01b03821661371f5760405162461bcd60e51b8152600401610ce890613c28565b60105461372c9082612960565b60105561374661373d6119076128d6565b60115490612960565b601155604051818152309033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016119ce565b60006137876128d6565b905060006137958383612406565b306000908152600160205260409020549091506137b290826122d6565b3060009081526001602090815260408083209390935560059052205460ff1615611c0e57306000908152600260205260409020546137f090846122d6565b30600090815260026020526040902055505050565b6011546138129083612960565b60115560125461382290826122d6565b6012555050565b600060208083528351808285015260005b818110156138565785810183015185820160400152820161383a565b81811115613868576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146117eb57600080fd5b600080604083850312156138a657600080fd5b82356138b18161387e565b946020939093013593505050565b6000602082840312156138d157600080fd5b5035919050565b6000806000606084860312156138ed57600080fd5b83356138f88161387e565b925060208401356139088161387e565b929592945050506040919091013590565b60006020828403121561392b57600080fd5b8135610e3e8161387e565b80151581146117eb57600080fd5b6000806040838503121561395757600080fd5b82359150602083013561396981613936565b809150509250929050565b6000806020838503121561398757600080fd5b823567ffffffffffffffff8082111561399f57600080fd5b818501915085601f8301126139b357600080fd5b8135818111156139c257600080fd5b8660208260051b85010111156139d757600080fd5b60209290920196919550909350505050565b6000602082840312156139fb57600080fd5b8135610e3e81613936565b60008060408385031215613a1957600080fd5b8235613a248161387e565b915060208301356139698161387e565b600181811c90821680613a4857607f821691505b60208210811415613a6957634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115613af5578160001904821115613adb57613adb613aa4565b80851615613ae857918102915b93841c9390800290613abf565b509250929050565b600082613b0c57506001610cb8565b81613b1957506000610cb8565b8160018114613b2f5760028114613b3957613b55565b6001915050610cb8565b60ff841115613b4a57613b4a613aa4565b50506001821b610cb8565b5060208310610133831016604e8410600b8410161715613b78575081810a610cb8565b613b828383613aba565b8060001904821115613b9657613b96613aa4565b029392505050565b6000610e3e60ff841683613afd565b634e487b7160e01b600052603260045260246000fd5b600082821015613bd557613bd5613aa4565b500390565b634e487b7160e01b600052603160045260246000fd5b6000600019821415613c0457613c04613aa4565b5060010190565b600060208284031215613c1d57600080fd5b8151610e3e8161387e565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b600060208284031215613c7b57600080fd5b5051919050565b600060208284031215613c9457600080fd5b8151610e3e81613936565b60008219821115613cb257613cb2613aa4565b500190565b6000816000190483118215151615613cd157613cd1613aa4565b500290565b600082613cf357634e487b7160e01b600052601260045260246000fd5b500490565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613d485784516001600160a01b031683529383019391830191600101613d23565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215613d7e57600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e999c5282c5d2ff5599d3a46984c9ad723c029d1d12549e63345c52ad8e2046264736f6c63430008090033

Deployed Bytecode

0x6080604052600436106103c75760003560e01c806370a08231116101f2578063c0b0fda21161010d578063dd62ed3e116100a0578063f2fde38b1161006f578063f2fde38b14610b86578063f560b92e14610ba6578063f59d047c14610bc6578063fe575a8714610bdc57600080fd5b8063dd62ed3e14610aea578063ea2f0b3714610b30578063f011de1c14610b50578063f157ce4014610b6657600080fd5b8063cad6ebf9116100dc578063cad6ebf914610a6a578063cea2695814610a8a578063d9caed1214610aaa578063dc56f2b614610aca57600080fd5b8063c0b0fda2146109f4578063c21ebd0714610a0a578063c49b9a8014610a2a578063ca33e64c14610a4a57600080fd5b8063a1bdc39911610185578063b8c9d25c11610154578063b8c9d25c14610974578063bd3900c014610994578063bf323719146109b4578063bfd5bf1c146109d457600080fd5b8063a1bdc399146108f4578063a457c2d714610914578063a9059cbb14610934578063ade1ba0e1461095457600080fd5b806389a30271116101c157806389a30271146108615780638da5cb5b146108a15780638ee88c53146108bf57806395d89b41146108df57600080fd5b806370a08231146107d3578063715018a6146107f3578063772558ce1461080857806388f820201461082857600080fd5b806343743e42116102e257806354c694aa116102755780636bfdf8a0116102445780636bfdf8a01461075e5780636d1b229d146107735780636de20a09146107935780636fd36cd6146107b357600080fd5b806354c694aa146106fd57806360c6d8ae1461071d5780636125a72c146107325780636bc87c3a1461074857600080fd5b80634a74bb02116102b15780634a74bb021461066357806352390c0214610684578063525fa81f146106a45780635342acb4146106c457600080fd5b806343743e42146105f7578063437823ec1461060d5780634549b0391461062d57806346469ae71461064d57600080fd5b80632f1191431161035a578063395093511161032957806339509351146105775780633bb48ff7146105975780633bd5d173146105b757806341cb87fc146105d757600080fd5b80632f119143146104ff578063313ce5671461051f5780633206b4aa146105415780633685d4191461055757600080fd5b806323b872dd1161039657806323b872dd1461046f57806325a6cc061461048f5780632c505e90146104af5780632d838119146104df57600080fd5b806306fdde03146103d3578063095ea7b3146103fe578063180ea6051461042e57806318160ddd1461045057600080fd5b366103ce57005b600080fd5b3480156103df57600080fd5b506103e8610c15565b6040516103f59190613829565b60405180910390f35b34801561040a57600080fd5b5061041e610419366004613893565b610ca7565b60405190151581526020016103f5565b34801561043a57600080fd5b5061044e6104493660046138bf565b610cbe565b005b34801561045c57600080fd5b506010545b6040519081526020016103f5565b34801561047b57600080fd5b5061041e61048a3660046138d8565b610d13565b34801561049b57600080fd5b5061044e6104aa3660046138bf565b610d7c565b3480156104bb57600080fd5b5061041e6104ca366004613919565b60036020526000908152604090205460ff1681565b3480156104eb57600080fd5b506104616104fa3660046138bf565b610dc1565b34801561050b57600080fd5b5061044e61051a366004613919565b610e45565b34801561052b57600080fd5b50600f5460405160ff90911681526020016103f5565b34801561054d57600080fd5b5061046160155481565b34801561056357600080fd5b5061044e610572366004613919565b610e90565b34801561058357600080fd5b5061041e610592366004613893565b611047565b3480156105a357600080fd5b5061044e6105b23660046138bf565b61107d565b3480156105c357600080fd5b5061044e6105d23660046138bf565b6110ac565b3480156105e357600080fd5b5061044e6105f2366004613919565b611198565b34801561060357600080fd5b5061046160175481565b34801561061957600080fd5b5061044e610628366004613919565b611448565b34801561063957600080fd5b50610461610648366004613944565b611496565b34801561065957600080fd5b50610461601f5481565b34801561066f57600080fd5b50601e5461041e90600160a81b900460ff1681565b34801561069057600080fd5b5061044e61069f366004613919565b611525565b3480156106b057600080fd5b5061044e6106bf366004613919565b6116f4565b3480156106d057600080fd5b5061041e6106df366004613919565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561070957600080fd5b5061044e6107183660046138bf565b611740565b34801561072957600080fd5b50601254610461565b34801561073e57600080fd5b5061046160215481565b34801561075457600080fd5b5061046160195481565b34801561076a57600080fd5b5061044e611785565b34801561077f57600080fd5b5061044e61078e3660046138bf565b6117ee565b34801561079f57600080fd5b5061044e6107ae366004613919565b6119da565b3480156107bf57600080fd5b5061044e6107ce366004613919565b611a28565b3480156107df57600080fd5b506104616107ee366004613919565b611a74565b3480156107ff57600080fd5b5061044e611ad3565b34801561081457600080fd5b5061044e610823366004613974565b611b09565b34801561083457600080fd5b5061041e610843366004613919565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561086d57600080fd5b5061088973a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b6040516001600160a01b0390911681526020016103f5565b3480156108ad57600080fd5b506000546001600160a01b0316610889565b3480156108cb57600080fd5b5061044e6108da3660046138bf565b611c13565b3480156108eb57600080fd5b506103e8611c56565b34801561090057600080fd5b5061044e61090f366004613974565b611c65565b34801561092057600080fd5b5061041e61092f366004613893565b611d6c565b34801561094057600080fd5b5061041e61094f366004613893565b611dbb565b34801561096057600080fd5b5061044e61096f3660046138bf565b611dc8565b34801561098057600080fd5b50601e54610889906001600160a01b031681565b3480156109a057600080fd5b50600b54610889906001600160a01b031681565b3480156109c057600080fd5b5061044e6109cf366004613919565b611e0d565b3480156109e057600080fd5b50600a54610889906001600160a01b031681565b348015610a0057600080fd5b5061046160135481565b348015610a1657600080fd5b50601d54610889906001600160a01b031681565b348015610a3657600080fd5b5061044e610a453660046139e9565b611e58565b348015610a5657600080fd5b50600c54610889906001600160a01b031681565b348015610a7657600080fd5b5061044e610a85366004613919565b611eda565b348015610a9657600080fd5b5061044e610aa53660046138bf565b611f53565b348015610ab657600080fd5b5061044e610ac53660046138d8565b611f82565b348015610ad657600080fd5b5061044e610ae53660046138bf565b6120fb565b348015610af657600080fd5b50610461610b05366004613a06565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b348015610b3c57600080fd5b5061044e610b4b366004613919565b612137565b348015610b5c57600080fd5b5061046160225481565b348015610b7257600080fd5b5061044e610b81366004613919565b612182565b348015610b9257600080fd5b5061044e610ba1366004613919565b6121f0565b348015610bb257600080fd5b5061044e610bc1366004613919565b612288565b348015610bd257600080fd5b5061046160205481565b348015610be857600080fd5b5061041e610bf7366004613919565b6001600160a01b031660009081526006602052604090205460ff1690565b6060600d8054610c2490613a34565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5090613a34565b8015610c9d5780601f10610c7257610100808354040283529160200191610c9d565b820191906000526020600020905b815481529060010190602001808311610c8057829003601f168201915b5050505050905090565b6000610cb43384846122e2565b5060015b92915050565b6000546001600160a01b03163314610cf15760405162461bcd60e51b8152600401610ce890613a6f565b60405180910390fd5b600f54610d0d90610d069060ff16600a613b9e565b8290612406565b60205550565b6000610d20848484612412565b610d728433610d6d85604051806060016040528060288152602001613d98602891396001600160a01b038a16600090815260086020908152604080832033845290915290205491906128aa565b6122e2565b5060019392505050565b6000546001600160a01b03163314610da65760405162461bcd60e51b8152600401610ce890613a6f565b600f54610dbb90610d069060ff16600a613b9e565b60225550565b6000601154821115610e285760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610ce8565b6000610e326128d6565b9050610e3e83826128f9565b9392505050565b6000546001600160a01b03163314610e6f5760405162461bcd60e51b8152600401610ce890613a6f565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6000546001600160a01b03163314610eba5760405162461bcd60e51b8152600401610ce890613a6f565b6001600160a01b03811660009081526005602052604090205460ff16610f225760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610ce8565b60005b60095481101561104357816001600160a01b031660098281548110610f4c57610f4c613bad565b6000918252602090912001546001600160a01b031614156110315760098054610f7790600190613bc3565b81548110610f8757610f87613bad565b600091825260209091200154600980546001600160a01b039092169183908110610fb357610fb3613bad565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600590925220805460ff19169055600980548061100b5761100b613bda565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b8061103b81613bf0565b915050610f25565b5050565b3360008181526008602090815260408083206001600160a01b03871684529091528120549091610cb4918590610d6d90866122d6565b6000546001600160a01b031633146110a75760405162461bcd60e51b8152600401610ce890613a6f565b601555565b3360008181526005602052604090205460ff16156111215760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610ce8565b600061112c83612905565b5050506001600160a01b03861660009081526001602052604090205493945061115a93925084915050612960565b6001600160a01b0383166000908152600160205260409020556011546111809082612960565b60115560125461119090846122d6565b601255505050565b6000546001600160a01b031633146111c25760405162461bcd60e51b8152600401610ce890613a6f565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561120257600080fd5b505afa158015611216573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123a9190613c0b565b60405163e6a4390560e01b815230600482015273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860248201526001600160a01b03919091169063e6a439059060440160206040518083038186803b15801561129557600080fd5b505afa1580156112a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cd9190613c0b565b90506001600160a01b03811661140857816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561131657600080fd5b505afa15801561132a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134e9190613c0b565b6040516364e329cb60e11b815230600482015273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860248201526001600160a01b03919091169063c9c6539690604401602060405180830381600087803b1580156113ab57600080fd5b505af11580156113bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e39190613c0b565b601e80546001600160a01b0319166001600160a01b0392909216919091179055611424565b601e80546001600160a01b0319166001600160a01b0383161790555b50601d80546001600160a01b0319166001600160a01b039290921691909117905550565b6000546001600160a01b031633146114725760405162461bcd60e51b8152600401610ce890613a6f565b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b60006010548311156114ea5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610ce8565b8161150a5760006114fa84612905565b50949650610cb895505050505050565b600061151584612905565b50939650610cb895505050505050565b6000546001600160a01b0316331461154f5760405162461bcd60e51b8152600401610ce890613a6f565b737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03821614156115cb5760405162461bcd60e51b815260206004820152602660248201527f57652063616e206e6f74206578636c7564652070616e63616b6573776170207260448201526537baba32b91760d11b6064820152608401610ce8565b6001600160a01b03811660009081526005602052604090205460ff16156116345760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610ce8565b6001600160a01b0381166000908152600160205260409020541561168e576001600160a01b03811660009081526001602052604090205461167490610dc1565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600560205260408120805460ff191660019081179091556009805491820181559091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319169091179055565b6000546001600160a01b0316331461171e5760405162461bcd60e51b8152600401610ce890613a6f565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461176a5760405162461bcd60e51b8152600401610ce890613a6f565b600f5461177f90610d069060ff16600a613b9e565b601f5550565b6000546001600160a01b031633146117af5760405162461bcd60e51b8152600401610ce890613a6f565b3347156117eb576040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015611043573d6000803e3d6000fd5b50565b600f5461180390610d069060ff16600a613b9e565b9050336118225760405162461bcd60e51b8152600401610ce890613c28565b600081116118835760405162461bcd60e51b815260206004820152602860248201527f546f6b656e732076616c75652073686f756c642062652067726561746572207460448201526768656e205a65726f60c01b6064820152608401610ce8565b61188c33611a74565b8111156118fa5760405162461bcd60e51b815260206004820152603660248201527f546f6b656e732076616c75652073686f756c64206265206c657373207468656e60448201527520657175616c20746f20796f75722062616c616e636560501b6064820152608401610ce8565b600061190e6119076128d6565b8390612406565b3360009081526005602052604090205490915060ff161561195457336000908152600260205260409020546119439083612960565b336000908152600260205260409020555b3360009081526001602052604090205461196e9082612960565b3360009081526001602052604090205560105461198b9083612960565b60105560115461199b9082612960565b601155604051828152309033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6000546001600160a01b03163314611a045760405162461bcd60e51b8152600401610ce890613a6f565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000546001600160a01b03163314611a525760405162461bcd60e51b8152600401610ce890613a6f565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526005602052604081205460ff1615611ab157506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610cb890610dc1565b6000546001600160a01b03163314611afd5760405162461bcd60e51b8152600401610ce890613a6f565b611b07600061296c565b565b6000546001600160a01b03163314611b335760405162461bcd60e51b8152600401610ce890613a6f565b610320811115611b9e5760405162461bcd60e51b815260206004820152603060248201527f43616e206f6e6c7920626c61636b6c697374203830302061646472657373657360448201526f103832b9103a3930b739b0b1ba34b7b760811b6064820152608401610ce8565b60005b81811015611c0e57600160066000858585818110611bc157611bc1613bad565b9050602002016020810190611bd69190613919565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055611c0781613bf0565b9050611ba1565b505050565b6000546001600160a01b03163314611c3d5760405162461bcd60e51b8152600401610ce890613a6f565b6019819055601754611c509082906122d6565b601b5550565b6060600e8054610c2490613a34565b6000546001600160a01b03163314611c8f5760405162461bcd60e51b8152600401610ce890613a6f565b610320811115611cfc5760405162461bcd60e51b815260206004820152603260248201527f43616e206f6e6c7920756e626c61636b6c69737420383030206164647265737360448201527132b9903832b9103a3930b739b0b1ba34b7b760711b6064820152608401610ce8565b60005b81811015611c0e57600060066000858585818110611d1f57611d1f613bad565b9050602002016020810190611d349190613919565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055611d6581613bf0565b9050611cff565b6000610cb43384610d6d85604051806060016040528060258152602001613dc0602591393360009081526008602090815260408083206001600160a01b038d16845290915290205491906128aa565b6000610cb4338484612412565b6000546001600160a01b03163314611df25760405162461bcd60e51b8152600401610ce890613a6f565b600f54611e0790610d069060ff16600a613b9e565b60215550565b6000546001600160a01b03163314611e375760405162461bcd60e51b8152600401610ce890613a6f565b6001600160a01b03166000908152600360205260409020805460ff19169055565b6000546001600160a01b03163314611e825760405162461bcd60e51b8152600401610ce890613a6f565b601e8054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990611ecf90831515815260200190565b60405180910390a150565b6000546001600160a01b03163314611f045760405162461bcd60e51b8152600401610ce890613a6f565b6001600160a01b03811660009081526006602052604090205460ff16151560011415611f2d5750565b6001600160a01b0381166000908152600660205260409020805460ff1916600117905550565b6000546001600160a01b03163314611f7d5760405162461bcd60e51b8152600401610ce890613a6f565b601355565b6000546001600160a01b03163314611fac5760405162461bcd60e51b8152600401610ce890613a6f565b6040516370a0823160e01b815230600482015281906001600160a01b038516906370a082319060240160206040518083038186803b158015611fed57600080fd5b505afa158015612001573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120259190613c69565b10156120735760405162461bcd60e51b815260206004820152601e60248201527f57697468647261773a20496e73756666696369656e742062616c616e636500006044820152606401610ce8565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401602060405180830381600087803b1580156120bd57600080fd5b505af11580156120d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f59190613c82565b50505050565b6000546001600160a01b031633146121255760405162461bcd60e51b8152600401610ce890613a6f565b6017819055601954611c5090826122d6565b6000546001600160a01b031633146121615760405162461bcd60e51b8152600401610ce890613a6f565b6001600160a01b03166000908152600460205260409020805460ff19169055565b6000546001600160a01b031633146121ac5760405162461bcd60e51b8152600401610ce890613a6f565b6001600160a01b03811660009081526006602052604090205460ff166121cf5750565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000546001600160a01b0316331461221a5760405162461bcd60e51b8152600401610ce890613a6f565b6001600160a01b03811661227f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ce8565b6117eb8161296c565b6000546001600160a01b031633146122b25760405162461bcd60e51b8152600401610ce890613a6f565b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b6000610e3e8284613c9f565b6001600160a01b0383166123445760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ce8565b6001600160a01b0382166123a55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ce8565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610e3e8284613cb7565b6001600160a01b0383166124765760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610ce8565b6001600160a01b0382166124d85760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610ce8565b6000811161253a5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610ce8565b6001600160a01b03821660009081526003602052604090205460ff168061257657506022548161256984611a74565b6125739190613c9f565b11155b6125e85760405162461bcd60e51b815260206004820152603e60248201527f4d617820746f6b656e73206c696d697420666f722074686973206163636f756e60448201527f7420726561636865642e204f7220747279206c6f77657220616d6f756e7400006064820152608401610ce8565b6001600160a01b03831660009081526006602052604090205460ff16156126425760405162461bcd60e51b815260206004820152600e60248201526d165bdd48185c994818985b9b995960921b6044820152606401610ce8565b6001600160a01b03821660009081526006602052604090205460ff16156126ab5760405162461bcd60e51b815260206004820152601760248201527f54686520726563697069656e742069732062616e6e65640000000000000000006044820152606401610ce8565b601e546001600160a01b0384811691161415612744576001600160a01b03821660009081526007602052604090205460ff1661273f57601f5481111561273f5760405162461bcd60e51b815260206004820152602360248201527f42757920616d6f756e74206578636565647320746865206d61785478416d6f75604482015262373a1760e91b6064820152608401610ce8565b6127dd565b6001600160a01b03831660009081526007602052604090205460ff1615801561277a5750601e546001600160a01b038381169116145b156127dd576020548111156127dd5760405162461bcd60e51b8152602060048201526024808201527f53656c6c20616d6f756e74206578636565647320746865206d61785478416d6f6044820152633ab73a1760e11b6064820152608401610ce8565b60006127e830611a74565b602154909150811080159081906128095750601e54600160a01b900460ff16155b80156128235750601e546001600160a01b03868116911614155b80156128385750601e54600160a81b900460ff165b1561284b57602154915061284b826129bc565b6001600160a01b03851660009081526004602052604090205460019060ff168061288d57506001600160a01b03851660009081526004602052604090205460ff165b15612896575060005b6128a286868684612c58565b505050505050565b600081848411156128ce5760405162461bcd60e51b8152600401610ce89190613829565b505050900390565b60008060006128e3612de1565b90925090506128f282826128f9565b9250505090565b6000610e3e8284613cd6565b600080600080600080600080600080600061291f8c612f63565b935093509350935060008060006129408f87868861293b6128d6565b612fb2565b919f509d509b509599509397509195509350505050919395979092949650565b6000610e3e8284613bc3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b601e805460ff60a01b1916600160a01b1790556040516370a0823160e01b8152306004820152819073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489060009082906370a082319060240160206040518083038186803b158015612a2057600080fd5b505afa158015612a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a589190613c69565b60175490915015612b31576000612a7a6017548661240690919063ffffffff16565b9050612a91601b54826128f990919063ffffffff16565b9050612a9d8582612960565b600a54909450612ab6906001600160a01b031682613014565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a082319060240160206040518083038186803b158015612af557600080fd5b505afa158015612b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2d9190613c69565b9150505b60195415612c45576000612b468460026128f9565b90506000612b548583612960565b9050612b603083613014565b6040516370a0823160e01b8152306004820152600090612be69085906001600160a01b038816906370a082319060240160206040518083038186803b158015612ba857600080fd5b505afa158015612bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be09190613c69565b90612960565b600c54909150612c00906001600160a01b031683836131c8565b60408051848152602081018390529081018390527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505b5050601e805460ff60a01b191690555050565b80612c6557612c6561333a565b6001600160a01b03841660009081526005602052604090205460ff168015612ca657506001600160a01b03831660009081526005602052604090205460ff16155b15612cbb57612cb68484846133ad565b612db9565b6001600160a01b03841660009081526005602052604090205460ff16158015612cfc57506001600160a01b03831660009081526005602052604090205460ff165b15612d0c57612cb68484846134f4565b6001600160a01b03841660009081526005602052604090205460ff16158015612d4e57506001600160a01b03831660009081526005602052604090205460ff16155b15612d5e57612cb68484846135b3565b6001600160a01b03841660009081526005602052604090205460ff168015612d9e57506001600160a01b03831660009081526005602052604090205460ff165b15612dae57612cb684848461360d565b612db98484846135b3565b806120f5576120f5601a54601955601454601355601854601755601654601555601c54601b55565b6011546010546000918291825b600954811015612f3357826001600060098481548110612e1057612e10613bad565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612e7b5750816002600060098481548110612e5457612e54613bad565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612e9157601154601054945094505050509091565b612ed76001600060098481548110612eab57612eab613bad565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612960565b9250612f1f6002600060098481548110612ef357612ef3613bad565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612960565b915080612f2b81613bf0565b915050612dee565b50601054601154612f43916128f9565b821015612f5a576011546010549350935050509091565b90939092509050565b6000806000806000612f7486613696565b90506000612f81876136b9565b90506000612f8e886136d6565b90506000612fa283612be084818d89612960565b9993985091965094509092505050565b6000808080612fc18986612406565b90506000612fcf8987612406565b90506000612fdd8888612406565b90506000612feb8a89612406565b90506000612fff83612be084818989612960565b949d949c50929a509298505050505050505050565b6040805160038082526080820190925260009160208201606080368337019050509050308160008151811061304b5761304b613bad565b6001600160a01b03928316602091820292909201810191909152601d54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561309f57600080fd5b505afa1580156130b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d79190613c0b565b816001815181106130ea576130ea613bad565b60200260200101906001600160a01b031690816001600160a01b03168152505073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488160028151811061313257613132613bad565b6001600160a01b039283166020918202929092010152601d5461315891309116846122e2565b601d54604051635c11d79560e01b81526001600160a01b0390911690635c11d79590613191908590600090869089904290600401613cf8565b600060405180830381600087803b1580156131ab57600080fd5b505af11580156131bf573d6000803e3d6000fd5b50505050505050565b601d546131e09030906001600160a01b0316846122e2565b601d5460405163095ea7b360e01b81526001600160a01b0390911660048201526024810182905273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489063095ea7b390604401602060405180830381600087803b15801561324057600080fd5b505af1158015613254573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132789190613c82565b50601d5460405162e8e33760e81b815230600482015273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486024820152604481018490526064810183905260006084820181905260a48201526001600160a01b0385811660c48301524260e48301529091169063e8e337009061010401606060405180830381600087803b15801561330257600080fd5b505af1158015613316573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a29190613d69565b601b5415801561334a5750601354155b80156133565750601954155b80156133625750601754155b801561336e5750601554155b1561337557565b60198054601a55601380546014556017805460185560158054601655601b8054601c5560009384905591839055829055918190559055565b60008060008060008060006133c188612905565b965096509650965096509650965061340788600260008d6001600160a01b03166001600160a01b031681526020019081526020016000205461296090919063ffffffff16565b6001600160a01b038b166000908152600260209081526040808320939093556001905220546134369088612960565b6001600160a01b03808c1660009081526001602052604080822093909355908b168152205461346590876122d6565b6001600160a01b038a166000908152600160205260409020556134888a836136f3565b6134918161377d565b61349b8584613805565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516134e091815260200190565b60405180910390a350505050505050505050565b600080600080600080600061350888612905565b965096509650965096509650965061354e87600160008d6001600160a01b03166001600160a01b031681526020019081526020016000205461296090919063ffffffff16565b6001600160a01b03808c16600090815260016020908152604080832094909455918c1681526002909152205461358490856122d6565b6001600160a01b038a1660009081526002602090815260408083209390935560019052205461346590876122d6565b60008060008060008060006135c788612905565b965096509650965096509650965061343687600160008d6001600160a01b03166001600160a01b031681526020019081526020016000205461296090919063ffffffff16565b600080600080600080600061362188612905565b965096509650965096509650965061366788600260008d6001600160a01b03166001600160a01b031681526020019081526020016000205461296090919063ffffffff16565b6001600160a01b038b1660009081526002602090815260408083209390935560019052205461354e9088612960565b6000610cb86103e86136b36015548561240690919063ffffffff16565b906128f9565b6000610cb86103e86136b36013548561240690919063ffffffff16565b6000610cb86103e86136b3601b548561240690919063ffffffff16565b8015611043576001600160a01b03821661371f5760405162461bcd60e51b8152600401610ce890613c28565b60105461372c9082612960565b60105561374661373d6119076128d6565b60115490612960565b601155604051818152309033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016119ce565b60006137876128d6565b905060006137958383612406565b306000908152600160205260409020549091506137b290826122d6565b3060009081526001602090815260408083209390935560059052205460ff1615611c0e57306000908152600260205260409020546137f090846122d6565b30600090815260026020526040902055505050565b6011546138129083612960565b60115560125461382290826122d6565b6012555050565b600060208083528351808285015260005b818110156138565785810183015185820160400152820161383a565b81811115613868576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146117eb57600080fd5b600080604083850312156138a657600080fd5b82356138b18161387e565b946020939093013593505050565b6000602082840312156138d157600080fd5b5035919050565b6000806000606084860312156138ed57600080fd5b83356138f88161387e565b925060208401356139088161387e565b929592945050506040919091013590565b60006020828403121561392b57600080fd5b8135610e3e8161387e565b80151581146117eb57600080fd5b6000806040838503121561395757600080fd5b82359150602083013561396981613936565b809150509250929050565b6000806020838503121561398757600080fd5b823567ffffffffffffffff8082111561399f57600080fd5b818501915085601f8301126139b357600080fd5b8135818111156139c257600080fd5b8660208260051b85010111156139d757600080fd5b60209290920196919550909350505050565b6000602082840312156139fb57600080fd5b8135610e3e81613936565b60008060408385031215613a1957600080fd5b8235613a248161387e565b915060208301356139698161387e565b600181811c90821680613a4857607f821691505b60208210811415613a6957634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115613af5578160001904821115613adb57613adb613aa4565b80851615613ae857918102915b93841c9390800290613abf565b509250929050565b600082613b0c57506001610cb8565b81613b1957506000610cb8565b8160018114613b2f5760028114613b3957613b55565b6001915050610cb8565b60ff841115613b4a57613b4a613aa4565b50506001821b610cb8565b5060208310610133831016604e8410600b8410161715613b78575081810a610cb8565b613b828383613aba565b8060001904821115613b9657613b96613aa4565b029392505050565b6000610e3e60ff841683613afd565b634e487b7160e01b600052603260045260246000fd5b600082821015613bd557613bd5613aa4565b500390565b634e487b7160e01b600052603160045260246000fd5b6000600019821415613c0457613c04613aa4565b5060010190565b600060208284031215613c1d57600080fd5b8151610e3e8161387e565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b600060208284031215613c7b57600080fd5b5051919050565b600060208284031215613c9457600080fd5b8151610e3e81613936565b60008219821115613cb257613cb2613aa4565b500190565b6000816000190483118215151615613cd157613cd1613aa4565b500290565b600082613cf357634e487b7160e01b600052601260045260246000fd5b500490565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613d485784516001600160a01b031683529383019391830191600101613d23565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215613d7e57600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e999c5282c5d2ff5599d3a46984c9ad723c029d1d12549e63345c52ad8e2046264736f6c63430008090033

Deployed Bytecode Sourcemap

52651:28564:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57356:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58272:161;;;;;;;;;;-1:-1:-1;58272:161:0;;;;;:::i;:::-;;:::i;:::-;;;1237:14:1;;1230:22;1212:41;;1200:2;1185:18;58272:161:0;1072:187:1;63598:140:0;;;;;;;;;;-1:-1:-1;63598:140:0;;;;;:::i;:::-;;:::i;:::-;;57633:95;;;;;;;;;;-1:-1:-1;57713:7:0;;57633:95;;;1595:25:1;;;1583:2;1568:18;57633:95:0;1449:177:1;58445:314:0;;;;;;;;;;-1:-1:-1;58445:314:0;;;;;:::i;:::-;;:::i;63900:143::-;;;;;;;;;;-1:-1:-1;63900:143:0;;;;;:::i;:::-;;:::i;52878:57::-;;;;;;;;;;-1:-1:-1;52878:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;60362:253;;;;;;;;;;-1:-1:-1;60362:253:0;;;;;:::i;:::-;;:::i;62613:126::-;;;;;;;;;;-1:-1:-1;62613:126:0;;;;;:::i;:::-;;:::i;57542:83::-;;;;;;;;;;-1:-1:-1;57608:9:0;;57542:83;;57608:9;;;;2486:36:1;;2474:2;2459:18;57542:83:0;2344:184:1;54014:44:0;;;;;;;;;;;;;;;;61087:479;;;;;;;;;;-1:-1:-1;61087:479:0;;;;;:::i;:::-;;:::i;58771:218::-;;;;;;;;;;-1:-1:-1;58771:218:0;;;;;:::i;:::-;;:::i;63304:103::-;;;;;;;;;;-1:-1:-1;63304:103:0;;;;;:::i;:::-;;:::i;59522:378::-;;;;;;;;;;-1:-1:-1;59522:378:0;;;;;:::i;:::-;;:::i;80349:625::-;;;;;;;;;;-1:-1:-1;80349:625:0;;;;;:::i;:::-;;:::i;54130:44::-;;;;;;;;;;;;;;;;62228:111;;;;;;;;;;-1:-1:-1;62228:111:0;;;;;:::i;:::-;;:::i;59912:438::-;;;;;;;;;;-1:-1:-1;59912:438:0;;;;;:::i;:::-;;:::i;54682:84::-;;;;;;;;;;;;;;;;54623:46;;;;;;;;;;-1:-1:-1;54623:46:0;;;;-1:-1:-1;;;54623:46:0;;;;;;60627:448;;;;;;;;;;-1:-1:-1;60627:448:0;;;;;:::i;:::-;;:::i;64202:143::-;;;;;;;;;;-1:-1:-1;64202:143:0;;;;;:::i;:::-;;:::i;68721:123::-;;;;;;;;;;-1:-1:-1;68721:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;68809:27:0;68785:4;68809:27;;;:18;:27;;;;;;;;;68721:123;63750:138;;;;;;;;;;-1:-1:-1;63750:138:0;;;;;:::i;:::-;;:::i;59414:96::-;;;;;;;;;;-1:-1:-1;59492:10:0;;59414:96;;54864:76;;;;;;;;;;;;;;;;54248:44;;;;;;;;;;;;;;;;80054:209;;;;;;;;;;;;;:::i;79305:737::-;;;;;;;;;;-1:-1:-1;79305:737:0;;;;;:::i;:::-;;:::i;62473:128::-;;;;;;;;;;-1:-1:-1;62473:128:0;;;;;:::i;:::-;;:::i;64055:135::-;;;;;;;;;;-1:-1:-1;64055:135:0;;;;;:::i;:::-;;:::i;57736:198::-;;;;;;;;;;-1:-1:-1;57736:198:0;;;;;:::i;:::-;;:::i;10503:103::-;;;;;;;;;;;;;:::i;78356:300::-;;;;;;;;;;-1:-1:-1;78356:300:0;;;;;:::i;:::-;;:::i;59282:120::-;;;;;;;;;;-1:-1:-1;59282:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;59374:20:0;59350:4;59374:20;;;:11;:20;;;;;;;;;59282:120;55033:73;;;;;;;;;;;;55064:42;55033:73;;;;;-1:-1:-1;;;;;4014:32:1;;;3996:51;;3984:2;3969:18;55033:73:0;3850:203:1;9852:87:0;;;;;;;;;;-1:-1:-1;9898:7:0;9925:6;-1:-1:-1;;;;;9925:6:0;9852:87;;63419:167;;;;;;;;;;-1:-1:-1;63419:167:0;;;;;:::i;:::-;;:::i;57447:87::-;;;;;;;;;;;;;:::i;78992:305::-;;;;;;;;;;-1:-1:-1;78992:305:0;;;;;:::i;:::-;;:::i;59001:269::-;;;;;;;;;;-1:-1:-1;59001:269:0;;;;;:::i;:::-;;:::i;57942:167::-;;;;;;;;;;-1:-1:-1;57942:167:0;;;;;:::i;:::-;;:::i;68856:171::-;;;;;;;;;;-1:-1:-1;68856:171:0;;;;;:::i;:::-;;:::i;54556:26::-;;;;;;;;;;-1:-1:-1;54556:26:0;;;;-1:-1:-1;;;;;54556:26:0;;;53401:94;;;;;;;;;;-1:-1:-1;53401:94:0;;;;-1:-1:-1;;;;;53401:94:0;;;62887:122;;;;;;;;;;-1:-1:-1;62887:122:0;;;;;:::i;:::-;;:::i;53300:94::-;;;;;;;;;;-1:-1:-1;53300:94:0;;;;-1:-1:-1;;;;;53300:94:0;;;53904:44;;;;;;;;;;;;;;;;54512:37;;;;;;;;;;-1:-1:-1;54512:37:0;;;;-1:-1:-1;;;;;54512:37:0;;;64354:171;;;;;;;;;;-1:-1:-1;64354:171:0;;;;;:::i;:::-;;:::i;53502:44::-;;;;;;;;;;-1:-1:-1;53502:44:0;;;;-1:-1:-1;;;;;53502:44:0;;;78170:174;;;;;;;;;;-1:-1:-1;78170:174:0;;;;;:::i;:::-;;:::i;63021:94::-;;;;;;;;;;-1:-1:-1;63021:94:0;;;;;:::i;:::-;;:::i;80982:230::-;;;;;;;;;;-1:-1:-1;80982:230:0;;;;;:::i;:::-;;:::i;63127:165::-;;;;;;;;;;-1:-1:-1;63127:165:0;;;;;:::i;:::-;;:::i;58117:143::-;;;;;;;;;;-1:-1:-1;58117:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;58225:18:0;;;58198:7;58225:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;58117:143;62351:110;;;;;;;;;;-1:-1:-1;62351:110:0;;;;;:::i;:::-;;:::i;54947:77::-;;;;;;;;;;;;;;;;78799:181;;;;;;;;;;-1:-1:-1;78799:181:0;;;;;:::i;:::-;;:::i;10761:201::-;;;;;;;;;;-1:-1:-1;10761:201:0;;;;;:::i;:::-;;:::i;62751:124::-;;;;;;;;;;-1:-1:-1;62751:124:0;;;;;:::i;:::-;;:::i;54773:84::-;;;;;;;;;;;;;;;;78668:119;;;;;;;;;;-1:-1:-1;78668:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;78754:25:0;78731:4;78754:25;;;:14;:25;;;;;;;;;78668:119;57356:83;57393:13;57426:5;57419:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57356:83;:::o;58272:161::-;58347:4;58364:39;8655:10;58387:7;58396:6;58364:8;:39::i;:::-;-1:-1:-1;58421:4:0;58272:161;;;;;:::o;63598:140::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;;;;;;;;;63719:9:::1;::::0;63698:32:::1;::::0;63715:13:::1;::::0;63719:9:::1;;63715:2;:13;:::i;:::-;63698:11:::0;;:15:::1;:32::i;:::-;63679:16;:51:::0;-1:-1:-1;63598:140:0:o;58445:314::-;58543:4;58560:36;58570:6;58578:9;58589:6;58560:9;:36::i;:::-;58607:121;58616:6;8655:10;58638:89;58676:6;58638:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58638:19:0;;;;;;:11;:19;;;;;;;;8655:10;58638:33;;;;;;;;;;:37;:89::i;:::-;58607:8;:121::i;:::-;-1:-1:-1;58747:4:0;58445:314;;;;;:::o;63900:143::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;64024:9:::1;::::0;64005:30:::1;::::0;64020:13:::1;::::0;64024:9:::1;;64020:2;:13;:::i;64005:30::-;63982:20;:53:::0;-1:-1:-1;63900:143:0:o;60362:253::-;60428:7;60467;;60456;:18;;60448:73;;;;-1:-1:-1;;;60448:73:0;;8092:2:1;60448:73:0;;;8074:21:1;8131:2;8111:18;;;8104:30;8170:34;8150:18;;;8143:62;-1:-1:-1;;;8221:18:1;;;8214:40;8271:19;;60448:73:0;7890:406:1;60448:73:0;60532:19;60555:10;:8;:10::i;:::-;60532:33;-1:-1:-1;60583:24:0;:7;60532:33;60583:11;:24::i;:::-;60576:31;60362:253;-1:-1:-1;;;60362:253:0:o;62613:126::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62688:35:0::1;62726:5;62688:35:::0;;;:26:::1;:35;::::0;;;;:43;;-1:-1:-1;;62688:43:0::1;::::0;;62613:126::o;61087:479::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;61169:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;61161:60;;;::::0;-1:-1:-1;;;61161:60:0;;8503:2:1;61161:60:0::1;::::0;::::1;8485:21:1::0;8542:2;8522:18;;;8515:30;8581:29;8561:18;;;8554:57;8628:18;;61161:60:0::1;8301:351:1::0;61161:60:0::1;61237:9;61232:327;61256:9;:16:::0;61252:20;::::1;61232:327;;;61314:7;-1:-1:-1::0;;;;;61298:23:0::1;:9;61308:1;61298:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;61298:12:0::1;:23;61294:254;;;61357:9;61367:16:::0;;:20:::1;::::0;61386:1:::1;::::0;61367:20:::1;:::i;:::-;61357:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;61342:9:::1;:12:::0;;-1:-1:-1;;;;;61357:31:0;;::::1;::::0;61352:1;;61342:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;61342:46:0::1;-1:-1:-1::0;;;;;61342:46:0;;::::1;;::::0;;61407:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;61446:11:::1;:20:::0;;;;:28;;-1:-1:-1;;61446:28:0::1;::::0;;61493:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;61493:15:0;;;;;-1:-1:-1;;;;;;61493:15:0::1;::::0;;;;;61232:327:::1;61087:479:::0;:::o;61294:254::-:1;61274:3:::0;::::1;::::0;::::1;:::i;:::-;;;;61232:327;;;;61087:479:::0;:::o;58771:218::-;8655:10;58859:4;58908:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;58908:34:0;;;;;;;;;;58859:4;;58876:83;;58899:7;;58908:50;;58947:10;58908:38;:50::i;63304:103::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;63379:14:::1;:20:::0;63304:103::o;59522:378::-;8655:10;59574:14;59623:19;;;:11;:19;;;;;;;;59622:20;59614:77;;;;-1:-1:-1;;;59614:77:0;;9393:2:1;59614:77:0;;;9375:21:1;9432:2;9412:18;;;9405:30;9471:34;9451:18;;;9444:62;-1:-1:-1;;;9522:18:1;;;9515:42;9574:19;;59614:77:0;9191:408:1;59614:77:0;59703:15;59728:19;59739:7;59728:10;:19::i;:::-;-1:-1:-1;;;;;;;;59776:15:0;;;;;;:7;:15;;;;;;59702:45;;-1:-1:-1;59776:28:0;;:15;-1:-1:-1;59702:45:0;;-1:-1:-1;;59776:19:0;:28::i;:::-;-1:-1:-1;;;;;59758:15:0;;;;;;:7;:15;;;;;:46;59825:7;;:20;;59837:7;59825:11;:20::i;:::-;59815:7;:30;59869:10;;:23;;59884:7;59869:14;:23::i;:::-;59856:10;:36;-1:-1:-1;;;59522:378:0:o;80349:625::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;80424:34:::1;80478:9;80424:64;;80623:15;80657:17;-1:-1:-1::0;;;;;80657:25:0::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80641:73;::::0;-1:-1:-1;;;80641:73:0;;80702:4:::1;80641:73;::::0;::::1;10072:34:1::0;55064:42:0::1;10122:18:1::0;;;10115:43;-1:-1:-1;;;;;80641:52:0;;;::::1;::::0;::::1;::::0;10007:18:1;;80641:73:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80623:91:::0;-1:-1:-1;;;;;;80729:21:0;::::1;80725:198;;80797:17;-1:-1:-1::0;;;;;80797:25:0::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80781:76;::::0;-1:-1:-1;;;80781:76:0;;80845:4:::1;80781:76;::::0;::::1;10072:34:1::0;55064:42:0::1;10122:18:1::0;;;10115:43;-1:-1:-1;;;;;80781:55:0;;;::::1;::::0;::::1;::::0;10007:18:1;;80781:76:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80767:11;:90:::0;;-1:-1:-1;;;;;;80767:90:0::1;-1:-1:-1::0;;;;;80767:90:0;;;::::1;::::0;;;::::1;::::0;;80725:198:::1;;;80890:11;:21:::0;;-1:-1:-1;;;;;;80890:21:0::1;-1:-1:-1::0;;;;;80890:21:0;::::1;;::::0;;80725:198:::1;-1:-1:-1::0;80933:13:0::1;:33:::0;;-1:-1:-1;;;;;;80933:33:0::1;-1:-1:-1::0;;;;;80933:33:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;80349:625:0:o;62228:111::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62297:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;62297:34:0::1;62327:4;62297:34;::::0;;62228:111::o;59912:438::-;60002:7;60041;;60030;:18;;60022:62;;;;-1:-1:-1;;;60022:62:0;;10371:2:1;60022:62:0;;;10353:21:1;10410:2;10390:18;;;10383:30;10449:33;10429:18;;;10422:61;10500:18;;60022:62:0;10169:355:1;60022:62:0;60100:17;60095:248;;60135:15;60160:19;60171:7;60160:10;:19::i;:::-;-1:-1:-1;60134:45:0;;-1:-1:-1;60194:14:0;;-1:-1:-1;;;;;;60194:14:0;60095:248;60243:23;60275:19;60286:7;60275:10;:19::i;:::-;-1:-1:-1;60241:53:0;;-1:-1:-1;60309:22:0;;-1:-1:-1;;;;;;60309:22:0;60627:448;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;60720:42:::1;-1:-1:-1::0;;;;;60709:53:0;::::1;;;60701:104;;;::::0;-1:-1:-1;;;60701:104:0;;10731:2:1;60701:104:0::1;::::0;::::1;10713:21:1::0;10770:2;10750:18;;;10743:30;10809:34;10789:18;;;10782:62;-1:-1:-1;;;10860:18:1;;;10853:36;10906:19;;60701:104:0::1;10529:402:1::0;60701:104:0::1;-1:-1:-1::0;;;;;60825:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;60824:21;60816:61;;;::::0;-1:-1:-1;;;60816:61:0;;8503:2:1;60816:61:0::1;::::0;::::1;8485:21:1::0;8542:2;8522:18;;;8515:30;8581:29;8561:18;;;8554:57;8628:18;;60816:61:0::1;8301:351:1::0;60816:61:0::1;-1:-1:-1::0;;;;;60891:16:0;::::1;60910:1;60891:16:::0;;;:7:::1;:16;::::0;;;;;:20;60888:108:::1;;-1:-1:-1::0;;;;;60967:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;60947:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;60928:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;60888:108:::1;-1:-1:-1::0;;;;;61006:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;61006:27:0::1;61029:4;61006:27:::0;;::::1;::::0;;;61044:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;61044:23:0::1;::::0;;::::1;::::0;;60627:448::o;64202:143::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;64297:21:::1;:40:::0;;-1:-1:-1;;;;;;64297:40:0::1;-1:-1:-1::0;;;;;64297:40:0;;;::::1;::::0;;;::::1;::::0;;64202:143::o;63750:138::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;63869:9:::1;::::0;63848:32:::1;::::0;63865:13:::1;::::0;63869:9:::1;;63865:2;:13;:::i;63848:32::-;63830:15;:50:::0;-1:-1:-1;63750:138:0:o;80054:209::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;8655:10;80174:21:::1;:25:::0;80171:84:::1;;80214:41;::::0;-1:-1:-1;;;;;80214:18:0;::::1;::::0;80233:21:::1;80214:41:::0;::::1;;;::::0;::::1;::::0;;;80233:21;80214:18;:41;::::1;;;;;;;;;;;;;::::0;::::1;;;;80171:84;80100:163;80054:209::o:0;79305:737::-;79386:9;;79370:27;;79382:13;;79386:9;;79382:2;:13;:::i;79370:27::-;79361:36;-1:-1:-1;79416:10:0;79408:70;;;;-1:-1:-1;;;79408:70:0;;;;;;;:::i;:::-;79506:1;79497:6;:10;79489:63;;;;-1:-1:-1;;;79489:63:0;;11540:2:1;79489:63:0;;;11522:21:1;11579:2;11559:18;;;11552:30;11618:34;11598:18;;;11591:62;-1:-1:-1;;;11669:18:1;;;11662:38;11717:19;;79489:63:0;11338:404:1;79489:63:0;79581:21;79591:10;79581:9;:21::i;:::-;79571:6;:31;;79563:98;;;;-1:-1:-1;;;79563:98:0;;11949:2:1;79563:98:0;;;11931:21:1;11988:2;11968:18;;;11961:30;12027:34;12007:18;;;12000:62;-1:-1:-1;;;12078:18:1;;;12071:52;12140:19;;79563:98:0;11747:418:1;79563:98:0;79682:15;79700:22;79711:10;:8;:10::i;:::-;79700:6;;:10;:22::i;:::-;79748:10;79736:23;;;;:11;:23;;;;;;79682:40;;-1:-1:-1;79736:23:0;;79733:94;;;79804:10;79796:19;;;;:7;:19;;;;;;:31;;79820:6;79796:23;:31::i;:::-;79782:10;79774:19;;;;:7;:19;;;;;:53;79733:94;79868:10;79860:19;;;;:7;:19;;;;;;:32;;79884:7;79860:23;:32::i;:::-;79846:10;79838:19;;;;:7;:19;;;;;:54;79913:7;;:19;;79925:6;79913:11;:19::i;:::-;79903:7;:29;79953:7;;:20;;79965:7;79953:11;:20::i;:::-;79943:7;:30;79991:43;;1595:25:1;;;80020:4:0;;80000:10;;79991:43;;1583:2:1;1568:18;79991:43:0;;;;;;;;79350:692;79305:737;:::o;62473:128::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62551:35:0::1;;::::0;;;:26:::1;:35;::::0;;;;:42;;-1:-1:-1;;62551:42:0::1;62589:4;62551:42;::::0;;62473:128::o;64055:135::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;64148:16:::1;:34:::0;;-1:-1:-1;;;;;;64148:34:0::1;-1:-1:-1::0;;;;;64148:34:0;;;::::1;::::0;;;::::1;::::0;;64055:135::o;57736:198::-;-1:-1:-1;;;;;57826:20:0;;57802:7;57826:20;;;:11;:20;;;;;;;;57822:49;;;-1:-1:-1;;;;;;57855:16:0;;;;;:7;:16;;;;;;;57736:198::o;57822:49::-;-1:-1:-1;;;;;57909:16:0;;;;;;:7;:16;;;;;;57889:37;;:19;:37::i;10503:103::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;10568:30:::1;10595:1;10568:18;:30::i;:::-;10503:103::o:0;78356:300::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;78477:3:::1;78457:23:::0;::::1;;78449:84;;;::::0;-1:-1:-1;;;78449:84:0;;12372:2:1;78449:84:0::1;::::0;::::1;12354:21:1::0;12411:2;12391:18;;;12384:30;12450:34;12430:18;;;12423:62;-1:-1:-1;;;12501:18:1;;;12494:46;12557:19;;78449:84:0::1;12170:412:1::0;78449:84:0::1;78549:9;78544:105;78560:20:::0;;::::1;78544:105;;;78633:4;78602:14;:28;78617:9;;78627:1;78617:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;78602:28:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;78602:28:0;:35;;-1:-1:-1;;78602:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;78582:3:::1;::::0;::::1;:::i;:::-;;;78544:105;;;;78356:300:::0;;:::o;63419:167::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;63496:13:::1;:19:::0;;;63565:12:::1;::::0;63547:31:::1;::::0;63512:3;;63547:17:::1;:31::i;:::-;63526:18;:52:::0;-1:-1:-1;63419:167:0:o;57447:87::-;57486:13;57519:7;57512:14;;;;;:::i;78992:305::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;79115:3:::1;79095:23:::0;::::1;;79087:86;;;::::0;-1:-1:-1;;;79087:86:0;;12789:2:1;79087:86:0::1;::::0;::::1;12771:21:1::0;12828:2;12808:18;;;12801:30;12867:34;12847:18;;;12840:62;-1:-1:-1;;;12918:18:1;;;12911:48;12976:19;;79087:86:0::1;12587:414:1::0;79087:86:0::1;79189:9;79184:106;79200:20:::0;;::::1;79184:106;;;79273:5;79242:14;:28;79257:9;;79267:1;79257:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;79242:28:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;79242:28:0;:36;;-1:-1:-1;;79242:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;79222:3:::1;::::0;::::1;:::i;:::-;;;79184:106;;59001:269:::0;59094:4;59111:129;8655:10;59134:7;59143:96;59182:15;59143:96;;;;;;;;;;;;;;;;;8655:10;59143:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;59143:34:0;;;;;;;;;;;;:38;:96::i;57942:167::-;58020:4;58037:42;8655:10;58061:9;58072:6;58037:9;:42::i;68856:171::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;69008:9:::1;::::0;68984:35:::1;::::0;69004:13:::1;::::0;69008:9:::1;;69004:2;:13;:::i;68984:35::-;68954:27;:65:::0;-1:-1:-1;68856:171:0:o;62887:122::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62960:33:0::1;62996:5;62960:33:::0;;;:24:::1;:33;::::0;;;;:41;;-1:-1:-1;;62960:41:0::1;::::0;;62887:122::o;64354:171::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;64431:21:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;64431:32:0::1;-1:-1:-1::0;;;;64431:32:0;;::::1;;::::0;;64479:38:::1;::::0;::::1;::::0;::::1;::::0;64455:8;1237:14:1;1230:22;1212:41;;1200:2;1185:18;;1072:187;64479:38:0::1;;;;;;;;64354:171:::0;:::o;78170:174::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;78252:25:0;::::1;;::::0;;;:14:::1;:25;::::0;;;;;::::1;;:33;;:25:::0;:33:::1;78249:45;;;80100:163;80054:209::o:0;78249:45::-:1;-1:-1:-1::0;;;;;78304:25:0;::::1;;::::0;;;:14:::1;:25;::::0;;;;:32;;-1:-1:-1;;78304:32:0::1;78332:4;78304:32;::::0;;78170:174;:::o;63021:94::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;63093:8:::1;:14:::0;63021:94::o;80982:230::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;81085:30:::1;::::0;-1:-1:-1;;;81085:30:0;;81109:4:::1;81085:30;::::0;::::1;3996:51:1::0;81119:6:0;;-1:-1:-1;;;;;81085:15:0;::::1;::::0;::::1;::::0;3969:18:1;;81085:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;81077:83;;;::::0;-1:-1:-1;;;81077:83:0;;13397:2:1;81077:83:0::1;::::0;::::1;13379:21:1::0;13436:2;13416:18;;;13409:30;13475:32;13455:18;;;13448:60;13525:18;;81077:83:0::1;13195:354:1::0;81077:83:0::1;81171:33;::::0;-1:-1:-1;;;81171:33:0;;-1:-1:-1;;;;;13746:32:1;;;81171:33:0::1;::::0;::::1;13728:51:1::0;13795:18;;;13788:34;;;81171:14:0;::::1;::::0;::::1;::::0;13701:18:1;;81171:33:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;80982:230:::0;;;:::o;63127:165::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;63203:12:::1;:18:::0;;;63253:13:::1;::::0;:31:::1;::::0;63218:3;63253:17:::1;:31::i;62351:110::-:0;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62418:27:0::1;62448:5;62418:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;62418:35:0::1;::::0;;62351:110::o;78799:181::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;78886:25:0;::::1;;::::0;;;:14:::1;:25;::::0;;;;;::::1;;78883:46;;80100:163;80054:209::o:0;78883:46::-:1;-1:-1:-1::0;;;;;78939:25:0::1;78967:5;78939:25:::0;;;:14:::1;:25;::::0;;;;:33;;-1:-1:-1;;78939:33:0::1;::::0;;78799:181::o;10761:201::-;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10850:22:0;::::1;10842:73;;;::::0;-1:-1:-1;;;10842:73:0;;14285:2:1;10842:73:0::1;::::0;::::1;14267:21:1::0;14324:2;14304:18;;;14297:30;14363:34;14343:18;;;14336:62;-1:-1:-1;;;14414:18:1;;;14407:36;14460:19;;10842:73:0::1;14083:402:1::0;10842:73:0::1;10926:28;10945:8;10926:18;:28::i;62751:124::-:0;9898:7;9925:6;-1:-1:-1;;;;;9925:6:0;8655:10;10072:23;10064:68;;;;-1:-1:-1;;;10064:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62827:33:0::1;;::::0;;;:24:::1;:33;::::0;;;;:40;;-1:-1:-1;;62827:40:0::1;62863:4;62827:40;::::0;;62751:124::o;40386:98::-;40444:7;40471:5;40475:1;40471;:5;:::i;69039:337::-;-1:-1:-1;;;;;69132:19:0;;69124:68;;;;-1:-1:-1;;;69124:68:0;;14825:2:1;69124:68:0;;;14807:21:1;14864:2;14844:18;;;14837:30;14903:34;14883:18;;;14876:62;-1:-1:-1;;;14954:18:1;;;14947:34;14998:19;;69124:68:0;14623:400:1;69124:68:0;-1:-1:-1;;;;;69211:21:0;;69203:68;;;;-1:-1:-1;;;69203:68:0;;15230:2:1;69203:68:0;;;15212:21:1;15269:2;15249:18;;;15242:30;15308:34;15288:18;;;15281:62;-1:-1:-1;;;15359:18:1;;;15352:32;15401:19;;69203:68:0;15028:398:1;69203:68:0;-1:-1:-1;;;;;69284:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;69336:32;;1595:25:1;;;69336:32:0;;1568:18:1;69336:32:0;;;;;;;69039:337;;;:::o;41124:98::-;41182:7;41209:5;41213:1;41209;:5;:::i;69388:2228::-;-1:-1:-1;;;;;69510:18:0;;69502:68;;;;-1:-1:-1;;;69502:68:0;;15806:2:1;69502:68:0;;;15788:21:1;15845:2;15825:18;;;15818:30;15884:34;15864:18;;;15857:62;-1:-1:-1;;;15935:18:1;;;15928:35;15980:19;;69502:68:0;15604:401:1;69502:68:0;-1:-1:-1;;;;;69589:16:0;;69581:64;;;;-1:-1:-1;;;69581:64:0;;16212:2:1;69581:64:0;;;16194:21:1;16251:2;16231:18;;;16224:30;16290:34;16270:18;;;16263:62;-1:-1:-1;;;16341:18:1;;;16334:33;16384:19;;69581:64:0;16010:399:1;69581:64:0;69673:1;69664:6;:10;69656:64;;;;-1:-1:-1;;;69656:64:0;;16616:2:1;69656:64:0;;;16598:21:1;16655:2;16635:18;;;16628:30;16694:34;16674:18;;;16667:62;-1:-1:-1;;;16745:18:1;;;16738:39;16794:19;;69656:64:0;16414:405:1;69656:64:0;-1:-1:-1;;;;;69739:28:0;;;;;;:24;:28;;;;;;;;;:78;;;69797:20;;69787:6;69771:13;69781:2;69771:9;:13::i;:::-;:22;;;;:::i;:::-;:46;;69739:78;69731:162;;;;-1:-1:-1;;;69731:162:0;;17026:2:1;69731:162:0;;;17008:21:1;17065:2;17045:18;;;17038:30;17104:34;17084:18;;;17077:62;17175:32;17155:18;;;17148:60;17225:19;;69731:162:0;16824:426:1;69731:162:0;-1:-1:-1;;;;;69913:20:0;;;;;;:14;:20;;;;;;;;69912:21;69904:48;;;;-1:-1:-1;;;69904:48:0;;17457:2:1;69904:48:0;;;17439:21:1;17496:2;17476:18;;;17469:30;-1:-1:-1;;;17515:18:1;;;17508:44;17569:18;;69904:48:0;17255:338:1;69904:48:0;-1:-1:-1;;;;;69972:18:0;;;;;;:14;:18;;;;;;;;69971:19;69963:55;;;;-1:-1:-1;;;69963:55:0;;17800:2:1;69963:55:0;;;17782:21:1;17839:2;17819:18;;;17812:30;17878:25;17858:18;;;17851:53;17921:18;;69963:55:0;17598:347:1;69963:55:0;70040:11;;-1:-1:-1;;;;;70032:19:0;;;70040:11;;70032:19;70029:377;;;-1:-1:-1;;;;;70081:30:0;;;;;;:26;:30;;;;;;;;70077:126;;70148:15;;70138:6;:25;;70130:73;;;;-1:-1:-1;;;70130:73:0;;18152:2:1;70130:73:0;;;18134:21:1;18191:2;18171:18;;;18164:30;18230:34;18210:18;;;18203:62;-1:-1:-1;;;18281:18:1;;;18274:33;18324:19;;70130:73:0;17950:399:1;70130:73:0;70029:377;;;-1:-1:-1;;;;;70240:32:0;;;;;;:26;:32;;;;;;;;70239:33;:54;;;;-1:-1:-1;70282:11:0;;-1:-1:-1;;;;;70276:17:0;;;70282:11;;70276:17;70239:54;70236:170;;;70337:16;;70327:6;:26;;70319:75;;;;-1:-1:-1;;;70319:75:0;;18556:2:1;70319:75:0;;;18538:21:1;18595:2;18575:18;;;18568:30;18634:34;18614:18;;;18607:62;-1:-1:-1;;;18685:18:1;;;18678:34;18729:19;;70319:75:0;18354:400:1;70319:75:0;70704:28;70735:24;70753:4;70735:9;:24::i;:::-;70831:27;;70704:55;;-1:-1:-1;70807:51:0;;;;;;;70887:53;;-1:-1:-1;70924:16:0;;-1:-1:-1;;;70924:16:0;;;;70923:17;70887:53;:89;;;;-1:-1:-1;70965:11:0;;-1:-1:-1;;;;;70957:19:0;;;70965:11;;70957:19;;70887:89;:127;;;;-1:-1:-1;70993:21:0;;-1:-1:-1;;;70993:21:0;;;;70887:127;70869:314;;;71064:27;;71041:50;;71135:36;71150:20;71135:14;:36::i;:::-;-1:-1:-1;;;;;71391:24:0;;71264:12;71391:24;;;:18;:24;;;;;;71279:4;;71391:24;;;:50;;-1:-1:-1;;;;;;71419:22:0;;;;;;:18;:22;;;;;;;;71391:50;71388:96;;;-1:-1:-1;71467:5:0;71388:96;71570:38;71585:4;71590:2;71593:6;71600:7;71570:14;:38::i;:::-;69491:2125;;;69388:2228;;;:::o;42665:240::-;42785:7;42846:12;42838:6;;;;42830:29;;;;-1:-1:-1;;;42830:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;42881:5:0;;;42665:240::o;66139:163::-;66180:7;66201:15;66218;66237:19;:17;:19::i;:::-;66200:56;;-1:-1:-1;66200:56:0;-1:-1:-1;66274:20:0;66200:56;;66274:11;:20::i;:::-;66267:27;;;;66139:163;:::o;41523:98::-;41581:7;41608:5;41612:1;41608;:5;:::i;64734:454::-;64793:7;64802;64811;64820;64829;64838;64847;64868:23;64893:12;64907;64921:18;64943:20;64955:7;64943:11;:20::i;:::-;64867:96;;;;;;;;64975:15;64992:23;65017:12;65033:56;65045:7;65054:4;65060:10;65072:4;65078:10;:8;:10::i;:::-;65033:11;:56::i;:::-;64974:115;;-1:-1:-1;64974:115:0;-1:-1:-1;64974:115:0;-1:-1:-1;65140:15:0;;-1:-1:-1;65157:4:0;;-1:-1:-1;65163:4:0;;-1:-1:-1;65169:10:0;-1:-1:-1;;;;64734:454:0;;;;;;;;;:::o;40767:98::-;40825:7;40852:5;40856:1;40852;:5;:::i;11122:191::-;11196:16;11215:6;;-1:-1:-1;;;;;11232:17:0;;;-1:-1:-1;;;;;;11232:17:0;;;;;;11265:40;;11215:6;;;;;;;11265:40;;11196:16;11265:40;11185:128;11122:191;:::o;71628:1905::-;55431:16;:23;;-1:-1:-1;;;;55431:23:0;-1:-1:-1;;;55431:23:0;;;71945:37:::1;::::0;-1:-1:-1;;;71945:37:0;;71976:4:::1;71945:37;::::0;::::1;3996:51:1::0;71792:12:0;;55064:42:::1;::::0;-1:-1:-1;;55064:42:0;;71945:22:::1;::::0;3969:18:1;;71945:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72000:12;::::0;71920:62;;-1:-1:-1;72000:16:0;71997:492:::1;;72042:22;72067:30;72084:12;;72067;:16;;:30;;;;:::i;:::-;72042:55;;72129:38;72148:18;;72129:14;:18;;:38;;;;:::i;:::-;72112:55:::0;-1:-1:-1;72200:32:0::1;:12:::0;72112:55;72200:16:::1;:32::i;:::-;72375:16;::::0;72182:50;;-1:-1:-1;72357:51:0::1;::::0;-1:-1:-1;;;;;72375:16:0::1;72393:14:::0;72357:17:::1;:51::i;:::-;72440:37;::::0;-1:-1:-1;;;72440:37:0;;72471:4:::1;72440:37;::::0;::::1;3996:51:1::0;-1:-1:-1;;;;;72440:22:0;::::1;::::0;::::1;::::0;3969:18:1;;72440:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72423:54;;72027:462;71997:492;72512:13;::::0;:17;72509:1017:::1;;72617:12;72632:22;:15:::0;72652:1:::1;72632:19;:22::i;:::-;72617:37:::0;-1:-1:-1;72669:17:0::1;72689:25;:15:::0;72617:37;72689:19:::1;:25::i;:::-;72669:45;;73120:38;73146:4;73153;73120:17;:38::i;:::-;73260:37;::::0;-1:-1:-1;;;73260:37:0;;73291:4:::1;73260:37;::::0;::::1;3996:51:1::0;73239:18:0::1;::::0;73260:57:::1;::::0;73302:14;;-1:-1:-1;;;;;73260:22:0;::::1;::::0;::::1;::::0;3969:18:1;;73260:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41:::0;::::1;:57::i;:::-;73392:21;::::0;73239:78;;-1:-1:-1;73379:58:0::1;::::0;-1:-1:-1;;;;;73392:21:0::1;73415:9:::0;73239:78;73379:12:::1;:58::i;:::-;73471:43;::::0;;19183:25:1;;;19239:2;19224:18;;19217:34;;;19267:18;;;19260:34;;;73471:43:0::1;::::0;19171:2:1;19156:18;73471:43:0::1;;;;;;;72540:986;;;72509:1017;-1:-1:-1::0;;55477:16:0;:24;;-1:-1:-1;;;;55477:24:0;;;-1:-1:-1;;71628:1905:0:o;74818:834::-;74929:7;74925:40;;74951:14;:12;:14::i;:::-;-1:-1:-1;;;;;74990:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;75014:22:0;;;;;;:11;:22;;;;;;;;75013:23;74990:46;74986:597;;;75053:48;75075:6;75083:9;75094:6;75053:21;:48::i;:::-;74986:597;;;-1:-1:-1;;;;;75124:19:0;;;;;;:11;:19;;;;;;;;75123:20;:46;;;;-1:-1:-1;;;;;;75147:22:0;;;;;;:11;:22;;;;;;;;75123:46;75119:464;;;75186:46;75206:6;75214:9;75225:6;75186:19;:46::i;75119:464::-;-1:-1:-1;;;;;75255:19:0;;;;;;:11;:19;;;;;;;;75254:20;:47;;;;-1:-1:-1;;;;;;75279:22:0;;;;;;:11;:22;;;;;;;;75278:23;75254:47;75250:333;;;75318:44;75336:6;75344:9;75355:6;75318:17;:44::i;75250:333::-;-1:-1:-1;;;;;75384:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;75407:22:0;;;;;;:11;:22;;;;;;;;75384:45;75380:203;;;75446:48;75468:6;75476:9;75487:6;75446:21;:48::i;75380:203::-;75527:44;75545:6;75553:9;75564:6;75527:17;:44::i;:::-;75607:7;75603:41;;75629:15;68468:21;;68446:13;:43;68522:16;;68500:8;:38;68571:20;;68549:12;:42;68624:22;;68602:14;:44;68679:22;;68657:18;:44;68402:307;66314:561;66411:7;;66447;;66364;;;;;66471:289;66495:9;:16;66491:20;;66471:289;;;66561:7;66537;:21;66545:9;66555:1;66545:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;66545:12:0;66537:21;;;;;;;;;;;;;:31;;:66;;;66596:7;66572;:21;66580:9;66590:1;66580:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;66580:12:0;66572:21;;;;;;;;;;;;;:31;66537:66;66533:97;;;66613:7;;66622;;66605:25;;;;;;;66314:561;;:::o;66533:97::-;66655:34;66667:7;:21;66675:9;66685:1;66675:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;66675:12:0;66667:21;;;;;;;;;;;;;66655:7;;:11;:34::i;:::-;66645:44;;66714:34;66726:7;:21;66734:9;66744:1;66734:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;66734:12:0;66726:21;;;;;;;;;;;;;66714:7;;:11;:34::i;:::-;66704:44;-1:-1:-1;66513:3:0;;;;:::i;:::-;;;;66471:289;;;-1:-1:-1;66796:7:0;;66784;;:20;;:11;:20::i;:::-;66774:7;:30;66770:61;;;66814:7;;66823;;66806:25;;;;;;66314:561;;:::o;66770:61::-;66850:7;;66859;;-1:-1:-1;66314:561:0;-1:-1:-1;66314:561:0:o;65200:413::-;65260:7;65269;65278;65287;65307:12;65322:31;65345:7;65322:22;:31::i;:::-;65307:46;;65364:12;65379:25;65396:7;65379:16;:25::i;:::-;65364:40;;65415:18;65436:30;65458:7;65436:21;:30::i;:::-;65415:51;-1:-1:-1;65477:23:0;65503:43;65541:4;65503:33;65415:51;65503:33;:7;65515:4;65503:11;:17::i;:43::-;65477:69;65582:4;;-1:-1:-1;65588:4:0;;-1:-1:-1;65588:4:0;-1:-1:-1;65200:413:0;;-1:-1:-1;;;65200:413:0:o;65625:502::-;65754:7;;;;65810:24;:7;65822:11;65810;:24::i;:::-;65792:42;-1:-1:-1;65845:12:0;65860:21;:4;65869:11;65860:8;:21::i;:::-;65845:36;-1:-1:-1;65892:13:0;65908:21;:4;65917:11;65908:8;:21::i;:::-;65892:37;-1:-1:-1;65940:18:0;65961:27;:10;65976:11;65961:14;:27::i;:::-;65940:48;-1:-1:-1;65999:23:0;66025:44;66063:5;66025:33;65940:48;66025:33;:7;66037:4;66025:11;:17::i;:44::-;66088:7;;;;-1:-1:-1;66114:4:0;;-1:-1:-1;65625:502:0;;-1:-1:-1;;;;;;;;;65625:502:0:o;73541:632::-;73715:16;;;73729:1;73715:16;;;;;;;;;73691:21;;73715:16;;;;;;;;;;-1:-1:-1;73715:16:0;73691:40;;73760:4;73742;73747:1;73742:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;73742:23:0;;;:7;;;;;;;;;;:23;;;;73786:13;;:20;;;-1:-1:-1;;;73786:20:0;;;;:13;;;;;:18;;:20;;;;;73742:7;;73786:20;;;;;:13;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73776:4;73781:1;73776:7;;;;;;;;:::i;:::-;;;;;;:30;-1:-1:-1;;;;;73776:30:0;;;-1:-1:-1;;;;;73776:30:0;;;;;55064:42;73817:4;73822:1;73817:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;73817:14:0;;;:7;;;;;;;;;:14;73876:13;;73844:60;;73861:4;;73876:13;73892:11;73844:8;:60::i;:::-;73943:13;;:222;;-1:-1:-1;;;73943:222:0;;-1:-1:-1;;;;;73943:13:0;;;;:67;;:222;;74025:11;;73943:13;;74096:4;;74115:9;;74139:15;;73943:222;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73616:557;73541:632;;:::o;74185:621::-;74385:13;;74353:60;;74370:4;;-1:-1:-1;;;;;74385:13:0;74401:11;74353:8;:60::i;:::-;74453:13;;74424:56;;-1:-1:-1;;;74424:56:0;;-1:-1:-1;;;;;74453:13:0;;;74424:56;;;13728:51:1;13795:18;;;13788:34;;;55064:42:0;;74424:20;;13701:18:1;;74424:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;74523:13:0;;:275;;-1:-1:-1;;;74523:275:0;;74572:4;74523:275;;;20819:34:1;55064:42:0;20869:18:1;;;20862:43;20921:18;;;20914:34;;;20964:18;;;20957:34;;;74523:13:0;21007:19:1;;;21000:35;;;21051:19;;;21044:35;-1:-1:-1;;;;;21116:15:1;;;21095:19;;;21088:44;74772:15:0;21148:19:1;;;21141:35;74523:13:0;;;;:26;;20753:19:1;;74523:275:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;67785:605::-;67831:18;;:23;:40;;;;-1:-1:-1;67858:8:0;;:13;67831:40;:62;;;;-1:-1:-1;67875:13:0;;:18;67831:62;:95;;;;-1:-1:-1;67909:12:0;;:17;67831:95;:118;;;;-1:-1:-1;67930:14:0;;:19;67831:118;67828:131;;;67785:605::o;67828:131::-;68005:13;;;67979:21;:39;68056:8;;;68030:16;:34;68101:12;;;68075:20;:38;68150:14;;;68124:22;:40;68201:18;;;68175:22;:44;-1:-1:-1;68240:19:0;;;;68270;;;;68300;;;68330;;;;68360:22;;67785:605::o;75664:609::-;75767:15;75784:23;75809:12;75823:23;75848:12;75862;75876:18;75898:19;75909:7;75898:10;:19::i;:::-;75766:151;;;;;;;;;;;;;;75946:28;75966:7;75946;:15;75954:6;-1:-1:-1;;;;;75946:15:0;-1:-1:-1;;;;;75946:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;75928:15:0;;;;;;:7;:15;;;;;;;;:46;;;;76003:7;:15;;;;:28;;76023:7;76003:19;:28::i;:::-;-1:-1:-1;;;;;75985:15:0;;;;;;;:7;:15;;;;;;:46;;;;76063:18;;;;;;;:39;;76086:15;76063:22;:39::i;:::-;-1:-1:-1;;;;;76042:18:0;;;;;;:7;:18;;;;;:60;76115:19;76121:6;76129:4;76115:5;:19::i;:::-;76145:26;76160:10;76145:14;:26::i;:::-;76182:23;76194:4;76200;76182:11;:23::i;:::-;76238:9;-1:-1:-1;;;;;76221:44:0;76230:6;-1:-1:-1;;;;;76221:44:0;;76249:15;76221:44;;;;1595:25:1;;1583:2;1568:18;;1449:177;76221:44:0;;;;;;;;75755:518;;;;;;;75664:609;;;:::o;76285:621::-;76386:15;76403:23;76428:12;76442:23;76467:12;76481;76495:18;76517:19;76528:7;76517:10;:19::i;:::-;76385:151;;;;;;;;;;;;;;76565:28;76585:7;76565;:15;76573:6;-1:-1:-1;;;;;76565:15:0;-1:-1:-1;;;;;76565:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;76547:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;76625:18;;;;;:7;:18;;;;;:39;;76648:15;76625:22;:39::i;:::-;-1:-1:-1;;;;;76604:18:0;;;;;;:7;:18;;;;;;;;:60;;;;76696:7;:18;;;;:39;;76719:15;76696:22;:39::i;76918:548::-;77017:15;77034:23;77059:12;77073:23;77098:12;77112;77126:18;77148:19;77159:7;77148:10;:19::i;:::-;77016:151;;;;;;;;;;;;;;77196:28;77216:7;77196;:15;77204:6;-1:-1:-1;;;;;77196:15:0;-1:-1:-1;;;;;77196:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;77478:680::-;77581:15;77598:23;77623:12;77637:23;77662:12;77676;77690:18;77712:19;77723:7;77712:10;:19::i;:::-;77580:151;;;;;;;;;;;;;;77760:28;77780:7;77760;:15;77768:6;-1:-1:-1;;;;;77760:15:0;-1:-1:-1;;;;;77760:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;77742:15:0;;;;;;:7;:15;;;;;;;;:46;;;;77817:7;:15;;;;:28;;77837:7;77817:19;:28::i;67422:168::-;67493:7;67520:62;67566:5;67520:27;67532:14;;67520:7;:11;;:27;;;;:::i;:::-;:31;;:62::i;67254:156::-;67319:7;67346:56;67386:5;67346:21;67358:8;;67346:7;:11;;:21;;;;:::i;67602:171::-;67672:7;67699:66;67749:5;67699:31;67711:18;;67699:7;:11;;:31;;;;:::i;61578:638::-;61649:10;;61646:563;;-1:-1:-1;;;;;61741:21:0;;61733:67;;;;-1:-1:-1;;;61733:67:0;;;;;;;:::i;:::-;62041:7;;:19;;62053:6;62041:11;:19::i;:::-;62031:7;:29;62085:35;62097:22;62108:10;:8;:10::i;62097:22::-;62085:7;;;:11;:35::i;:::-;62075:7;:45;62154:43;;1595:25:1;;;62183:4:0;;62163:10;;62154:43;;1583:2:1;1568:18;62154:43:0;1449:177:1;66887:355:0;66950:19;66973:10;:8;:10::i;:::-;66950:33;-1:-1:-1;66994:18:0;67015:27;:10;66950:33;67015:14;:27::i;:::-;67094:4;67078:22;;;;:7;:22;;;;;;66994:48;;-1:-1:-1;67078:38:0;;66994:48;67078:26;:38::i;:::-;67069:4;67053:22;;;;:7;:22;;;;;;;;:63;;;;67130:11;:26;;;;;;67127:107;;;67212:4;67196:22;;;;:7;:22;;;;;;:38;;67223:10;67196:26;:38::i;:::-;67187:4;67171:22;;;;:7;:22;;;;;:63;66939:303;;66887:355;:::o;64575:147::-;64653:7;;:17;;64665:4;64653:11;:17::i;:::-;64643:7;:27;64694:10;;:20;;64709:4;64694:14;:20::i;:::-;64681:10;:33;-1:-1:-1;;64575:147:0:o;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;752:315;820:6;828;881:2;869:9;860:7;856:23;852:32;849:52;;;897:1;894;887:12;849:52;936:9;923:23;955:31;980:5;955:31;:::i;:::-;1005:5;1057:2;1042:18;;;;1029:32;;-1:-1:-1;;;752:315:1:o;1264:180::-;1323:6;1376:2;1364:9;1355:7;1351:23;1347:32;1344:52;;;1392:1;1389;1382:12;1344:52;-1:-1:-1;1415:23:1;;1264:180;-1:-1:-1;1264:180:1:o;1631:456::-;1708:6;1716;1724;1777:2;1765:9;1756:7;1752:23;1748:32;1745:52;;;1793:1;1790;1783:12;1745:52;1832:9;1819:23;1851:31;1876:5;1851:31;:::i;:::-;1901:5;-1:-1:-1;1958:2:1;1943:18;;1930:32;1971:33;1930:32;1971:33;:::i;:::-;1631:456;;2023:7;;-1:-1:-1;;;2077:2:1;2062:18;;;;2049:32;;1631:456::o;2092:247::-;2151:6;2204:2;2192:9;2183:7;2179:23;2175:32;2172:52;;;2220:1;2217;2210:12;2172:52;2259:9;2246:23;2278:31;2303:5;2278:31;:::i;2533:118::-;2619:5;2612:13;2605:21;2598:5;2595:32;2585:60;;2641:1;2638;2631:12;2656:309;2721:6;2729;2782:2;2770:9;2761:7;2757:23;2753:32;2750:52;;;2798:1;2795;2788:12;2750:52;2834:9;2821:23;2811:33;;2894:2;2883:9;2879:18;2866:32;2907:28;2929:5;2907:28;:::i;:::-;2954:5;2944:15;;;2656:309;;;;;:::o;3230:615::-;3316:6;3324;3377:2;3365:9;3356:7;3352:23;3348:32;3345:52;;;3393:1;3390;3383:12;3345:52;3433:9;3420:23;3462:18;3503:2;3495:6;3492:14;3489:34;;;3519:1;3516;3509:12;3489:34;3557:6;3546:9;3542:22;3532:32;;3602:7;3595:4;3591:2;3587:13;3583:27;3573:55;;3624:1;3621;3614:12;3573:55;3664:2;3651:16;3690:2;3682:6;3679:14;3676:34;;;3706:1;3703;3696:12;3676:34;3759:7;3754:2;3744:6;3741:1;3737:14;3733:2;3729:23;3725:32;3722:45;3719:65;;;3780:1;3777;3770:12;3719:65;3811:2;3803:11;;;;;3833:6;;-1:-1:-1;3230:615:1;;-1:-1:-1;;;;3230:615:1:o;4515:241::-;4571:6;4624:2;4612:9;4603:7;4599:23;4595:32;4592:52;;;4640:1;4637;4630:12;4592:52;4679:9;4666:23;4698:28;4720:5;4698:28;:::i;5236:388::-;5304:6;5312;5365:2;5353:9;5344:7;5340:23;5336:32;5333:52;;;5381:1;5378;5371:12;5333:52;5420:9;5407:23;5439:31;5464:5;5439:31;:::i;:::-;5489:5;-1:-1:-1;5546:2:1;5531:18;;5518:32;5559:33;5518:32;5559:33;:::i;5629:380::-;5708:1;5704:12;;;;5751;;;5772:61;;5826:4;5818:6;5814:17;5804:27;;5772:61;5879:2;5871:6;5868:14;5848:18;5845:38;5842:161;;;5925:10;5920:3;5916:20;5913:1;5906:31;5960:4;5957:1;5950:15;5988:4;5985:1;5978:15;5842:161;;5629:380;;;:::o;6014:356::-;6216:2;6198:21;;;6235:18;;;6228:30;6294:34;6289:2;6274:18;;6267:62;6361:2;6346:18;;6014:356::o;6375:127::-;6436:10;6431:3;6427:20;6424:1;6417:31;6467:4;6464:1;6457:15;6491:4;6488:1;6481:15;6507:422;6596:1;6639:5;6596:1;6653:270;6674:7;6664:8;6661:21;6653:270;;;6733:4;6729:1;6725:6;6721:17;6715:4;6712:27;6709:53;;;6742:18;;:::i;:::-;6792:7;6782:8;6778:22;6775:55;;;6812:16;;;;6775:55;6891:22;;;;6851:15;;;;6653:270;;;6657:3;6507:422;;;;;:::o;6934:806::-;6983:5;7013:8;7003:80;;-1:-1:-1;7054:1:1;7068:5;;7003:80;7102:4;7092:76;;-1:-1:-1;7139:1:1;7153:5;;7092:76;7184:4;7202:1;7197:59;;;;7270:1;7265:130;;;;7177:218;;7197:59;7227:1;7218:10;;7241:5;;;7265:130;7302:3;7292:8;7289:17;7286:43;;;7309:18;;:::i;:::-;-1:-1:-1;;7365:1:1;7351:16;;7380:5;;7177:218;;7479:2;7469:8;7466:16;7460:3;7454:4;7451:13;7447:36;7441:2;7431:8;7428:16;7423:2;7417:4;7414:12;7410:35;7407:77;7404:159;;;-1:-1:-1;7516:19:1;;;7548:5;;7404:159;7595:34;7620:8;7614:4;7595:34;:::i;:::-;7665:6;7661:1;7657:6;7653:19;7644:7;7641:32;7638:58;;;7676:18;;:::i;:::-;7714:20;;6934:806;-1:-1:-1;;;6934:806:1:o;7745:140::-;7803:5;7832:47;7873:4;7863:8;7859:19;7853:4;7832:47;:::i;8657:127::-;8718:10;8713:3;8709:20;8706:1;8699:31;8749:4;8746:1;8739:15;8773:4;8770:1;8763:15;8789:125;8829:4;8857:1;8854;8851:8;8848:34;;;8862:18;;:::i;:::-;-1:-1:-1;8899:9:1;;8789:125::o;8919:127::-;8980:10;8975:3;8971:20;8968:1;8961:31;9011:4;9008:1;9001:15;9035:4;9032:1;9025:15;9051:135;9090:3;-1:-1:-1;;9111:17:1;;9108:43;;;9131:18;;:::i;:::-;-1:-1:-1;9178:1:1;9167:13;;9051:135::o;9604:251::-;9674:6;9727:2;9715:9;9706:7;9702:23;9698:32;9695:52;;;9743:1;9740;9733:12;9695:52;9775:9;9769:16;9794:31;9819:5;9794:31;:::i;10936:397::-;11138:2;11120:21;;;11177:2;11157:18;;;11150:30;11216:34;11211:2;11196:18;;11189:62;-1:-1:-1;;;11282:2:1;11267:18;;11260:31;11323:3;11308:19;;10936:397::o;13006:184::-;13076:6;13129:2;13117:9;13108:7;13104:23;13100:32;13097:52;;;13145:1;13142;13135:12;13097:52;-1:-1:-1;13168:16:1;;13006:184;-1:-1:-1;13006:184:1:o;13833:245::-;13900:6;13953:2;13941:9;13932:7;13928:23;13924:32;13921:52;;;13969:1;13966;13959:12;13921:52;14001:9;13995:16;14020:28;14042:5;14020:28;:::i;14490:128::-;14530:3;14561:1;14557:6;14554:1;14551:13;14548:39;;;14567:18;;:::i;:::-;-1:-1:-1;14603:9:1;;14490:128::o;15431:168::-;15471:7;15537:1;15533;15529:6;15525:14;15522:1;15519:21;15514:1;15507:9;15500:17;15496:45;15493:71;;;15544:18;;:::i;:::-;-1:-1:-1;15584:9:1;;15431:168::o;18759:217::-;18799:1;18825;18815:132;;18869:10;18864:3;18860:20;18857:1;18850:31;18904:4;18901:1;18894:15;18932:4;18929:1;18922:15;18815:132;-1:-1:-1;18961:9:1;;18759:217::o;19437:980::-;19699:4;19747:3;19736:9;19732:19;19778:6;19767:9;19760:25;19804:2;19842:6;19837:2;19826:9;19822:18;19815:34;19885:3;19880:2;19869:9;19865:18;19858:31;19909:6;19944;19938:13;19975:6;19967;19960:22;20013:3;20002:9;19998:19;19991:26;;20052:2;20044:6;20040:15;20026:29;;20073:1;20083:195;20097:6;20094:1;20091:13;20083:195;;;20162:13;;-1:-1:-1;;;;;20158:39:1;20146:52;;20253:15;;;;20218:12;;;;20194:1;20112:9;20083:195;;;-1:-1:-1;;;;;;;20334:32:1;;;;20329:2;20314:18;;20307:60;-1:-1:-1;;;20398:3:1;20383:19;20376:35;20295:3;19437:980;-1:-1:-1;;;19437:980:1:o;21187:306::-;21275:6;21283;21291;21344:2;21332:9;21323:7;21319:23;21315:32;21312:52;;;21360:1;21357;21350:12;21312:52;21389:9;21383:16;21373:26;;21439:2;21428:9;21424:18;21418:25;21408:35;;21483:2;21472:9;21468:18;21462:25;21452:35;;21187:306;;;;;:::o

Swarm Source

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