ETH Price: $2,866.27 (-2.81%)
 

Overview

Max Total Supply

100,000,000 SAMS

Holders

5,820

Market

Price

$0.0001 @ 0.000000 ETH

Onchain Market Cap

-

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
460,159.990424655717472568 SAMS

Value
$60.30 ( ~0.0210377807721874 ETH) [0.4602%]
0xf5c4f3dc02c3fb9279495a8fef7b0741da956157
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Samsara is an all in one platform for building and deploying AI agents.

Market

Volume (24H):$0.00
Market Capitalization:$0.00
Circulating Supply:0.00 SAMS
Market Data Source: Coinmarketcap

Contract Source Code Verified (Exact Match)

Contract Name:
samsara

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at basescan.org on 2025-03-20
*/

/*
                         'oxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkko,          ;kkkkkkkkkkk:             
                         cWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWXx'           oMMMMMMMMMMMx.            
                         cNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXd'             dMMMMMMMMMMMx.            
                         cNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXd'               dMMMMMMMMMMMx.            
                         cNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWXx'                 dMMMMMMMMMMMx.            
                         cNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWXx'                   dMMMMMMMMMMMx.            
                         cNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXd'                     dMMMMMMMMMMMx.            
                         cNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXd'                       dMMMMMMMMMMMx.            
                         cNMMMMMMMMMMMMMMMMMMMMMMMMMMMWWXx'                         dMMMMMMMMMMMx.            
                         cWMMMMMMMMMMMMMMMMMMMMMMMMWWXxc'                           oMMMMMMMMMMMx.            
                         cNMMMMMMMMMMMMMMMMMMMMMMMMXd'                              oMMMMMMMMMMMx.            
                         cNMMMMMMMMMMMMMMMMMMMMMMXd'                                oMMMMMMMMMMMd.            
              ...........cKXXXXXXXXXXXXXXXXXXXXKx'                                  oWMMMMMMMMMMd.            
             lKKKKKKKKKKKo......................             ,looooooooooooooooooooolccllccccccc,             
            .dMMMMMMMMMMMo                                 'xXMMMMMMMMMMMMMMMMMMMMMWc                         
            .dMMMMMMMMMMMd                               'xNMMMMMMMMMMMMMMMMMMMMMMMWc                         
            .dMMMMMMMMMMMd                            ,cxXMMMMWWMMMMMMMMMMMMMMMMMMMWc                         
            .dMMMMMMMMMMMd                          'xXMMMMMMMWWMMMMMMMMMMMMMMMMMMMWc                         
            .xMMMMMMMMMMMd                        'xXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWc                         
            .xMMMMMMMMMMMd                      'xNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWc                         
            .xMMMMMMMMMMMd                    ,xXMMMMWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMWc                         
            .xMMMMMMMMMMMd                  'xXMMMMMMWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMWc                         
            .xMMMMMMMMMMMd                'xXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWc                         
            .xMMMMMMMMMMMd              'xNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWc                         
            .xMMMMMMMMMMMd            ,xXMMMMWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWc                         
            .dWMMMMMMMMMWo          'xXWWMMMWWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWWX:                         
             .;;;;;;;;;;;.          ';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,'..                         
                                                                                                              
                   
            Create, deploy, and trade custom AI assistants without a line of code.

                Gitbook: https://docs.samsara.build/
                Twitter: https://x.com/samsara_build?s=21&t=ghVlx9tHhaKOrhVPlc4kTQ
                Web: https://www.samsara.build
                Ai Agent interface: https://app.samsara.build                                                                           

*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.26;
pragma experimental ABIEncoderV2;

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

// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

// pragma solidity ^0.8.0;

// import "../utils/Context.sol";

/**
 * @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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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);
    }
}

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

// pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev 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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}

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

// pragma solidity ^0.8.0;

// import "../IERC20.sol";

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

// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

// pragma solidity ^0.8.0;

// import "./IERC20.sol";
// import "./extensions/IERC20Metadata.sol";
// import "../../utils/Context.sol";

/**
 * @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.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * 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}.
     *
     * 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 default value returned by this function, unless
     * it's 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:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        address owner = _msgSender();
        _transfer(owner, to, 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}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        address owner = _msgSender();
        _approve(owner, 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}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, 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)
    {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, 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)
    {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * 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:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(
            fromBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, 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;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _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;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _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 Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(
                currentAllowance >= amount,
                "ERC20: insufficient allowance"
            );
            unchecked {
                _approve(owner, spender, currentAllowance - 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 {}
}

// OpenZeppelin Contracts (last updated v4.6.0) (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 subtraction 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.5.0;

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

// pragma solidity >=0.6.2;

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// pragma solidity >=0.6.2;

// import './IUniswapV2Router01.sol';

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

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

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

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

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

contract samsara is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public uniswapV2Pair;

    address public marketingWallet;
    address public developmentWallet;
    address public liquidityWallet;
    address public constant deadAddress = address(0xdead);

    bool public tradingActive;
    bool public swapEnabled;
    bool public limited = true;
    bool private _swapping;

    uint256 public maxTransaction;
    uint256 public maxWallet;
    uint256 public swapTokensAtAmount;

    uint256 public buyTotalFees;
    uint256 private _buyMarketingFee;
    uint256 private _buyDevelopmentFee;
    uint256 private _buyLiquidityFee;

    uint256 public sellTotalFees;
    uint256 private _sellMarketingFee;
    uint256 private _sellDevelopmentFee;
    uint256 private _sellLiquidityFee;

    uint256 private _tokensForMarketing;
    uint256 private _tokensForDevelopment;
    uint256 private _tokensForLiquidity;
    uint256 private _previousFee;

    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) private _isExcludedFromMaxTransaction;
    mapping(address => bool) private _automatedMarketMakerPairs;
    mapping(address => bool) private _isSams;

    event ExcludeFromLimits(address indexed account, bool isExcluded);

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event marketingWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event developmentWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event liquidityWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    constructor(address[] memory _sams) ERC20("Samsara.Build", "SAMS") {

        uint256 totalSupply = 100_000_000 * (10 ** 18);

        address samsMaster = 0x7B4D44cDC59426feD0F0dD2fdb025eDdE2a5c01B;  
        uniswapV2Router = IUniswapV2Router02(
            0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24
        );
        _approve(address(this), address(uniswapV2Router), type(uint256).max);

        maxTransaction = totalSupply;
        maxWallet = totalSupply / 50;
        swapTokensAtAmount = (totalSupply * 2) / 1000;

        _buyMarketingFee = 1500;
        _buyDevelopmentFee = 0;
        _buyLiquidityFee = 0;
        buyTotalFees = _buyMarketingFee + _buyDevelopmentFee + _buyLiquidityFee;

        _sellMarketingFee = 2000;
        _sellDevelopmentFee = 0;
        _sellLiquidityFee = 0;
        sellTotalFees = _sellMarketingFee + _sellDevelopmentFee + _sellLiquidityFee;
        _previousFee = sellTotalFees;

        marketingWallet = samsMaster;
        developmentWallet = samsMaster;
        liquidityWallet = samsMaster;

        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(deadAddress, true);
        excludeFromFees(samsMaster, true);

        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(deadAddress, true);
        excludeFromMaxTransaction(address(uniswapV2Router), true);
        excludeFromMaxTransaction(samsMaster, true);


        _mint(owner(), (totalSupply / 100) * 5);  
        _mint(address(this), (totalSupply / 100) * 95); 

        setSams(_sams, true);
    }

    receive() external payable {}

    function burn(uint256 amount) public {
        _burn(msg.sender, amount);
    }

    function addLiquidity() public onlyOwner {
        require(!tradingActive, "Trading already active.");

        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
            address(this),
            uniswapV2Router.WETH()
        );
        _approve(address(this), address(uniswapV2Pair), type(uint256).max);
        IERC20(uniswapV2Pair).approve(
            address(uniswapV2Router),
            type(uint256).max
        );

        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
        excludeFromMaxTransaction(address(uniswapV2Pair), true);

        uniswapV2Router.addLiquidityETH{value: address(this).balance}(
            address(this),
            balanceOf(address(this)),
            0,
            0,
            owner(),
            block.timestamp
        );
    }

    function enableTrading() public onlyOwner {
        require(!tradingActive, "Trading already active.");
        tradingActive = true;
        swapEnabled = true;
    }

    function removeLimits() external onlyOwner{
        limited = false;
    }

    function setSams(address[] memory _sams, bool set) internal {
        for(uint256 i = 0; i < _sams.length; i++){
            _isSams[_sams[i]] = set;
        }
    }

    function setSwapEnabled(bool value) public onlyOwner {
        swapEnabled = value;
    }

    function setSwapTokensAtAmount(uint256 amount) public onlyOwner {
        require(
            amount >= (totalSupply() * 1) / 100000,
            "ERC20: Swap amount cannot be lower than 0.001% total supply."
        );
        require(
            amount <= (totalSupply() * 5) / 1000,
            "ERC20: Swap amount cannot be higher than 0.5% total supply."
        );
        swapTokensAtAmount = amount;
    }

    function setMaxWalletAndMaxTransaction(
        uint256 _maxTransaction,
        uint256 _maxWallet
    ) public onlyOwner {
        require(
            _maxTransaction >= ((totalSupply() * 5) / 1000),
            "ERC20: Cannot set maxTxn lower than 0.5%"
        );
        require(
            _maxWallet >= ((totalSupply() * 5) / 1000),
            "ERC20: Cannot set maxWallet lower than 0.5%"
        );
        maxTransaction = _maxTransaction;
        maxWallet = _maxWallet;
    }

    function setBuyFees(
        uint256 _marketingFee,
        uint256 _developmentFee,
        uint256 _liquidityFee
    ) public onlyOwner {
        require(
            _marketingFee + _developmentFee + _liquidityFee <= 2000,
            "ERC20: Must keep fees at 20% or less"
        );
        _buyMarketingFee = _marketingFee;
        _buyDevelopmentFee = _developmentFee;
        _buyLiquidityFee = _liquidityFee;
        buyTotalFees = _buyMarketingFee + _buyDevelopmentFee + _buyLiquidityFee;
    }

    function setSellFees(
        uint256 _marketingFee,
        uint256 _developmentFee,
        uint256 _liquidityFee
    ) public onlyOwner {
        require(
            _marketingFee + _developmentFee + _liquidityFee <= 2000,
            "ERC20: Must keep fees at 20% or less"
        );
        _sellMarketingFee = _marketingFee;
        _sellDevelopmentFee = _developmentFee;
        _sellLiquidityFee = _liquidityFee;
        sellTotalFees =
            _sellMarketingFee +
            _sellDevelopmentFee +
            _sellLiquidityFee;
        _previousFee = sellTotalFees;
    }

    function setMarketingWallet(address _marketingWallet) public onlyOwner {
        require(_marketingWallet != address(0), "ERC20: Address 0");
        address oldWallet = marketingWallet;
        marketingWallet = _marketingWallet;
        emit marketingWalletUpdated(marketingWallet, oldWallet);
    }

    function setDevelopmentWallet(address _developmentWallet) public onlyOwner {
        require(_developmentWallet != address(0), "ERC20: Address 0");
        address oldWallet = developmentWallet;
        developmentWallet = _developmentWallet;
        emit developmentWalletUpdated(developmentWallet, oldWallet);
    }

    function setLiquidityWallet(address _liquidityWallet) public onlyOwner {
        require(_liquidityWallet != address(0), "ERC20: Address 0");
        address oldWallet = liquidityWallet;
        liquidityWallet = _liquidityWallet;
        emit liquidityWalletUpdated(liquidityWallet, oldWallet);
    }

    function excludeFromMaxTransaction(address account, bool value)
        public
        onlyOwner
    {
        _isExcludedFromMaxTransaction[account] = value;
        emit ExcludeFromLimits(account, value);
    }

    function bulkExcludeFromMaxTransaction(
        address[] calldata accounts,
        bool value
    ) public onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            _isExcludedFromMaxTransaction[accounts[i]] = value;
            emit ExcludeFromLimits(accounts[i], value);
        }
    }

    function excludeFromFees(address account, bool value) public onlyOwner {
        _isExcludedFromFees[account] = value;
        emit ExcludeFromFees(account, value);
    }

    function bulkExcludeFromFees(address[] calldata accounts, bool value)
        public
        onlyOwner
    {
        for (uint256 i = 0; i < accounts.length; i++) {
            _isExcludedFromFees[accounts[i]] = value;
            emit ExcludeFromFees(accounts[i], value);
        }
    }

    function withdrawStuckTokens(address tkn) public onlyOwner {
        bool success;
        if (tkn == address(0))
            (success, ) = address(msg.sender).call{
                value: address(this).balance
            }("");
        else {
            require(IERC20(tkn).balanceOf(address(this)) > 0, "No tokens");
            uint256 amount = IERC20(tkn).balanceOf(address(this));
            IERC20(tkn).transfer(msg.sender, amount);
        }
    }

    function isExcludedFromMaxTransaction(address account)
        public
        view
        returns (bool)
    {
        return _isExcludedFromMaxTransaction[account];
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) internal {
        _automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (
            from != owner() &&
            to != owner() &&
            to != address(0) &&
            to != deadAddress &&
            !_swapping
        ) {
            if (!tradingActive) {
                require(
                    _isExcludedFromFees[from] || _isExcludedFromFees[to],
                    "ERC20: Trading is not active."
                );
            }

            if (limited && from == address(uniswapV2Pair)) {  // has to be the LP 
                require(balanceOf(to) + amount <= maxWallet, "Forbid");
                require(_isSams[from] || _isSams[to], "Forbid");
            }

            //when buy
            if (
                _automatedMarketMakerPairs[from] &&
                !_isExcludedFromMaxTransaction[to]
            ) {
                require(
                    amount <= maxTransaction,
                    "ERC20: Buy transfer amount exceeds the maxTransaction."
                );
                require(
                    amount + balanceOf(to) <= maxWallet,
                    "ERC20: Max wallet exceeded"
                );
            }
            //when sell
            else if (
                _automatedMarketMakerPairs[to] &&
                !_isExcludedFromMaxTransaction[from]
            ) {
                require(
                    amount <= maxTransaction,
                    "ERC20: Sell transfer amount exceeds the maxTransaction."
                );
            } else if (!_isExcludedFromMaxTransaction[to]) {
                require(
                    amount + balanceOf(to) <= maxWallet,
                    "ERC20: Max wallet exceeded"
                );
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (
            canSwap &&
            swapEnabled &&
            !_swapping &&
            !_automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            _swapping = true;

            _swapBack();

            _swapping = false;
        }

        bool takeFee = !_swapping;

        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;

        if (takeFee) {
            // on sell
            if (_automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = amount.mul(sellTotalFees).div(10000);
                _tokensForLiquidity +=
                    (fees * _sellLiquidityFee) /
                    sellTotalFees;
                _tokensForMarketing +=
                    (fees * _sellMarketingFee) /
                    sellTotalFees;
                _tokensForDevelopment +=
                    (fees * _sellDevelopmentFee) /
                    sellTotalFees;
            }
            // on buy
            else if (_automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount.mul(buyTotalFees).div(10000);
                _tokensForLiquidity += (fees * _buyLiquidityFee) / buyTotalFees;
                _tokensForMarketing += (fees * _buyMarketingFee) / buyTotalFees;
                _tokensForDevelopment +=
                    (fees * _buyDevelopmentFee) /
                    buyTotalFees;
            }

            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }

            amount -= fees;
        }

        super._transfer(from, to, amount);
        sellTotalFees = _previousFee;
    }

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

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

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

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

    function _swapBack() internal {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = _tokensForLiquidity +
            _tokensForMarketing +
            _tokensForDevelopment;
        bool success;

        if (contractBalance == 0 || totalTokensToSwap == 0) {
            return;
        }

        if (contractBalance > swapTokensAtAmount * 10) {
            contractBalance = swapTokensAtAmount * 10;
        }

        uint256 liquidityTokens = (contractBalance * _tokensForLiquidity) /
            totalTokensToSwap /
            2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);

        uint256 initialETHBalance = address(this).balance;

        _swapTokensForETH(amountToSwapForETH);

        uint256 ethBalance = address(this).balance.sub(initialETHBalance);

        uint256 ethForMarketing = ethBalance.mul(_tokensForMarketing).div(
            totalTokensToSwap
        );

        uint256 ethForDevelopment = ethBalance.mul(_tokensForDevelopment).div(
            totalTokensToSwap
        );

        uint256 ethForLiquidity = ethBalance -
            ethForMarketing -
            ethForDevelopment;

        _tokensForLiquidity = 0;
        _tokensForMarketing = 0;
        _tokensForDevelopment = 0;

        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            _addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(
                amountToSwapForETH,
                ethForLiquidity,
                _tokensForLiquidity
            );
        }

        (success, ) = address(developmentWallet).call{value: ethForDevelopment}("");

        (success, ) = address(marketingWallet).call{
            value: address(this).balance
        }("");
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address[]","name":"_sams","type":"address[]"}],"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":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromLimits","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","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":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"developmentWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"liquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"inputs":[],"name":"addLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"value","type":"bool"}],"name":"bulkExcludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"value","type":"bool"}],"name":"bulkExcludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"developmentWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxTransaction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_developmentFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_developmentWallet","type":"address"}],"name":"setDevelopmentWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityWallet","type":"address"}],"name":"setLiquidityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTransaction","type":"uint256"},{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"name":"setMaxWalletAndMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_developmentFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tkn","type":"address"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526009805460ff60b01b1916600160b01b179055348015610022575f80fd5b5060405161380138038061380183398101604081905261004191610689565b6040518060400160405280600d81526020016c14d85b5cd85c984b909d5a5b19609a1b8152506040518060400160405280600481526020016353414d5360e01b815250816003908161009391906107d6565b5060046100a082826107d6565b5050506100b96100b461029f60201b60201c565b6102a3565b734752ba5dbc23f44d87826276bf6fd6b1c372ad2460808190526a52b7d2dcc80cd2e400000090737b4d44cdc59426fed0f0dd2fdb025edde2a5c01b906101039030905f196102f4565b600a8290556101136032836108a4565b600b556103e86101248360026108c3565b61012e91906108a4565b600c556105dc600e8190555f600f8190556010819055906101509082906108e0565b61015a91906108e0565b600d556107d060128190555f601381905560148190559061017c9082906108e0565b61018691906108e0565b6011819055601855600780546001600160a01b03199081166001600160a01b0384811691821790935560088054831682179055600980549092161790556005546101d29116600161041c565b6101dd30600161041c565b6101ea61dead600161041c565b6101f581600161041c565b61021161020a6005546001600160a01b031690565b6001610483565b61021c306001610483565b61022961dead6001610483565b608051610237906001610483565b610242816001610483565b6102726102576005546001600160a01b031690565b6102626064856108a4565b61026d9060056108c3565b6104e2565b61028c306102816064856108a4565b61026d90605f6108c3565b61029783600161059f565b505050610907565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b03831661035b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b0382166103bc5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610352565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6104246105fe565b6001600160a01b0382165f81815260196020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791015b60405180910390a25050565b61048b6105fe565b6001600160a01b0382165f818152601a6020908152604091829020805460ff191685151590811790915591519182527f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc929101610477565b6001600160a01b0382166105385760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610352565b8060025f82825461054991906108e0565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b5f5b82518110156105f95781601c5f8584815181106105c0576105c06108f3565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff19169115159190911790556001016105a1565b505050565b6005546001600160a01b031633146106585760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610352565b565b634e487b7160e01b5f52604160045260245ffd5b80516001600160a01b0381168114610684575f80fd5b919050565b5f60208284031215610699575f80fd5b81516001600160401b038111156106ae575f80fd5b8201601f810184136106be575f80fd5b80516001600160401b038111156106d7576106d761065a565b604051600582901b90603f8201601f191681016001600160401b03811182821017156107055761070561065a565b604052918252602081840181019290810187841115610722575f80fd5b6020850194505b838510156107485761073a8561066e565b815260209485019401610729565b509695505050505050565b600181811c9082168061076757607f821691505b60208210810361078557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156105f957805f5260205f20601f840160051c810160208510156107b05750805b601f840160051c820191505b818110156107cf575f81556001016107bc565b5050505050565b81516001600160401b038111156107ef576107ef61065a565b610803816107fd8454610753565b8461078b565b6020601f821160018114610835575f831561081e5750848201515b5f19600385901b1c1916600184901b1784556107cf565b5f84815260208120601f198516915b828110156108645787850151825560209485019460019092019101610844565b508482101561088157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b5f826108be57634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176108da576108da610890565b92915050565b808201808211156108da576108da610890565b634e487b7160e01b5f52603260045260245ffd5b608051612ea361095e5f395f818161035701528181611438015281816114c7015281816115f9015281816116a401528181612735015281816127ec015281816128280152818161289c01526128db0152612ea35ff3fe608060405260043610610283575f3560e01c80637571336a11610155578063c24a7a8c116100be578063dd62ed3e11610078578063dd62ed3e146107a6578063e01af92c146107c5578063e2f45605146107e4578063e8078d94146107f9578063f2fde38b1461080d578063f8b45b051461082c575f80fd5b8063c24a7a8c14610700578063c3f70b521461071f578063cb96372814610734578063d469801614610753578063d7d1d10e14610772578063d85ba06314610791575f80fd5b8063a457c2d71161010f578063a457c2d714610645578063a9059cbb14610664578063afa4f3b214610683578063bbc0c742146106a2578063c0246668146106c2578063c04a5414146106e1575f80fd5b80637571336a146105a257806375f0a874146105c1578063860a32ec146105e05780638a8c523c146106005780638da5cb5b1461061457806395d89b4114610631575f80fd5b8063313ce567116101f75780636a486a8e116101b15780636a486a8e146105075780636ddd17131461051c57806370a082311461053c578063715018a61461055b57806372ac24861461056f578063751039fc1461058e575f80fd5b8063313ce56714610439578063395093511461045457806342966c681461047357806349bd5a5e146104925780634fbee193146104b15780635d098b38146104e8575f80fd5b80631694505e116102485780631694505e1461034657806318160ddd1461039157806318d9ceae146103af57806323b872dd146103e657806327c8f83514610405578063296f0a0c1461041a575f80fd5b806306fdde031461028e578063095ea7b3146102b85780630d075d9c146102e75780630f683e9014610308578063155ca7c114610327575f80fd5b3661028a57005b5f80fd5b348015610299575f80fd5b506102a2610841565b6040516102af919061295f565b60405180910390f35b3480156102c3575f80fd5b506102d76102d23660046129a8565b6108d1565b60405190151581526020016102af565b3480156102f2575f80fd5b506103066103013660046129d2565b6108ea565b005b348015610313575f80fd5b506103066103223660046129d2565b61095d565b348015610332575f80fd5b50610306610341366004612a08565b6109cc565b348015610351575f80fd5b506103797f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102af565b34801561039c575f80fd5b506002545b6040519081526020016102af565b3480156103ba575f80fd5b506102d76103c9366004612a8a565b6001600160a01b03165f908152601a602052604090205460ff1690565b3480156103f1575f80fd5b506102d7610400366004612aa5565b610aa9565b348015610410575f80fd5b5061037961dead81565b348015610425575f80fd5b50610306610434366004612a8a565b610acc565b348015610444575f80fd5b50604051601281526020016102af565b34801561045f575f80fd5b506102d761046e3660046129a8565b610b4a565b34801561047e575f80fd5b5061030661048d366004612ae3565b610b6b565b34801561049d575f80fd5b50600654610379906001600160a01b031681565b3480156104bc575f80fd5b506102d76104cb366004612a8a565b6001600160a01b03165f9081526019602052604090205460ff1690565b3480156104f3575f80fd5b50610306610502366004612a8a565b610b78565b348015610512575f80fd5b506103a160115481565b348015610527575f80fd5b506009546102d790600160a81b900460ff1681565b348015610547575f80fd5b506103a1610556366004612a8a565b610bf6565b348015610566575f80fd5b50610306610c10565b34801561057a575f80fd5b50610306610589366004612a8a565b610c23565b348015610599575f80fd5b50610306610ca1565b3480156105ad575f80fd5b506103066105bc366004612afa565b610cb8565b3480156105cc575f80fd5b50600754610379906001600160a01b031681565b3480156105eb575f80fd5b506009546102d790600160b01b900460ff1681565b34801561060b575f80fd5b50610306610d1f565b34801561061f575f80fd5b506005546001600160a01b0316610379565b34801561063c575f80fd5b506102a2610d92565b348015610650575f80fd5b506102d761065f3660046129a8565b610da1565b34801561066f575f80fd5b506102d761067e3660046129a8565b610e1b565b34801561068e575f80fd5b5061030661069d366004612ae3565b610e28565b3480156106ad575f80fd5b506009546102d790600160a01b900460ff1681565b3480156106cd575f80fd5b506103066106dc366004612afa565b610f62565b3480156106ec575f80fd5b50600854610379906001600160a01b031681565b34801561070b575f80fd5b5061030661071a366004612b31565b610fc1565b34801561072a575f80fd5b506103a1600a5481565b34801561073f575f80fd5b5061030661074e366004612a8a565b6110d9565b34801561075e575f80fd5b50600954610379906001600160a01b031681565b34801561077d575f80fd5b5061030661078c366004612a08565b6112b3565b34801561079c575f80fd5b506103a1600d5481565b3480156107b1575f80fd5b506103a16107c0366004612b51565b61138a565b3480156107d0575f80fd5b506103066107df366004612b7d565b6113b4565b3480156107ef575f80fd5b506103a1600c5481565b348015610804575f80fd5b506103066113da565b348015610818575f80fd5b50610306610827366004612a8a565b611758565b348015610837575f80fd5b506103a1600b5481565b60606003805461085090612b98565b80601f016020809104026020016040519081016040528092919081815260200182805461087c90612b98565b80156108c75780601f1061089e576101008083540402835291602001916108c7565b820191905f5260205f20905b8154815290600101906020018083116108aa57829003601f168201915b5050505050905090565b5f336108de8185856117ce565b60019150505b92915050565b6108f26118f1565b6107d0816109008486612be4565b61090a9190612be4565b11156109315760405162461bcd60e51b815260040161092890612bf7565b60405180910390fd5b600e839055600f82905560108190558061094b8385612be4565b6109559190612be4565b600d55505050565b6109656118f1565b6107d0816109738486612be4565b61097d9190612be4565b111561099b5760405162461bcd60e51b815260040161092890612bf7565b601283905560138290556014819055806109b58385612be4565b6109bf9190612be4565b6011819055601855505050565b6109d46118f1565b5f5b82811015610aa3578160195f8686858181106109f4576109f4612c3b565b9050602002016020810190610a099190612a8a565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055838382818110610a4257610a42612c3b565b9050602002016020810190610a579190612a8a565b6001600160a01b03167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df783604051610a93911515815260200190565b60405180910390a26001016109d6565b50505050565b5f33610ab685828561194b565b610ac18585856119bd565b506001949350505050565b610ad46118f1565b6001600160a01b038116610afa5760405162461bcd60e51b815260040161092890612c4f565b600980546001600160a01b038381166001600160a01b03198316811790935560405191169182917f3e0ea4f8339b6050ff814971a9814aa39176c149fcf185975c219f33db2342db905f90a35050565b5f336108de818585610b5c838361138a565b610b669190612be4565b6117ce565b610b753382612199565b50565b610b806118f1565b6001600160a01b038116610ba65760405162461bcd60e51b815260040161092890612c4f565b600780546001600160a01b038381166001600160a01b03198316811790935560405191169182917fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b05674905f90a35050565b6001600160a01b03165f9081526020819052604090205490565b610c186118f1565b610c215f6122c9565b565b610c2b6118f1565b6001600160a01b038116610c515760405162461bcd60e51b815260040161092890612c4f565b600880546001600160a01b038381166001600160a01b03198316811790935560405191169182917ffaf1b77ed79f6e898c44dd8ab36b330c7b2fd39bcaab05ed6362480df8703965905f90a35050565b610ca96118f1565b6009805460ff60b01b19169055565b610cc06118f1565b6001600160a01b0382165f818152601a6020908152604091829020805460ff191685151590811790915591519182527f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc9291015b60405180910390a25050565b610d276118f1565b600954600160a01b900460ff1615610d7b5760405162461bcd60e51b81526020600482015260176024820152762a3930b234b7339030b63932b0b23c9030b1ba34bb329760491b6044820152606401610928565b6009805461ffff60a01b191661010160a01b179055565b60606004805461085090612b98565b5f3381610dae828661138a565b905083811015610e0e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610928565b610ac182868684036117ce565b5f336108de8185856119bd565b610e306118f1565b620186a0610e3d60025490565b610e48906001612c79565b610e529190612c90565b811015610ec75760405162461bcd60e51b815260206004820152603c60248201527f45524332303a205377617020616d6f756e742063616e6e6f74206265206c6f7760448201527f6572207468616e20302e3030312520746f74616c20737570706c792e000000006064820152608401610928565b6103e8610ed360025490565b610ede906005612c79565b610ee89190612c90565b811115610f5d5760405162461bcd60e51b815260206004820152603b60248201527f45524332303a205377617020616d6f756e742063616e6e6f742062652068696760448201527f686572207468616e20302e352520746f74616c20737570706c792e00000000006064820152608401610928565b600c55565b610f6a6118f1565b6001600160a01b0382165f81815260196020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101610d13565b610fc96118f1565b6103e8610fd560025490565b610fe0906005612c79565b610fea9190612c90565b82101561104a5760405162461bcd60e51b815260206004820152602860248201527f45524332303a2043616e6e6f7420736574206d617854786e206c6f776572207460448201526768616e20302e352560c01b6064820152608401610928565b6103e861105660025490565b611061906005612c79565b61106b9190612c90565b8110156110ce5760405162461bcd60e51b815260206004820152602b60248201527f45524332303a2043616e6e6f7420736574206d617857616c6c6574206c6f776560448201526a72207468616e20302e352560a81b6064820152608401610928565b600a91909155600b55565b6110e16118f1565b5f6001600160a01b03821661113957604051339047905f81818185875af1925050503d805f811461112d576040519150601f19603f3d011682016040523d82523d5f602084013e611132565b606091505b5050505050565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa15801561117d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111a19190612caf565b116111da5760405162461bcd60e51b81526020600482015260096024820152684e6f20746f6b656e7360b81b6044820152606401610928565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa15801561121e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112429190612caf565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0384169063a9059cbb906044016020604051808303815f875af115801561128f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa39190612cc6565b6112bb6118f1565b5f5b82811015610aa35781601a5f8686858181106112db576112db612c3b565b90506020020160208101906112f09190612a8a565b6001600160a01b0316815260208101919091526040015f20805460ff191691151591909117905583838281811061132957611329612c3b565b905060200201602081019061133e9190612a8a565b6001600160a01b03167f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc928360405161137a911515815260200190565b60405180910390a26001016112bd565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6113bc6118f1565b60098054911515600160a81b0260ff60a81b19909216919091179055565b6113e26118f1565b600954600160a01b900460ff16156114365760405162461bcd60e51b81526020600482015260176024820152762a3930b234b7339030b63932b0b23c9030b1ba34bb329760491b6044820152606401610928565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611492573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114b69190612ce1565b6001600160a01b031663c9c65396307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611521573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115459190612ce1565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801561158f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b39190612ce1565b600680546001600160a01b0319166001600160a01b039290921691821790556115df9030905f196117ce565b60065460405163095ea7b360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f1960248301529091169063095ea7b3906044016020604051808303815f875af115801561164f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116739190612cc6565b5060065461168b906001600160a01b0316600161231a565b6006546116a2906001600160a01b03166001610cb8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d71947306116dc30610bf6565b5f806116f06005546001600160a01b031690565b426040518863ffffffff1660e01b815260040161171296959493929190612cfc565b60606040518083038185885af115801561172e573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906117539190612d37565b505050565b6117606118f1565b6001600160a01b0381166117c55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610928565b610b75816122c9565b6001600160a01b0383166118305760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610928565b6001600160a01b0382166118915760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610928565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b03163314610c215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610928565b5f611956848461138a565b90505f198114610aa357818110156119b05760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610928565b610aa384848484036117ce565b6001600160a01b0383166119e35760405162461bcd60e51b815260040161092890612d62565b6001600160a01b038216611a095760405162461bcd60e51b815260040161092890612da7565b805f03611a1b5761175383835f61236d565b6005546001600160a01b03848116911614801590611a4757506005546001600160a01b03838116911614155b8015611a5b57506001600160a01b03821615155b8015611a7257506001600160a01b03821661dead14155b8015611a885750600954600160b81b900460ff16155b15611e6f57600954600160a01b900460ff16611b27576001600160a01b0383165f9081526019602052604090205460ff1680611adb57506001600160a01b0382165f9081526019602052604090205460ff165b611b275760405162461bcd60e51b815260206004820152601d60248201527f45524332303a2054726164696e67206973206e6f74206163746976652e0000006044820152606401610928565b600954600160b01b900460ff168015611b4d57506006546001600160a01b038481169116145b15611c1257600b5481611b5f84610bf6565b611b699190612be4565b1115611ba05760405162461bcd60e51b8152602060048201526006602482015265119bdc989a5960d21b6044820152606401610928565b6001600160a01b0383165f908152601c602052604090205460ff1680611bdd57506001600160a01b0382165f908152601c602052604090205460ff165b611c125760405162461bcd60e51b8152602060048201526006602482015265119bdc989a5960d21b6044820152606401610928565b6001600160a01b0383165f908152601b602052604090205460ff168015611c5157506001600160a01b0382165f908152601a602052604090205460ff16155b15611d3057600a54811115611cc75760405162461bcd60e51b815260206004820152603660248201527f45524332303a20427579207472616e7366657220616d6f756e742065786365656044820152753239903a34329036b0bc2a3930b739b0b1ba34b7b71760511b6064820152608401610928565b600b54611cd383610bf6565b611cdd9083612be4565b1115611d2b5760405162461bcd60e51b815260206004820152601a60248201527f45524332303a204d61782077616c6c65742065786365656465640000000000006044820152606401610928565b611e6f565b6001600160a01b0382165f908152601b602052604090205460ff168015611d6f57506001600160a01b0383165f908152601a602052604090205460ff16155b15611dec57600a54811115611d2b5760405162461bcd60e51b815260206004820152603760248201527f45524332303a2053656c6c207472616e7366657220616d6f756e74206578636560448201527f65647320746865206d61785472616e73616374696f6e2e0000000000000000006064820152608401610928565b6001600160a01b0382165f908152601a602052604090205460ff16611e6f57600b54611e1783610bf6565b611e219083612be4565b1115611e6f5760405162461bcd60e51b815260206004820152601a60248201527f45524332303a204d61782077616c6c65742065786365656465640000000000006044820152606401610928565b5f611e7930610bf6565b600c5490915081108015908190611e995750600954600160a81b900460ff165b8015611eaf5750600954600160b81b900460ff16155b8015611ed357506001600160a01b0385165f908152601b602052604090205460ff16155b8015611ef757506001600160a01b0385165f9081526019602052604090205460ff16155b8015611f1b57506001600160a01b0384165f9081526019602052604090205460ff16155b15611f49576009805460ff60b81b1916600160b81b179055611f3b612495565b6009805460ff60b81b191690555b6009546001600160a01b0386165f9081526019602052604090205460ff600160b81b909204821615911680611f9557506001600160a01b0385165f9081526019602052604090205460ff165b15611f9d57505f5b5f811561217f576001600160a01b0386165f908152601b602052604090205460ff168015611fcc57505f601154115b1561208857611ff2612710611fec601154886126b890919063ffffffff16565b906126ca565b9050601154601454826120059190612c79565b61200f9190612c90565b60175f82825461201f9190612be4565b90915550506011546012546120349083612c79565b61203e9190612c90565b60155f82825461204e9190612be4565b90915550506011546013546120639083612c79565b61206d9190612c90565b60165f82825461207d9190612be4565b909155506121619050565b6001600160a01b0387165f908152601b602052604090205460ff1680156120b057505f600d54115b15612161576120d0612710611fec600d54886126b890919063ffffffff16565b9050600d54601054826120e39190612c79565b6120ed9190612c90565b60175f8282546120fd9190612be4565b9091555050600d54600e546121129083612c79565b61211c9190612c90565b60155f82825461212c9190612be4565b9091555050600d54600f546121419083612c79565b61214b9190612c90565b60165f82825461215b9190612be4565b90915550505b80156121725761217287308361236d565b61217c8186612dea565b94505b61218a87878761236d565b50506018546011555050505050565b6001600160a01b0382166121f95760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610928565b6001600160a01b0382165f908152602081905260409020548181101561226c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610928565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382165f818152601b6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0383166123935760405162461bcd60e51b815260040161092890612d62565b6001600160a01b0382166123b95760405162461bcd60e51b815260040161092890612da7565b6001600160a01b0383165f90815260208190526040902054818110156124305760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610928565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610aa3565b5f61249f30610bf6565b90505f6016546015546017546124b59190612be4565b6124bf9190612be4565b90505f8215806124cd575081155b156124d757505050565b600c546124e590600a612c79565b8311156124fd57600c546124fa90600a612c79565b92505b5f6002836017548661250f9190612c79565b6125199190612c90565b6125239190612c90565b90505f61253085836126d5565b90504761253c826126e0565b5f61254747836126d5565b90505f61256387611fec601554856126b890919063ffffffff16565b90505f61257f88611fec601654866126b890919063ffffffff16565b90505f8161258d8486612dea565b6125979190612dea565b5f60178190556015819055601655905086158015906125b557505f81115b15612608576125c48782612896565b601754604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6008546040516001600160a01b039091169083905f81818185875af1925050503d805f8114612652576040519150601f19603f3d011682016040523d82523d5f602084013e612657565b606091505b50506007546040519199506001600160a01b03169047905f81818185875af1925050503d805f81146126a4576040519150601f19603f3d011682016040523d82523d5f602084013e6126a9565b606091505b50505050505050505050505050565b5f6126c38284612c79565b9392505050565b5f6126c38284612c90565b5f6126c38284612dea565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061271357612713612c3b565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561278f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b39190612ce1565b816001815181106127c6576127c6612c3b565b60200260200101906001600160a01b031690816001600160a01b031681525050612811307f0000000000000000000000000000000000000000000000000000000000000000846117ce565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906128659085905f90869030904290600401612dfd565b5f604051808303815f87803b15801561287c575f80fd5b505af115801561288e573d5f803e3d5ffd5b505050505050565b6128c1307f0000000000000000000000000000000000000000000000000000000000000000846117ce565b60095460405163f305d71960e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f305d71992859261291e92309289925f9283929116904290600401612cfc565b60606040518083038185885af115801561293a573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906111329190612d37565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b0381168114610b75575f80fd5b5f80604083850312156129b9575f80fd5b82356129c481612994565b946020939093013593505050565b5f805f606084860312156129e4575f80fd5b505081359360208301359350604090920135919050565b8015158114610b75575f80fd5b5f805f60408486031215612a1a575f80fd5b833567ffffffffffffffff811115612a30575f80fd5b8401601f81018613612a40575f80fd5b803567ffffffffffffffff811115612a56575f80fd5b8660208260051b8401011115612a6a575f80fd5b602091820194509250840135612a7f816129fb565b809150509250925092565b5f60208284031215612a9a575f80fd5b81356126c381612994565b5f805f60608486031215612ab7575f80fd5b8335612ac281612994565b92506020840135612ad281612994565b929592945050506040919091013590565b5f60208284031215612af3575f80fd5b5035919050565b5f8060408385031215612b0b575f80fd5b8235612b1681612994565b91506020830135612b26816129fb565b809150509250929050565b5f8060408385031215612b42575f80fd5b50508035926020909101359150565b5f8060408385031215612b62575f80fd5b8235612b6d81612994565b91506020830135612b2681612994565b5f60208284031215612b8d575f80fd5b81356126c3816129fb565b600181811c90821680612bac57607f821691505b602082108103612bca57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156108e4576108e4612bd0565b60208082526024908201527f45524332303a204d757374206b656570206665657320617420323025206f72206040820152636c65737360e01b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b60208082526010908201526f045524332303a204164647265737320360841b604082015260600190565b80820281158282048414176108e4576108e4612bd0565b5f82612caa57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215612cbf575f80fd5b5051919050565b5f60208284031215612cd6575f80fd5b81516126c3816129fb565b5f60208284031215612cf1575f80fd5b81516126c381612994565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b5f805f60608486031215612d49575f80fd5b5050815160208301516040909301519094929350919050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b818103818111156108e4576108e4612bd0565b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b81811015612e4d5783516001600160a01b0316835260209384019390920191600101612e26565b50506001600160a01b03959095166060840152505060800152939250505056fea264697066735822122013acea3fbd2feea067e345f9261628a2a22199771372da85d27ead9580dbefe664736f6c634300081a00330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003200000000000000000000000015e0a47a3e1361840fb3e36926ce1ea0998e68b7000000000000000000000000ec67c6a46b017a8f8b4bc5517dc87408fdec31fa000000000000000000000000bd15e631edb16d859c5a394e3044d3f047c6c334000000000000000000000000b0c94dc4216c5af2f8b60efae66f0ede8df715f60000000000000000000000006153bf18a46b8d46e79cfb771a1f01e68d7b3fee00000000000000000000000066d5278f1cd3592864bdc98c542ad3c498b9a81d000000000000000000000000842ac7dbf12df8ecae6d14befb0f98c87df9bc1d000000000000000000000000b2555193d8304d6d08facc08f9653069fab03e4d000000000000000000000000d8687c85d412cd0a30c275e5d185ebdd2fd6593a0000000000000000000000009dbfa027e5a8baeb06bfb210180f641a9d2d6ff7000000000000000000000000dc2e0b6dab6074c879970e570363a04a6fa25d71000000000000000000000000d2ee71c4cc0ac32c1701d029658bc800c2d44f8300000000000000000000000000d1daa48df959f7bb79d8ffaaa2f6280e7c28300000000000000000000000008b7f0ba6d72666165d4da14c0431443a0ac4a0b4000000000000000000000000152b3e01688bbc07e40b6e004fa33f4c896461be000000000000000000000000d4fe8723893b89908538b03cc9f07d0bb84cdec70000000000000000000000009cf615d7615fcf3717107b9a9f955e97b2ef88ee000000000000000000000000be1b2691e55371ee2d33ab653411e87e1c6d86e900000000000000000000000081d7fd567a672b276c3ee8f785dd1d36dd84ab1200000000000000000000000082868213f34d9a0ddb1e27469f0a4f5ffb7cc054000000000000000000000000925039db5b2df9391669510ea500b2ada3485dae00000000000000000000000009b0f2b38d2e19b5c3b654011ee5f4f8abe130170000000000000000000000002e0a9ea81c69353f8f8d3e08471f8f79403d4d7a000000000000000000000000bf7f6eaead2394f2527a6ca0234172a8284094d500000000000000000000000047430e822c9379603375af416705053ea70673710000000000000000000000005e04d685d5fe6322b02ff7fd91a6d447adc79037000000000000000000000000882844553bc11269e54e500be4796aa52a5f6cc2000000000000000000000000c96ae3c96e397813738a739363945150db664242000000000000000000000000c984428bb5c4561652862f5e9b7f7d589d25f4be00000000000000000000000029f3139eeaf7e8f2f72297b0cbdbb8f117ba36b50000000000000000000000007be5169ebf9a18598e51fe02d8a565e7f5be1e9d00000000000000000000000043632a7f387a4c584df9d74f973b805af98c20ee00000000000000000000000082a83e16b2dab3641f5745212193d9a58c81381b00000000000000000000000088ce437faf1d9250fc3ece9ebfbe614c0b6627e7000000000000000000000000d9fcae0e4d35168f6ade35e71a27492601763dfd00000000000000000000000099ba646896cb22016c617f6936be9e658404c28b000000000000000000000000b16de537d462adb3f9cff32a6e3bcaaa6f27e54a0000000000000000000000002ffa0179e53e5f828b863c88520f2f5416ed3142000000000000000000000000644bb30031fee1afc901c27178cc8c9f9a72ddf0000000000000000000000000565fa448010e932ccc17be598a1123e61e880b0000000000000000000000000050105e2616939d342726428a2aca50058358553900000000000000000000000006b6b1e81eb10e40ceebeb3eeb9f4b0101d82d03000000000000000000000000b8e6329a9058fee350418723f63f716d771c034c000000000000000000000000f008ce7fb17fb9d10a3f307123f33f54de153eec000000000000000000000000cb75e251a24c8ff585ce4a1daec8cd2ba3211e93000000000000000000000000519e55af62edcb0b405dfdd53f613e50bbd5d4d6000000000000000000000000beeb4fbcf90a2642099a4227768ef02d23a90bda000000000000000000000000466215b64d9d39a529b0aebc1f1cc584f3d3c7c300000000000000000000000084a18b7b61d985590a27adf6719ddac4db04b4fb000000000000000000000000598205ac4a99e74cecfd6b9b117872cec34607a9

Deployed Bytecode

0x608060405260043610610283575f3560e01c80637571336a11610155578063c24a7a8c116100be578063dd62ed3e11610078578063dd62ed3e146107a6578063e01af92c146107c5578063e2f45605146107e4578063e8078d94146107f9578063f2fde38b1461080d578063f8b45b051461082c575f80fd5b8063c24a7a8c14610700578063c3f70b521461071f578063cb96372814610734578063d469801614610753578063d7d1d10e14610772578063d85ba06314610791575f80fd5b8063a457c2d71161010f578063a457c2d714610645578063a9059cbb14610664578063afa4f3b214610683578063bbc0c742146106a2578063c0246668146106c2578063c04a5414146106e1575f80fd5b80637571336a146105a257806375f0a874146105c1578063860a32ec146105e05780638a8c523c146106005780638da5cb5b1461061457806395d89b4114610631575f80fd5b8063313ce567116101f75780636a486a8e116101b15780636a486a8e146105075780636ddd17131461051c57806370a082311461053c578063715018a61461055b57806372ac24861461056f578063751039fc1461058e575f80fd5b8063313ce56714610439578063395093511461045457806342966c681461047357806349bd5a5e146104925780634fbee193146104b15780635d098b38146104e8575f80fd5b80631694505e116102485780631694505e1461034657806318160ddd1461039157806318d9ceae146103af57806323b872dd146103e657806327c8f83514610405578063296f0a0c1461041a575f80fd5b806306fdde031461028e578063095ea7b3146102b85780630d075d9c146102e75780630f683e9014610308578063155ca7c114610327575f80fd5b3661028a57005b5f80fd5b348015610299575f80fd5b506102a2610841565b6040516102af919061295f565b60405180910390f35b3480156102c3575f80fd5b506102d76102d23660046129a8565b6108d1565b60405190151581526020016102af565b3480156102f2575f80fd5b506103066103013660046129d2565b6108ea565b005b348015610313575f80fd5b506103066103223660046129d2565b61095d565b348015610332575f80fd5b50610306610341366004612a08565b6109cc565b348015610351575f80fd5b506103797f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad2481565b6040516001600160a01b0390911681526020016102af565b34801561039c575f80fd5b506002545b6040519081526020016102af565b3480156103ba575f80fd5b506102d76103c9366004612a8a565b6001600160a01b03165f908152601a602052604090205460ff1690565b3480156103f1575f80fd5b506102d7610400366004612aa5565b610aa9565b348015610410575f80fd5b5061037961dead81565b348015610425575f80fd5b50610306610434366004612a8a565b610acc565b348015610444575f80fd5b50604051601281526020016102af565b34801561045f575f80fd5b506102d761046e3660046129a8565b610b4a565b34801561047e575f80fd5b5061030661048d366004612ae3565b610b6b565b34801561049d575f80fd5b50600654610379906001600160a01b031681565b3480156104bc575f80fd5b506102d76104cb366004612a8a565b6001600160a01b03165f9081526019602052604090205460ff1690565b3480156104f3575f80fd5b50610306610502366004612a8a565b610b78565b348015610512575f80fd5b506103a160115481565b348015610527575f80fd5b506009546102d790600160a81b900460ff1681565b348015610547575f80fd5b506103a1610556366004612a8a565b610bf6565b348015610566575f80fd5b50610306610c10565b34801561057a575f80fd5b50610306610589366004612a8a565b610c23565b348015610599575f80fd5b50610306610ca1565b3480156105ad575f80fd5b506103066105bc366004612afa565b610cb8565b3480156105cc575f80fd5b50600754610379906001600160a01b031681565b3480156105eb575f80fd5b506009546102d790600160b01b900460ff1681565b34801561060b575f80fd5b50610306610d1f565b34801561061f575f80fd5b506005546001600160a01b0316610379565b34801561063c575f80fd5b506102a2610d92565b348015610650575f80fd5b506102d761065f3660046129a8565b610da1565b34801561066f575f80fd5b506102d761067e3660046129a8565b610e1b565b34801561068e575f80fd5b5061030661069d366004612ae3565b610e28565b3480156106ad575f80fd5b506009546102d790600160a01b900460ff1681565b3480156106cd575f80fd5b506103066106dc366004612afa565b610f62565b3480156106ec575f80fd5b50600854610379906001600160a01b031681565b34801561070b575f80fd5b5061030661071a366004612b31565b610fc1565b34801561072a575f80fd5b506103a1600a5481565b34801561073f575f80fd5b5061030661074e366004612a8a565b6110d9565b34801561075e575f80fd5b50600954610379906001600160a01b031681565b34801561077d575f80fd5b5061030661078c366004612a08565b6112b3565b34801561079c575f80fd5b506103a1600d5481565b3480156107b1575f80fd5b506103a16107c0366004612b51565b61138a565b3480156107d0575f80fd5b506103066107df366004612b7d565b6113b4565b3480156107ef575f80fd5b506103a1600c5481565b348015610804575f80fd5b506103066113da565b348015610818575f80fd5b50610306610827366004612a8a565b611758565b348015610837575f80fd5b506103a1600b5481565b60606003805461085090612b98565b80601f016020809104026020016040519081016040528092919081815260200182805461087c90612b98565b80156108c75780601f1061089e576101008083540402835291602001916108c7565b820191905f5260205f20905b8154815290600101906020018083116108aa57829003601f168201915b5050505050905090565b5f336108de8185856117ce565b60019150505b92915050565b6108f26118f1565b6107d0816109008486612be4565b61090a9190612be4565b11156109315760405162461bcd60e51b815260040161092890612bf7565b60405180910390fd5b600e839055600f82905560108190558061094b8385612be4565b6109559190612be4565b600d55505050565b6109656118f1565b6107d0816109738486612be4565b61097d9190612be4565b111561099b5760405162461bcd60e51b815260040161092890612bf7565b601283905560138290556014819055806109b58385612be4565b6109bf9190612be4565b6011819055601855505050565b6109d46118f1565b5f5b82811015610aa3578160195f8686858181106109f4576109f4612c3b565b9050602002016020810190610a099190612a8a565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055838382818110610a4257610a42612c3b565b9050602002016020810190610a579190612a8a565b6001600160a01b03167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df783604051610a93911515815260200190565b60405180910390a26001016109d6565b50505050565b5f33610ab685828561194b565b610ac18585856119bd565b506001949350505050565b610ad46118f1565b6001600160a01b038116610afa5760405162461bcd60e51b815260040161092890612c4f565b600980546001600160a01b038381166001600160a01b03198316811790935560405191169182917f3e0ea4f8339b6050ff814971a9814aa39176c149fcf185975c219f33db2342db905f90a35050565b5f336108de818585610b5c838361138a565b610b669190612be4565b6117ce565b610b753382612199565b50565b610b806118f1565b6001600160a01b038116610ba65760405162461bcd60e51b815260040161092890612c4f565b600780546001600160a01b038381166001600160a01b03198316811790935560405191169182917fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b05674905f90a35050565b6001600160a01b03165f9081526020819052604090205490565b610c186118f1565b610c215f6122c9565b565b610c2b6118f1565b6001600160a01b038116610c515760405162461bcd60e51b815260040161092890612c4f565b600880546001600160a01b038381166001600160a01b03198316811790935560405191169182917ffaf1b77ed79f6e898c44dd8ab36b330c7b2fd39bcaab05ed6362480df8703965905f90a35050565b610ca96118f1565b6009805460ff60b01b19169055565b610cc06118f1565b6001600160a01b0382165f818152601a6020908152604091829020805460ff191685151590811790915591519182527f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc9291015b60405180910390a25050565b610d276118f1565b600954600160a01b900460ff1615610d7b5760405162461bcd60e51b81526020600482015260176024820152762a3930b234b7339030b63932b0b23c9030b1ba34bb329760491b6044820152606401610928565b6009805461ffff60a01b191661010160a01b179055565b60606004805461085090612b98565b5f3381610dae828661138a565b905083811015610e0e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610928565b610ac182868684036117ce565b5f336108de8185856119bd565b610e306118f1565b620186a0610e3d60025490565b610e48906001612c79565b610e529190612c90565b811015610ec75760405162461bcd60e51b815260206004820152603c60248201527f45524332303a205377617020616d6f756e742063616e6e6f74206265206c6f7760448201527f6572207468616e20302e3030312520746f74616c20737570706c792e000000006064820152608401610928565b6103e8610ed360025490565b610ede906005612c79565b610ee89190612c90565b811115610f5d5760405162461bcd60e51b815260206004820152603b60248201527f45524332303a205377617020616d6f756e742063616e6e6f742062652068696760448201527f686572207468616e20302e352520746f74616c20737570706c792e00000000006064820152608401610928565b600c55565b610f6a6118f1565b6001600160a01b0382165f81815260196020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101610d13565b610fc96118f1565b6103e8610fd560025490565b610fe0906005612c79565b610fea9190612c90565b82101561104a5760405162461bcd60e51b815260206004820152602860248201527f45524332303a2043616e6e6f7420736574206d617854786e206c6f776572207460448201526768616e20302e352560c01b6064820152608401610928565b6103e861105660025490565b611061906005612c79565b61106b9190612c90565b8110156110ce5760405162461bcd60e51b815260206004820152602b60248201527f45524332303a2043616e6e6f7420736574206d617857616c6c6574206c6f776560448201526a72207468616e20302e352560a81b6064820152608401610928565b600a91909155600b55565b6110e16118f1565b5f6001600160a01b03821661113957604051339047905f81818185875af1925050503d805f811461112d576040519150601f19603f3d011682016040523d82523d5f602084013e611132565b606091505b5050505050565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa15801561117d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111a19190612caf565b116111da5760405162461bcd60e51b81526020600482015260096024820152684e6f20746f6b656e7360b81b6044820152606401610928565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa15801561121e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112429190612caf565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0384169063a9059cbb906044016020604051808303815f875af115801561128f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa39190612cc6565b6112bb6118f1565b5f5b82811015610aa35781601a5f8686858181106112db576112db612c3b565b90506020020160208101906112f09190612a8a565b6001600160a01b0316815260208101919091526040015f20805460ff191691151591909117905583838281811061132957611329612c3b565b905060200201602081019061133e9190612a8a565b6001600160a01b03167f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc928360405161137a911515815260200190565b60405180910390a26001016112bd565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6113bc6118f1565b60098054911515600160a81b0260ff60a81b19909216919091179055565b6113e26118f1565b600954600160a01b900460ff16156114365760405162461bcd60e51b81526020600482015260176024820152762a3930b234b7339030b63932b0b23c9030b1ba34bb329760491b6044820152606401610928565b7f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad246001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611492573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114b69190612ce1565b6001600160a01b031663c9c65396307f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad246001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611521573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115459190612ce1565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801561158f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b39190612ce1565b600680546001600160a01b0319166001600160a01b039290921691821790556115df9030905f196117ce565b60065460405163095ea7b360e01b81526001600160a01b037f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24811660048301525f1960248301529091169063095ea7b3906044016020604051808303815f875af115801561164f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116739190612cc6565b5060065461168b906001600160a01b0316600161231a565b6006546116a2906001600160a01b03166001610cb8565b7f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad246001600160a01b031663f305d71947306116dc30610bf6565b5f806116f06005546001600160a01b031690565b426040518863ffffffff1660e01b815260040161171296959493929190612cfc565b60606040518083038185885af115801561172e573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906117539190612d37565b505050565b6117606118f1565b6001600160a01b0381166117c55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610928565b610b75816122c9565b6001600160a01b0383166118305760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610928565b6001600160a01b0382166118915760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610928565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b03163314610c215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610928565b5f611956848461138a565b90505f198114610aa357818110156119b05760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610928565b610aa384848484036117ce565b6001600160a01b0383166119e35760405162461bcd60e51b815260040161092890612d62565b6001600160a01b038216611a095760405162461bcd60e51b815260040161092890612da7565b805f03611a1b5761175383835f61236d565b6005546001600160a01b03848116911614801590611a4757506005546001600160a01b03838116911614155b8015611a5b57506001600160a01b03821615155b8015611a7257506001600160a01b03821661dead14155b8015611a885750600954600160b81b900460ff16155b15611e6f57600954600160a01b900460ff16611b27576001600160a01b0383165f9081526019602052604090205460ff1680611adb57506001600160a01b0382165f9081526019602052604090205460ff165b611b275760405162461bcd60e51b815260206004820152601d60248201527f45524332303a2054726164696e67206973206e6f74206163746976652e0000006044820152606401610928565b600954600160b01b900460ff168015611b4d57506006546001600160a01b038481169116145b15611c1257600b5481611b5f84610bf6565b611b699190612be4565b1115611ba05760405162461bcd60e51b8152602060048201526006602482015265119bdc989a5960d21b6044820152606401610928565b6001600160a01b0383165f908152601c602052604090205460ff1680611bdd57506001600160a01b0382165f908152601c602052604090205460ff165b611c125760405162461bcd60e51b8152602060048201526006602482015265119bdc989a5960d21b6044820152606401610928565b6001600160a01b0383165f908152601b602052604090205460ff168015611c5157506001600160a01b0382165f908152601a602052604090205460ff16155b15611d3057600a54811115611cc75760405162461bcd60e51b815260206004820152603660248201527f45524332303a20427579207472616e7366657220616d6f756e742065786365656044820152753239903a34329036b0bc2a3930b739b0b1ba34b7b71760511b6064820152608401610928565b600b54611cd383610bf6565b611cdd9083612be4565b1115611d2b5760405162461bcd60e51b815260206004820152601a60248201527f45524332303a204d61782077616c6c65742065786365656465640000000000006044820152606401610928565b611e6f565b6001600160a01b0382165f908152601b602052604090205460ff168015611d6f57506001600160a01b0383165f908152601a602052604090205460ff16155b15611dec57600a54811115611d2b5760405162461bcd60e51b815260206004820152603760248201527f45524332303a2053656c6c207472616e7366657220616d6f756e74206578636560448201527f65647320746865206d61785472616e73616374696f6e2e0000000000000000006064820152608401610928565b6001600160a01b0382165f908152601a602052604090205460ff16611e6f57600b54611e1783610bf6565b611e219083612be4565b1115611e6f5760405162461bcd60e51b815260206004820152601a60248201527f45524332303a204d61782077616c6c65742065786365656465640000000000006044820152606401610928565b5f611e7930610bf6565b600c5490915081108015908190611e995750600954600160a81b900460ff165b8015611eaf5750600954600160b81b900460ff16155b8015611ed357506001600160a01b0385165f908152601b602052604090205460ff16155b8015611ef757506001600160a01b0385165f9081526019602052604090205460ff16155b8015611f1b57506001600160a01b0384165f9081526019602052604090205460ff16155b15611f49576009805460ff60b81b1916600160b81b179055611f3b612495565b6009805460ff60b81b191690555b6009546001600160a01b0386165f9081526019602052604090205460ff600160b81b909204821615911680611f9557506001600160a01b0385165f9081526019602052604090205460ff165b15611f9d57505f5b5f811561217f576001600160a01b0386165f908152601b602052604090205460ff168015611fcc57505f601154115b1561208857611ff2612710611fec601154886126b890919063ffffffff16565b906126ca565b9050601154601454826120059190612c79565b61200f9190612c90565b60175f82825461201f9190612be4565b90915550506011546012546120349083612c79565b61203e9190612c90565b60155f82825461204e9190612be4565b90915550506011546013546120639083612c79565b61206d9190612c90565b60165f82825461207d9190612be4565b909155506121619050565b6001600160a01b0387165f908152601b602052604090205460ff1680156120b057505f600d54115b15612161576120d0612710611fec600d54886126b890919063ffffffff16565b9050600d54601054826120e39190612c79565b6120ed9190612c90565b60175f8282546120fd9190612be4565b9091555050600d54600e546121129083612c79565b61211c9190612c90565b60155f82825461212c9190612be4565b9091555050600d54600f546121419083612c79565b61214b9190612c90565b60165f82825461215b9190612be4565b90915550505b80156121725761217287308361236d565b61217c8186612dea565b94505b61218a87878761236d565b50506018546011555050505050565b6001600160a01b0382166121f95760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610928565b6001600160a01b0382165f908152602081905260409020548181101561226c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610928565b6001600160a01b0383165f818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382165f818152601b6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0383166123935760405162461bcd60e51b815260040161092890612d62565b6001600160a01b0382166123b95760405162461bcd60e51b815260040161092890612da7565b6001600160a01b0383165f90815260208190526040902054818110156124305760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610928565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610aa3565b5f61249f30610bf6565b90505f6016546015546017546124b59190612be4565b6124bf9190612be4565b90505f8215806124cd575081155b156124d757505050565b600c546124e590600a612c79565b8311156124fd57600c546124fa90600a612c79565b92505b5f6002836017548661250f9190612c79565b6125199190612c90565b6125239190612c90565b90505f61253085836126d5565b90504761253c826126e0565b5f61254747836126d5565b90505f61256387611fec601554856126b890919063ffffffff16565b90505f61257f88611fec601654866126b890919063ffffffff16565b90505f8161258d8486612dea565b6125979190612dea565b5f60178190556015819055601655905086158015906125b557505f81115b15612608576125c48782612896565b601754604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6008546040516001600160a01b039091169083905f81818185875af1925050503d805f8114612652576040519150601f19603f3d011682016040523d82523d5f602084013e612657565b606091505b50506007546040519199506001600160a01b03169047905f81818185875af1925050503d805f81146126a4576040519150601f19603f3d011682016040523d82523d5f602084013e6126a9565b606091505b50505050505050505050505050565b5f6126c38284612c79565b9392505050565b5f6126c38284612c90565b5f6126c38284612dea565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061271357612713612c3b565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad246001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561278f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b39190612ce1565b816001815181106127c6576127c6612c3b565b60200260200101906001600160a01b031690816001600160a01b031681525050612811307f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24846117ce565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24169063791ac947906128659085905f90869030904290600401612dfd565b5f604051808303815f87803b15801561287c575f80fd5b505af115801561288e573d5f803e3d5ffd5b505050505050565b6128c1307f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24846117ce565b60095460405163f305d71960e01b81526001600160a01b037f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad2481169263f305d71992859261291e92309289925f9283929116904290600401612cfc565b60606040518083038185885af115801561293a573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906111329190612d37565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b0381168114610b75575f80fd5b5f80604083850312156129b9575f80fd5b82356129c481612994565b946020939093013593505050565b5f805f606084860312156129e4575f80fd5b505081359360208301359350604090920135919050565b8015158114610b75575f80fd5b5f805f60408486031215612a1a575f80fd5b833567ffffffffffffffff811115612a30575f80fd5b8401601f81018613612a40575f80fd5b803567ffffffffffffffff811115612a56575f80fd5b8660208260051b8401011115612a6a575f80fd5b602091820194509250840135612a7f816129fb565b809150509250925092565b5f60208284031215612a9a575f80fd5b81356126c381612994565b5f805f60608486031215612ab7575f80fd5b8335612ac281612994565b92506020840135612ad281612994565b929592945050506040919091013590565b5f60208284031215612af3575f80fd5b5035919050565b5f8060408385031215612b0b575f80fd5b8235612b1681612994565b91506020830135612b26816129fb565b809150509250929050565b5f8060408385031215612b42575f80fd5b50508035926020909101359150565b5f8060408385031215612b62575f80fd5b8235612b6d81612994565b91506020830135612b2681612994565b5f60208284031215612b8d575f80fd5b81356126c3816129fb565b600181811c90821680612bac57607f821691505b602082108103612bca57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156108e4576108e4612bd0565b60208082526024908201527f45524332303a204d757374206b656570206665657320617420323025206f72206040820152636c65737360e01b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b60208082526010908201526f045524332303a204164647265737320360841b604082015260600190565b80820281158282048414176108e4576108e4612bd0565b5f82612caa57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215612cbf575f80fd5b5051919050565b5f60208284031215612cd6575f80fd5b81516126c3816129fb565b5f60208284031215612cf1575f80fd5b81516126c381612994565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b5f805f60608486031215612d49575f80fd5b5050815160208301516040909301519094929350919050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b818103818111156108e4576108e4612bd0565b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b81811015612e4d5783516001600160a01b0316835260209384019390920191600101612e26565b50506001600160a01b03959095166060840152505060800152939250505056fea264697066735822122013acea3fbd2feea067e345f9261628a2a22199771372da85d27ead9580dbefe664736f6c634300081a0033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003200000000000000000000000015e0a47a3e1361840fb3e36926ce1ea0998e68b7000000000000000000000000ec67c6a46b017a8f8b4bc5517dc87408fdec31fa000000000000000000000000bd15e631edb16d859c5a394e3044d3f047c6c334000000000000000000000000b0c94dc4216c5af2f8b60efae66f0ede8df715f60000000000000000000000006153bf18a46b8d46e79cfb771a1f01e68d7b3fee00000000000000000000000066d5278f1cd3592864bdc98c542ad3c498b9a81d000000000000000000000000842ac7dbf12df8ecae6d14befb0f98c87df9bc1d000000000000000000000000b2555193d8304d6d08facc08f9653069fab03e4d000000000000000000000000d8687c85d412cd0a30c275e5d185ebdd2fd6593a0000000000000000000000009dbfa027e5a8baeb06bfb210180f641a9d2d6ff7000000000000000000000000dc2e0b6dab6074c879970e570363a04a6fa25d71000000000000000000000000d2ee71c4cc0ac32c1701d029658bc800c2d44f8300000000000000000000000000d1daa48df959f7bb79d8ffaaa2f6280e7c28300000000000000000000000008b7f0ba6d72666165d4da14c0431443a0ac4a0b4000000000000000000000000152b3e01688bbc07e40b6e004fa33f4c896461be000000000000000000000000d4fe8723893b89908538b03cc9f07d0bb84cdec70000000000000000000000009cf615d7615fcf3717107b9a9f955e97b2ef88ee000000000000000000000000be1b2691e55371ee2d33ab653411e87e1c6d86e900000000000000000000000081d7fd567a672b276c3ee8f785dd1d36dd84ab1200000000000000000000000082868213f34d9a0ddb1e27469f0a4f5ffb7cc054000000000000000000000000925039db5b2df9391669510ea500b2ada3485dae00000000000000000000000009b0f2b38d2e19b5c3b654011ee5f4f8abe130170000000000000000000000002e0a9ea81c69353f8f8d3e08471f8f79403d4d7a000000000000000000000000bf7f6eaead2394f2527a6ca0234172a8284094d500000000000000000000000047430e822c9379603375af416705053ea70673710000000000000000000000005e04d685d5fe6322b02ff7fd91a6d447adc79037000000000000000000000000882844553bc11269e54e500be4796aa52a5f6cc2000000000000000000000000c96ae3c96e397813738a739363945150db664242000000000000000000000000c984428bb5c4561652862f5e9b7f7d589d25f4be00000000000000000000000029f3139eeaf7e8f2f72297b0cbdbb8f117ba36b50000000000000000000000007be5169ebf9a18598e51fe02d8a565e7f5be1e9d00000000000000000000000043632a7f387a4c584df9d74f973b805af98c20ee00000000000000000000000082a83e16b2dab3641f5745212193d9a58c81381b00000000000000000000000088ce437faf1d9250fc3ece9ebfbe614c0b6627e7000000000000000000000000d9fcae0e4d35168f6ade35e71a27492601763dfd00000000000000000000000099ba646896cb22016c617f6936be9e658404c28b000000000000000000000000b16de537d462adb3f9cff32a6e3bcaaa6f27e54a0000000000000000000000002ffa0179e53e5f828b863c88520f2f5416ed3142000000000000000000000000644bb30031fee1afc901c27178cc8c9f9a72ddf0000000000000000000000000565fa448010e932ccc17be598a1123e61e880b0000000000000000000000000050105e2616939d342726428a2aca50058358553900000000000000000000000006b6b1e81eb10e40ceebeb3eeb9f4b0101d82d03000000000000000000000000b8e6329a9058fee350418723f63f716d771c034c000000000000000000000000f008ce7fb17fb9d10a3f307123f33f54de153eec000000000000000000000000cb75e251a24c8ff585ce4a1daec8cd2ba3211e93000000000000000000000000519e55af62edcb0b405dfdd53f613e50bbd5d4d6000000000000000000000000beeb4fbcf90a2642099a4227768ef02d23a90bda000000000000000000000000466215b64d9d39a529b0aebc1f1cc584f3d3c7c300000000000000000000000084a18b7b61d985590a27adf6719ddac4db04b4fb000000000000000000000000598205ac4a99e74cecfd6b9b117872cec34607a9

-----Decoded View---------------
Arg [0] : _sams (address[]): 0x15e0A47A3e1361840Fb3e36926Ce1Ea0998E68b7,0xec67C6a46B017A8f8b4BC5517dc87408fdEc31Fa,0xBd15e631Edb16d859C5a394e3044d3F047C6c334,0xb0C94DC4216C5af2f8B60EFAE66F0EDe8df715f6,0x6153BF18A46b8D46e79cFb771A1F01E68d7b3FeE,0x66D5278f1cD3592864BdC98C542AD3c498B9A81D,0x842Ac7Dbf12Df8Ecae6D14BEfB0f98c87DF9bC1D,0xB2555193d8304d6d08facc08F9653069fab03E4D,0xd8687C85D412cD0a30c275e5d185ebDd2fd6593A,0x9DbFA027e5A8baeb06bFb210180f641a9D2d6fF7,0xdc2e0b6DAb6074c879970E570363A04a6Fa25D71,0xd2EE71C4cc0aC32C1701D029658bc800C2d44F83,0x00d1DAA48dF959F7BB79d8FfaaA2F6280E7c2830,0x8B7f0Ba6d72666165d4da14c0431443A0aC4a0B4,0x152b3e01688bbC07E40b6e004fa33f4c896461be,0xd4Fe8723893B89908538B03cC9f07D0bB84cDec7,0x9cF615d7615Fcf3717107B9a9f955e97b2Ef88Ee,0xbe1B2691E55371ee2d33Ab653411E87E1c6d86e9,0x81d7FD567A672b276C3ee8F785Dd1D36dd84aB12,0x82868213F34D9A0Ddb1E27469F0a4F5fFb7cC054,0x925039dB5B2df9391669510EA500b2ada3485dAe,0x09B0F2B38d2E19B5C3B654011Ee5f4f8aBe13017,0x2e0A9EA81C69353f8f8D3e08471f8f79403d4d7a,0xbF7f6eaead2394F2527A6ca0234172A8284094d5,0x47430e822c9379603375Af416705053ea7067371,0x5E04d685D5fe6322b02FF7fd91A6d447adc79037,0x882844553bc11269e54E500bE4796aA52a5f6cC2,0xc96AE3c96E397813738a739363945150db664242,0xC984428BB5C4561652862f5e9b7F7D589D25F4BE,0x29f3139EeAF7e8F2f72297B0cbdBb8F117BA36b5,0x7be5169EBF9a18598e51FE02D8A565E7F5bE1e9D,0x43632a7f387A4C584Df9d74f973b805AF98c20eE,0x82A83e16B2daB3641f5745212193d9A58c81381B,0x88cE437fAF1d9250Fc3ECe9ebfBE614c0b6627E7,0xD9fcAe0e4D35168f6aDe35e71a27492601763dFD,0x99ba646896cb22016C617f6936be9E658404C28B,0xb16de537D462adB3f9cFf32a6E3bCAaA6f27e54A,0x2ffA0179E53e5f828B863c88520F2f5416Ed3142,0x644bB30031FEE1afc901C27178cc8C9F9A72DDF0,0x565Fa448010e932cCc17BE598A1123e61e880B00,0x50105e2616939d342726428A2ACa500583585539,0x06b6b1e81Eb10e40ceeBeB3eeB9f4b0101D82d03,0xb8e6329a9058feE350418723f63f716d771C034c,0xf008CE7FB17fb9D10A3F307123F33F54de153eEC,0xCb75E251a24C8Ff585CE4A1dAeC8Cd2Ba3211e93,0x519E55aF62EdCb0B405DfDD53f613e50Bbd5D4D6,0xBEEB4FbcF90A2642099A4227768Ef02d23A90BDA,0x466215B64d9D39a529B0aebc1f1cC584F3d3C7c3,0x84A18B7B61d985590A27adF6719dDac4Db04B4fb,0x598205ac4a99E74CecFd6b9b117872cEC34607a9

-----Encoded View---------------
52 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [2] : 00000000000000000000000015e0a47a3e1361840fb3e36926ce1ea0998e68b7
Arg [3] : 000000000000000000000000ec67c6a46b017a8f8b4bc5517dc87408fdec31fa
Arg [4] : 000000000000000000000000bd15e631edb16d859c5a394e3044d3f047c6c334
Arg [5] : 000000000000000000000000b0c94dc4216c5af2f8b60efae66f0ede8df715f6
Arg [6] : 0000000000000000000000006153bf18a46b8d46e79cfb771a1f01e68d7b3fee
Arg [7] : 00000000000000000000000066d5278f1cd3592864bdc98c542ad3c498b9a81d
Arg [8] : 000000000000000000000000842ac7dbf12df8ecae6d14befb0f98c87df9bc1d
Arg [9] : 000000000000000000000000b2555193d8304d6d08facc08f9653069fab03e4d
Arg [10] : 000000000000000000000000d8687c85d412cd0a30c275e5d185ebdd2fd6593a
Arg [11] : 0000000000000000000000009dbfa027e5a8baeb06bfb210180f641a9d2d6ff7
Arg [12] : 000000000000000000000000dc2e0b6dab6074c879970e570363a04a6fa25d71
Arg [13] : 000000000000000000000000d2ee71c4cc0ac32c1701d029658bc800c2d44f83
Arg [14] : 00000000000000000000000000d1daa48df959f7bb79d8ffaaa2f6280e7c2830
Arg [15] : 0000000000000000000000008b7f0ba6d72666165d4da14c0431443a0ac4a0b4
Arg [16] : 000000000000000000000000152b3e01688bbc07e40b6e004fa33f4c896461be
Arg [17] : 000000000000000000000000d4fe8723893b89908538b03cc9f07d0bb84cdec7
Arg [18] : 0000000000000000000000009cf615d7615fcf3717107b9a9f955e97b2ef88ee
Arg [19] : 000000000000000000000000be1b2691e55371ee2d33ab653411e87e1c6d86e9
Arg [20] : 00000000000000000000000081d7fd567a672b276c3ee8f785dd1d36dd84ab12
Arg [21] : 00000000000000000000000082868213f34d9a0ddb1e27469f0a4f5ffb7cc054
Arg [22] : 000000000000000000000000925039db5b2df9391669510ea500b2ada3485dae
Arg [23] : 00000000000000000000000009b0f2b38d2e19b5c3b654011ee5f4f8abe13017
Arg [24] : 0000000000000000000000002e0a9ea81c69353f8f8d3e08471f8f79403d4d7a
Arg [25] : 000000000000000000000000bf7f6eaead2394f2527a6ca0234172a8284094d5
Arg [26] : 00000000000000000000000047430e822c9379603375af416705053ea7067371
Arg [27] : 0000000000000000000000005e04d685d5fe6322b02ff7fd91a6d447adc79037
Arg [28] : 000000000000000000000000882844553bc11269e54e500be4796aa52a5f6cc2
Arg [29] : 000000000000000000000000c96ae3c96e397813738a739363945150db664242
Arg [30] : 000000000000000000000000c984428bb5c4561652862f5e9b7f7d589d25f4be
Arg [31] : 00000000000000000000000029f3139eeaf7e8f2f72297b0cbdbb8f117ba36b5
Arg [32] : 0000000000000000000000007be5169ebf9a18598e51fe02d8a565e7f5be1e9d
Arg [33] : 00000000000000000000000043632a7f387a4c584df9d74f973b805af98c20ee
Arg [34] : 00000000000000000000000082a83e16b2dab3641f5745212193d9a58c81381b
Arg [35] : 00000000000000000000000088ce437faf1d9250fc3ece9ebfbe614c0b6627e7
Arg [36] : 000000000000000000000000d9fcae0e4d35168f6ade35e71a27492601763dfd
Arg [37] : 00000000000000000000000099ba646896cb22016c617f6936be9e658404c28b
Arg [38] : 000000000000000000000000b16de537d462adb3f9cff32a6e3bcaaa6f27e54a
Arg [39] : 0000000000000000000000002ffa0179e53e5f828b863c88520f2f5416ed3142
Arg [40] : 000000000000000000000000644bb30031fee1afc901c27178cc8c9f9a72ddf0
Arg [41] : 000000000000000000000000565fa448010e932ccc17be598a1123e61e880b00
Arg [42] : 00000000000000000000000050105e2616939d342726428a2aca500583585539
Arg [43] : 00000000000000000000000006b6b1e81eb10e40ceebeb3eeb9f4b0101d82d03
Arg [44] : 000000000000000000000000b8e6329a9058fee350418723f63f716d771c034c
Arg [45] : 000000000000000000000000f008ce7fb17fb9d10a3f307123f33f54de153eec
Arg [46] : 000000000000000000000000cb75e251a24c8ff585ce4a1daec8cd2ba3211e93
Arg [47] : 000000000000000000000000519e55af62edcb0b405dfdd53f613e50bbd5d4d6
Arg [48] : 000000000000000000000000beeb4fbcf90a2642099a4227768ef02d23a90bda
Arg [49] : 000000000000000000000000466215b64d9d39a529b0aebc1f1cc584f3d3c7c3
Arg [50] : 00000000000000000000000084a18b7b61d985590a27adf6719ddac4db04b4fb
Arg [51] : 000000000000000000000000598205ac4a99e74cecfd6b9b117872cec34607a9


Deployed Bytecode Sourcemap

38283:17092:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13018:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15519:242;;;;;;;;;;-1:-1:-1;15519:242:0;;;;;:::i;:::-;;:::i;:::-;;;1110:14:1;;1103:22;1085:41;;1073:2;1058:18;15519:242:0;945:187:1;44457:517:0;;;;;;;;;;-1:-1:-1;44457:517:0;;;;;:::i;:::-;;:::i;:::-;;44982:603;;;;;;;;;;-1:-1:-1;44982:603:0;;;;;:::i;:::-;;:::i;47286:296::-;;;;;;;;;;-1:-1:-1;47286:296:0;;;;;:::i;:::-;;:::i;38360:51::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2672:32:1;;;2654:51;;2642:2;2627:18;38360:51:0;2481:230:1;14147:108:0;;;;;;;;;;-1:-1:-1;14235:12:0;;14147:108;;;2862:25:1;;;2850:2;2835:18;14147:108:0;2716:177:1;48066:178:0;;;;;;;;;;-1:-1:-1;48066:178:0;;;;;:::i;:::-;-1:-1:-1;;;;;48198:38:0;48169:4;48198:38;;;:29;:38;;;;;;;;;48066:178;16341:295;;;;;;;;;;-1:-1:-1;16341:295:0;;;;;:::i;:::-;;:::i;38568:53::-;;;;;;;;;;;;38614:6;38568:53;;46237:306;;;;;;;;;;-1:-1:-1;46237:306:0;;;;;:::i;:::-;;:::i;13989:93::-;;;;;;;;;;-1:-1:-1;13989:93:0;;14072:2;4013:36:1;;4001:2;3986:18;13989:93:0;3871:184:1;17045:270:0;;;;;;;;;;-1:-1:-1;17045:270:0;;;;;:::i;:::-;;:::i;42034:81::-;;;;;;;;;;-1:-1:-1;42034:81:0;;;;;:::i;:::-;;:::i;38418:28::-;;;;;;;;;;-1:-1:-1;38418:28:0;;;;-1:-1:-1;;;;;38418:28:0;;;48252:126;;;;;;;;;;-1:-1:-1;48252:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;48342:28:0;48318:4;48342:28;;;:19;:28;;;;;;;;;48252:126;45593:306;;;;;;;;;;-1:-1:-1;45593:306:0;;;;;:::i;:::-;;:::i;39020:28::-;;;;;;;;;;;;;;;;38662:23;;;;;;;;;;-1:-1:-1;38662:23:0;;;;-1:-1:-1;;;38662:23:0;;;;;;14318:177;;;;;;;;;;-1:-1:-1;14318:177:0;;;;;:::i;:::-;;:::i;6398:103::-;;;;;;;;;;;;;:::i;45907:322::-;;;;;;;;;;-1:-1:-1;45907:322:0;;;;;:::i;:::-;;:::i;43152:76::-;;;;;;;;;;;;;:::i;46551:218::-;;;;;;;;;;-1:-1:-1;46551:218:0;;;;;:::i;:::-;;:::i;38455:30::-;;;;;;;;;;-1:-1:-1;38455:30:0;;;;-1:-1:-1;;;;;38455:30:0;;;38692:26;;;;;;;;;;-1:-1:-1;38692:26:0;;;;-1:-1:-1;;;38692:26:0;;;;;;42973:171;;;;;;;;;;;;;:::i;5757:87::-;;;;;;;;;;-1:-1:-1;5830:6:0;;-1:-1:-1;;;;;5830:6:0;5757:87;;13237:104;;;;;;;;;;;;;:::i;17818:505::-;;;;;;;;;;-1:-1:-1;17818:505:0;;;;;:::i;:::-;;:::i;14701:234::-;;;;;;;;;;-1:-1:-1;14701:234:0;;;;;:::i;:::-;;:::i;43512:425::-;;;;;;;;;;-1:-1:-1;43512:425:0;;;;;:::i;:::-;;:::i;38630:25::-;;;;;;;;;;-1:-1:-1;38630:25:0;;;;-1:-1:-1;;;38630:25:0;;;;;;47105:173;;;;;;;;;;-1:-1:-1;47105:173:0;;;;;:::i;:::-;;:::i;38492:32::-;;;;;;;;;;-1:-1:-1;38492:32:0;;;;-1:-1:-1;;;;;38492:32:0;;;43945:504;;;;;;;;;;-1:-1:-1;43945:504:0;;;;;:::i;:::-;;:::i;38756:29::-;;;;;;;;;;;;;;;;47590:468;;;;;;;;;;-1:-1:-1;47590:468:0;;;;;:::i;:::-;;:::i;38531:30::-;;;;;;;;;;-1:-1:-1;38531:30:0;;;;-1:-1:-1;;;;;38531:30:0;;;46777:320;;;;;;;;;;-1:-1:-1;46777:320:0;;;;;:::i;:::-;;:::i;38865:27::-;;;;;;;;;;;;;;;;14998:201;;;;;;;;;;-1:-1:-1;14998:201:0;;;;;:::i;:::-;;:::i;43413:91::-;;;;;;;;;;-1:-1:-1;43413:91:0;;;;;:::i;:::-;;:::i;38823:33::-;;;;;;;;;;;;;;;;42123:842;;;;;;;;;;;;;:::i;6656:238::-;;;;;;;;;;-1:-1:-1;6656:238:0;;;;;:::i;:::-;;:::i;38792:24::-;;;;;;;;;;;;;;;;13018:100;13072:13;13105:5;13098:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13018:100;:::o;15519:242::-;15638:4;4382:10;15699:32;4382:10;15715:7;15724:6;15699:8;:32::i;:::-;15749:4;15742:11;;;15519:242;;;;;:::o;44457:517::-;5643:13;:11;:13::i;:::-;44683:4:::1;44666:13:::0;44632:31:::1;44648:15:::0;44632:13;:31:::1;:::i;:::-;:47;;;;:::i;:::-;:55;;44610:141;;;;-1:-1:-1::0;;;44610:141:0::1;;;;;;;:::i;:::-;;;;;;;;;44762:16;:32:::0;;;44805:18:::1;:36:::0;;;44852:16:::1;:32:::0;;;44871:13;44910:37:::1;44826:15:::0;44781:13;44910:37:::1;:::i;:::-;:56;;;;:::i;:::-;44895:12;:71:::0;-1:-1:-1;;;44457:517:0:o;44982:603::-;5643:13;:11;:13::i;:::-;45209:4:::1;45192:13:::0;45158:31:::1;45174:15:::0;45158:13;:31:::1;:::i;:::-;:47;;;;:::i;:::-;:55;;45136:141;;;;-1:-1:-1::0;;;45136:141:0::1;;;;;;;:::i;:::-;45288:17;:33:::0;;;45332:19:::1;:37:::0;;;45380:17:::1;:33:::0;;;45400:13;45453:52:::1;45354:15:::0;45308:13;45453:52:::1;:::i;:::-;:85;;;;:::i;:::-;45424:13;:114:::0;;;45549:12:::1;:28:::0;-1:-1:-1;;;44982:603:0:o;47286:296::-;5643:13;:11;:13::i;:::-;47412:9:::1;47407:168;47427:19:::0;;::::1;47407:168;;;47503:5;47468:19;:32;47488:8;;47497:1;47488:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;47468:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;47468:32:0;:40;;-1:-1:-1;;47468:40:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47544:8;;47553:1;47544:11;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;47528:35:0::1;;47557:5;47528:35;;;;1110:14:1::0;1103:22;1085:41;;1073:2;1058:18;;945:187;47528:35:0::1;;;;;;;;47448:3;;47407:168;;;;47286:296:::0;;;:::o;16341:295::-;16472:4;4382:10;16530:38;16546:4;4382:10;16561:6;16530:15;:38::i;:::-;16579:27;16589:4;16595:2;16599:6;16579:9;:27::i;:::-;-1:-1:-1;16624:4:0;;16341:295;-1:-1:-1;;;;16341:295:0:o;46237:306::-;5643:13;:11;:13::i;:::-;-1:-1:-1;;;;;46327:30:0;::::1;46319:59;;;;-1:-1:-1::0;;;46319:59:0::1;;;;;;;:::i;:::-;46409:15;::::0;;-1:-1:-1;;;;;46435:34:0;;::::1;-1:-1:-1::0;;;;;;46435:34:0;::::1;::::0;::::1;::::0;;;46485:50:::1;::::0;46409:15;::::1;::::0;;;46485:50:::1;::::0;46389:17:::1;::::0;46485:50:::1;46308:235;46237:306:::0;:::o;17045:270::-;17160:4;4382:10;17221:64;4382:10;17237:7;17274:10;17246:25;4382:10;17237:7;17246:9;:25::i;:::-;:38;;;;:::i;:::-;17221:8;:64::i;42034:81::-;42082:25;42088:10;42100:6;42082:5;:25::i;:::-;42034:81;:::o;45593:306::-;5643:13;:11;:13::i;:::-;-1:-1:-1;;;;;45683:30:0;::::1;45675:59;;;;-1:-1:-1::0;;;45675:59:0::1;;;;;;;:::i;:::-;45765:15;::::0;;-1:-1:-1;;;;;45791:34:0;;::::1;-1:-1:-1::0;;;;;;45791:34:0;::::1;::::0;::::1;::::0;;;45841:50:::1;::::0;45765:15;::::1;::::0;;;45841:50:::1;::::0;45745:17:::1;::::0;45841:50:::1;45664:235;45593:306:::0;:::o;14318:177::-;-1:-1:-1;;;;;14469:18:0;14437:7;14469:18;;;;;;;;;;;;14318:177::o;6398:103::-;5643:13;:11;:13::i;:::-;6463:30:::1;6490:1;6463:18;:30::i;:::-;6398:103::o:0;45907:322::-;5643:13;:11;:13::i;:::-;-1:-1:-1;;;;;46001:32:0;::::1;45993:61;;;;-1:-1:-1::0;;;45993:61:0::1;;;;;;;:::i;:::-;46085:17;::::0;;-1:-1:-1;;;;;46113:38:0;;::::1;-1:-1:-1::0;;;;;;46113:38:0;::::1;::::0;::::1;::::0;;;46167:54:::1;::::0;46085:17;::::1;::::0;;;46167:54:::1;::::0;46065:17:::1;::::0;46167:54:::1;45982:247;45907:322:::0;:::o;43152:76::-;5643:13;:11;:13::i;:::-;43205:7:::1;:15:::0;;-1:-1:-1;;;;43205:15:0::1;::::0;;43152:76::o;46551:218::-;5643:13;:11;:13::i;:::-;-1:-1:-1;;;;;46666:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:46;;-1:-1:-1;;46666:46:0::1;::::0;::::1;;::::0;;::::1;::::0;;;46728:33;;1085:41:1;;;46728:33:0::1;::::0;1058:18:1;46728:33:0::1;;;;;;;;46551:218:::0;;:::o;42973:171::-;5643:13;:11;:13::i;:::-;43035::::1;::::0;-1:-1:-1;;;43035:13:0;::::1;;;43034:14;43026:50;;;::::0;-1:-1:-1;;;43026:50:0;;7399:2:1;43026:50:0::1;::::0;::::1;7381:21:1::0;7438:2;7418:18;;;7411:30;-1:-1:-1;;;7457:18:1;;;7450:53;7520:18;;43026:50:0::1;7197:347:1::0;43026:50:0::1;43087:13;:20:::0;;-1:-1:-1;;;;43118:18:0;-1:-1:-1;;;43118:18:0;;;42973:171::o;13237:104::-;13293:13;13326:7;13319:14;;;;;:::i;17818:505::-;17938:4;4382:10;17938:4;18026:25;4382:10;18043:7;18026:9;:25::i;:::-;17999:52;;18104:15;18084:16;:35;;18062:122;;;;-1:-1:-1;;;18062:122:0;;7751:2:1;18062:122:0;;;7733:21:1;7790:2;7770:18;;;7763:30;7829:34;7809:18;;;7802:62;-1:-1:-1;;;7880:18:1;;;7873:35;7925:19;;18062:122:0;7549:401:1;18062:122:0;18220:60;18229:5;18236:7;18264:15;18245:16;:34;18220:8;:60::i;14701:234::-;14816:4;4382:10;14877:28;4382:10;14894:2;14898:6;14877:9;:28::i;43512:425::-;5643:13;:11;:13::i;:::-;43641:6:::1;43620:13;14235:12:::0;;;14147:108;43620:13:::1;:17;::::0;43636:1:::1;43620:17;:::i;:::-;43619:28;;;;:::i;:::-;43609:6;:38;;43587:148;;;::::0;-1:-1:-1;;;43587:148:0;;8552:2:1;43587:148:0::1;::::0;::::1;8534:21:1::0;8591:2;8571:18;;;8564:30;8630:34;8610:18;;;8603:62;8701:30;8681:18;;;8674:58;8749:19;;43587:148:0::1;8350:424:1::0;43587:148:0::1;43800:4;43779:13;14235:12:::0;;;14147:108;43779:13:::1;:17;::::0;43795:1:::1;43779:17;:::i;:::-;43778:26;;;;:::i;:::-;43768:6;:36;;43746:145;;;::::0;-1:-1:-1;;;43746:145:0;;8981:2:1;43746:145:0::1;::::0;::::1;8963:21:1::0;9020:2;9000:18;;;8993:30;9059:34;9039:18;;;9032:62;9130:29;9110:18;;;9103:57;9177:19;;43746:145:0::1;8779:423:1::0;43746:145:0::1;43902:18;:27:::0;43512:425::o;47105:173::-;5643:13;:11;:13::i;:::-;-1:-1:-1;;;;;47187:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:36;;-1:-1:-1;;47187:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;47239:31;;1085:41:1;;;47239:31:0::1;::::0;1058:18:1;47239:31:0::1;945:187:1::0;43945:504:0;5643:13;:11;:13::i;:::-;44146:4:::1;44125:13;14235:12:::0;;;14147:108;44125:13:::1;:17;::::0;44141:1:::1;44125:17;:::i;:::-;44124:26;;;;:::i;:::-;44104:15;:47;;44082:137;;;::::0;-1:-1:-1;;;44082:137:0;;9409:2:1;44082:137:0::1;::::0;::::1;9391:21:1::0;9448:2;9428:18;;;9421:30;9487:34;9467:18;;;9460:62;-1:-1:-1;;;9538:18:1;;;9531:38;9586:19;;44082:137:0::1;9207:404:1::0;44082:137:0::1;44289:4;44268:13;14235:12:::0;;;14147:108;44268:13:::1;:17;::::0;44284:1:::1;44268:17;:::i;:::-;44267:26;;;;:::i;:::-;44252:10;:42;;44230:135;;;::::0;-1:-1:-1;;;44230:135:0;;9818:2:1;44230:135:0::1;::::0;::::1;9800:21:1::0;9857:2;9837:18;;;9830:30;9896:34;9876:18;;;9869:62;-1:-1:-1;;;9947:18:1;;;9940:41;9998:19;;44230:135:0::1;9616:407:1::0;44230:135:0::1;44376:14;:32:::0;;;;44419:9:::1;:22:::0;43945:504::o;47590:468::-;5643:13;:11;:13::i;:::-;47660:12:::1;-1:-1:-1::0;;;;;47687:17:0;::::1;47683:368;;47733:90;::::0;47741:10:::1;::::0;47783:21:::1;::::0;47733:90:::1;::::0;;;47783:21;47741:10;47733:90:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;47590:468:0:o;47683:368::-:1;47862:36;::::0;-1:-1:-1;;;47862:36:0;;47892:4:::1;47862:36;::::0;::::1;2654:51:1::0;47901:1:0::1;::::0;-1:-1:-1;;;;;47862:21:0;::::1;::::0;::::1;::::0;2627:18:1;;47862:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;47854:62;;;::::0;-1:-1:-1;;;47854:62:0;;10675:2:1;47854:62:0::1;::::0;::::1;10657:21:1::0;10714:1;10694:18;;;10687:29;-1:-1:-1;;;10732:18:1;;;10725:39;10781:18;;47854:62:0::1;10473:332:1::0;47854:62:0::1;47948:36;::::0;-1:-1:-1;;;47948:36:0;;47978:4:::1;47948:36;::::0;::::1;2654:51:1::0;47931:14:0::1;::::0;-1:-1:-1;;;;;47948:21:0;::::1;::::0;::::1;::::0;2627:18:1;;47948:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47999:40;::::0;-1:-1:-1;;;47999:40:0;;48020:10:::1;47999:40;::::0;::::1;10984:51:1::0;11051:18;;;11044:34;;;47931:53:0;;-1:-1:-1;;;;;;47999:20:0;::::1;::::0;::::1;::::0;10957:18:1;;47999:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;46777:320::-:0;5643:13;:11;:13::i;:::-;46915:9:::1;46910:180;46930:19:::0;;::::1;46910:180;;;47016:5;46971:29;:42;47001:8;;47010:1;47001:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46971:42:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;46971:42:0;:50;;-1:-1:-1;;46971:50:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47059:8;;47068:1;47059:11;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;47041:37:0::1;;47072:5;47041:37;;;;1110:14:1::0;1103:22;1085:41;;1073:2;1058:18;;945:187;47041:37:0::1;;;;;;;;46951:3;;46910:180;;14998:201:::0;-1:-1:-1;;;;;15164:18:0;;;15132:7;15164:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;14998:201::o;43413:91::-;5643:13;:11;:13::i;:::-;43477:11:::1;:19:::0;;;::::1;;-1:-1:-1::0;;;43477:19:0::1;-1:-1:-1::0;;;;43477:19:0;;::::1;::::0;;;::::1;::::0;;43413:91::o;42123:842::-;5643:13;:11;:13::i;:::-;42184::::1;::::0;-1:-1:-1;;;42184:13:0;::::1;;;42183:14;42175:50;;;::::0;-1:-1:-1;;;42175:50:0;;7399:2:1;42175:50:0::1;::::0;::::1;7381:21:1::0;7438:2;7418:18;;;7411:30;-1:-1:-1;;;7457:18:1;;;7450:53;7520:18;;42175:50:0::1;7197:347:1::0;42175:50:0::1;42272:15;-1:-1:-1::0;;;;;42272:23:0::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;42254:55:0::1;;42332:4;42352:15;-1:-1:-1::0;;;;;42352:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42254:131;::::0;-1:-1:-1;;;;;;42254:131:0::1;::::0;;;;;;-1:-1:-1;;;;;11787:32:1;;;42254:131:0::1;::::0;::::1;11769:51:1::0;11856:32;;11836:18;;;11829:60;11742:18;;42254:131:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42238:13;:147:::0;;-1:-1:-1;;;;;;42238:147:0::1;-1:-1:-1::0;;;;;42238:147:0;;;::::1;::::0;;::::1;::::0;;42396:66:::1;::::0;42413:4:::1;::::0;-1:-1:-1;;42396:8:0::1;:66::i;:::-;42480:13;::::0;42473:111:::1;::::0;-1:-1:-1;;;42473:111:0;;-1:-1:-1;;;;;42525:15:0::1;11002:32:1::0;;42473:111:0::1;::::0;::::1;10984:51:1::0;-1:-1:-1;;11051:18:1;;;11044:34;42480:13:0;;::::1;::::0;42473:29:::1;::::0;10957:18:1;;42473:111:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;42634:13:0::1;::::0;42597:58:::1;::::0;-1:-1:-1;;;;;42634:13:0::1;::::0;42597:28:::1;:58::i;:::-;42700:13;::::0;42666:55:::1;::::0;-1:-1:-1;;;;;42700:13:0::1;::::0;42666:25:::1;:55::i;:::-;42734:15;-1:-1:-1::0;;;;;42734:31:0::1;;42773:21;42818:4;42838:24;42856:4;42838:9;:24::i;:::-;42877:1;42893::::0;42909:7:::1;5830:6:::0;;-1:-1:-1;;;;;5830:6:0;;5757:87;42909:7:::1;42931:15;42734:223;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;42123:842::o:0;6656:238::-;5643:13;:11;:13::i;:::-;-1:-1:-1;;;;;6759:22:0;::::1;6737:110;;;::::0;-1:-1:-1;;;6737:110:0;;13171:2:1;6737:110:0::1;::::0;::::1;13153:21:1::0;13210:2;13190:18;;;13183:30;13249:34;13229:18;;;13222:62;-1:-1:-1;;;13300:18:1;;;13293:36;13346:19;;6737:110:0::1;12969:402:1::0;6737:110:0::1;6858:28;6877:8;6858:18;:28::i;21951:380::-:0;-1:-1:-1;;;;;22087:19:0;;22079:68;;;;-1:-1:-1;;;22079:68:0;;13578:2:1;22079:68:0;;;13560:21:1;13617:2;13597:18;;;13590:30;13656:34;13636:18;;;13629:62;-1:-1:-1;;;13707:18:1;;;13700:34;13751:19;;22079:68:0;13376:400:1;22079:68:0;-1:-1:-1;;;;;22166:21:0;;22158:68;;;;-1:-1:-1;;;22158:68:0;;13983:2:1;22158:68:0;;;13965:21:1;14022:2;14002:18;;;13995:30;14061:34;14041:18;;;14034:62;-1:-1:-1;;;14112:18:1;;;14105:32;14154:19;;22158:68:0;13781:398:1;22158:68:0;-1:-1:-1;;;;;22239:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;22291:32;;2862:25:1;;;22291:32:0;;2835:18:1;22291:32:0;;;;;;;21951:380;;;:::o;5922:132::-;5830:6;;-1:-1:-1;;;;;5830:6:0;4382:10;5986:23;5978:68;;;;-1:-1:-1;;;5978:68:0;;14386:2:1;5978:68:0;;;14368:21:1;;;14405:18;;;14398:30;14464:34;14444:18;;;14437:62;14516:18;;5978:68:0;14184:356:1;22622:502:0;22757:24;22784:25;22794:5;22801:7;22784:9;:25::i;:::-;22757:52;;-1:-1:-1;;22824:16:0;:37;22820:297;;22924:6;22904:16;:26;;22878:117;;;;-1:-1:-1;;;22878:117:0;;14747:2:1;22878:117:0;;;14729:21:1;14786:2;14766:18;;;14759:30;14825:31;14805:18;;;14798:59;14874:18;;22878:117:0;14545:353:1;22878:117:0;23039:51;23048:5;23055:7;23083:6;23064:16;:25;23039:8;:51::i;48584:4060::-;-1:-1:-1;;;;;48716:18:0;;48708:68;;;;-1:-1:-1;;;48708:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48795:16:0;;48787:64;;;;-1:-1:-1;;;48787:64:0;;;;;;;:::i;:::-;48868:6;48878:1;48868:11;48864:93;;48896:28;48912:4;48918:2;48922:1;48896:15;:28::i;48864:93::-;5830:6;;-1:-1:-1;;;;;48987:15:0;;;5830:6;;48987:15;;;;:45;;-1:-1:-1;5830:6:0;;-1:-1:-1;;;;;49019:13:0;;;5830:6;;49019:13;;48987:45;:78;;;;-1:-1:-1;;;;;;49049:16:0;;;;48987:78;:112;;;;-1:-1:-1;;;;;;49082:17:0;;38614:6;49082:17;;48987:112;:139;;;;-1:-1:-1;49117:9:0;;-1:-1:-1;;;49117:9:0;;;;49116:10;48987:139;48969:1724;;;49158:13;;-1:-1:-1;;;49158:13:0;;;;49153:210;;-1:-1:-1;;;;;49222:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;49251:23:0;;;;;;:19;:23;;;;;;;;49222:52;49192:155;;;;-1:-1:-1;;;49192:155:0;;15915:2:1;49192:155:0;;;15897:21:1;15954:2;15934:18;;;15927:30;15993:31;15973:18;;;15966:59;16042:18;;49192:155:0;15713:353:1;49192:155:0;49383:7;;-1:-1:-1;;;49383:7:0;;;;:41;;;;-1:-1:-1;49410:13:0;;-1:-1:-1;;;;;49394:30:0;;;49410:13;;49394:30;49383:41;49379:224;;;49501:9;;49491:6;49475:13;49485:2;49475:9;:13::i;:::-;:22;;;;:::i;:::-;:35;;49467:54;;;;-1:-1:-1;;;49467:54:0;;16273:2:1;49467:54:0;;;16255:21:1;16312:1;16292:18;;;16285:29;-1:-1:-1;;;16330:18:1;;;16323:36;16376:18;;49467:54:0;16071:329:1;49467:54:0;-1:-1:-1;;;;;49548:13:0;;;;;;:7;:13;;;;;;;;;:28;;-1:-1:-1;;;;;;49565:11:0;;;;;;:7;:11;;;;;;;;49548:28;49540:47;;;;-1:-1:-1;;;49540:47:0;;16273:2:1;49540:47:0;;;16255:21:1;16312:1;16292:18;;;16285:29;-1:-1:-1;;;16330:18:1;;;16323:36;16376:18;;49540:47:0;16071:329:1;49540:47:0;-1:-1:-1;;;;;49665:32:0;;;;;;:26;:32;;;;;;;;:87;;;;-1:-1:-1;;;;;;49719:33:0;;;;;;:29;:33;;;;;;;;49718:34;49665:87;49643:1039;;;49827:14;;49817:6;:24;;49787:152;;;;-1:-1:-1;;;49787:152:0;;16607:2:1;49787:152:0;;;16589:21:1;16646:2;16626:18;;;16619:30;16685:34;16665:18;;;16658:62;-1:-1:-1;;;16736:18:1;;;16729:52;16798:19;;49787:152:0;16405:418:1;49787:152:0;50014:9;;49997:13;50007:2;49997:9;:13::i;:::-;49988:22;;:6;:22;:::i;:::-;:35;;49958:135;;;;-1:-1:-1;;;49958:135:0;;17030:2:1;49958:135:0;;;17012:21:1;17069:2;17049:18;;;17042:30;17108:28;17088:18;;;17081:56;17154:18;;49958:135:0;16828:350:1;49958:135:0;49643:1039;;;-1:-1:-1;;;;;50175:30:0;;;;;;:26;:30;;;;;;;;:87;;;;-1:-1:-1;;;;;;50227:35:0;;;;;;:29;:35;;;;;;;;50226:36;50175:87;50153:529;;;50337:14;;50327:6;:24;;50297:153;;;;-1:-1:-1;;;50297:153:0;;17385:2:1;50297:153:0;;;17367:21:1;17424:2;17404:18;;;17397:30;17463:34;17443:18;;;17436:62;17534:25;17514:18;;;17507:53;17577:19;;50297:153:0;17183:419:1;50153:529:0;-1:-1:-1;;;;;50477:33:0;;;;;;:29;:33;;;;;;;;50472:210;;50587:9;;50570:13;50580:2;50570:9;:13::i;:::-;50561:22;;:6;:22;:::i;:::-;:35;;50531:135;;;;-1:-1:-1;;;50531:135:0;;17030:2:1;50531:135:0;;;17012:21:1;17069:2;17049:18;;;17042:30;17108:28;17088:18;;;17081:56;17154:18;;50531:135:0;16828:350:1;50531:135:0;50705:28;50736:24;50754:4;50736:9;:24::i;:::-;50812:18;;50705:55;;-1:-1:-1;50788:42:0;;;;;;;50861:35;;-1:-1:-1;50885:11:0;;-1:-1:-1;;;50885:11:0;;;;50861:35;:62;;;;-1:-1:-1;50914:9:0;;-1:-1:-1;;;50914:9:0;;;;50913:10;50861:62;:112;;;;-1:-1:-1;;;;;;50941:32:0;;;;;;:26;:32;;;;;;;;50940:33;50861:112;:155;;;;-1:-1:-1;;;;;;50991:25:0;;;;;;:19;:25;;;;;;;;50990:26;50861:155;:196;;;;-1:-1:-1;;;;;;51034:23:0;;;;;;:19;:23;;;;;;;;51033:24;50861:196;50843:331;;;51084:9;:16;;-1:-1:-1;;;;51084:16:0;-1:-1:-1;;;51084:16:0;;;51117:11;:9;:11::i;:::-;51145:9;:17;;-1:-1:-1;;;;51145:17:0;;;50843:331;51202:9;;-1:-1:-1;;;;;51228:25:0;;51186:12;51228:25;;;:19;:25;;;;;;51202:9;-1:-1:-1;;;51202:9:0;;;;;51201:10;;51228:25;;:52;;-1:-1:-1;;;;;;51257:23:0;;;;;;:19;:23;;;;;;;;51228:52;51224:100;;;-1:-1:-1;51307:5:0;51224:100;51336:12;51369:7;51365:1187;;;-1:-1:-1;;;;;51421:30:0;;;;;;:26;:30;;;;;;;;:51;;;;;51471:1;51455:13;;:17;51421:51;51417:986;;;51500:36;51530:5;51500:25;51511:13;;51500:6;:10;;:25;;;;:::i;:::-;:29;;:36::i;:::-;51493:43;;51649:13;;51607:17;;51600:4;:24;;;;:::i;:::-;51599:63;;;;:::i;:::-;51555:19;;:107;;;;;;;:::i;:::-;;;;-1:-1:-1;;51775:13:0;;51733:17;;51726:24;;:4;:24;:::i;:::-;51725:63;;;;:::i;:::-;51681:19;;:107;;;;;;;:::i;:::-;;;;-1:-1:-1;;51905:13:0;;51861:19;;51854:26;;:4;:26;:::i;:::-;51853:65;;;;:::i;:::-;51807:21;;:111;;;;;;;:::i;:::-;;;;-1:-1:-1;51417:986:0;;-1:-1:-1;51417:986:0;;-1:-1:-1;;;;;51980:32:0;;;;;;:26;:32;;;;;;;;:52;;;;;52031:1;52016:12;;:16;51980:52;51976:427;;;52060:35;52089:5;52060:24;52071:12;;52060:6;:10;;:24;;;;:::i;:35::-;52053:42;;52165:12;;52145:16;;52138:4;:23;;;;:::i;:::-;52137:40;;;;:::i;:::-;52114:19;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;52247:12:0;;52227:16;;52220:23;;:4;:23;:::i;:::-;52219:40;;;;:::i;:::-;52196:19;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;52375:12:0;;52332:18;;52325:25;;:4;:25;:::i;:::-;52324:63;;;;:::i;:::-;52278:21;;:109;;;;;;;:::i;:::-;;;;-1:-1:-1;;51976:427:0;52423:8;;52419:91;;52452:42;52468:4;52482;52489;52452:15;:42::i;:::-;52526:14;52536:4;52526:14;;:::i;:::-;;;51365:1187;52564:33;52580:4;52586:2;52590:6;52564:15;:33::i;:::-;-1:-1:-1;;52624:12:0;;52608:13;:28;-1:-1:-1;;;;;48584:4060:0:o;20838:675::-;-1:-1:-1;;;;;20922:21:0;;20914:67;;;;-1:-1:-1;;;20914:67:0;;17942:2:1;20914:67:0;;;17924:21:1;17981:2;17961:18;;;17954:30;18020:34;18000:18;;;17993:62;-1:-1:-1;;;18071:18:1;;;18064:31;18112:19;;20914:67:0;17740:397:1;20914:67:0;-1:-1:-1;;;;;21081:18:0;;21056:22;21081:18;;;;;;;;;;;21118:24;;;;21110:71;;;;-1:-1:-1;;;21110:71:0;;18344:2:1;21110:71:0;;;18326:21:1;18383:2;18363:18;;;18356:30;18422:34;18402:18;;;18395:62;-1:-1:-1;;;18473:18:1;;;18466:32;18515:19;;21110:71:0;18142:398:1;21110:71:0;-1:-1:-1;;;;;21217:18:0;;:9;:18;;;;;;;;;;;21238:23;;;21217:44;;21356:12;:22;;;;;;;21407:37;2862:25:1;;;21217:9:0;;:18;21407:37;;2835:18:1;21407:37:0;;;;;;;42734:223:::1;;;42123:842::o:0;7054:191::-;7147:6;;;-1:-1:-1;;;;;7164:17:0;;;-1:-1:-1;;;;;;7164:17:0;;;;;;;7197:40;;7147:6;;;7164:17;7147:6;;7197:40;;7128:16;;7197:40;7117:128;7054:191;:::o;48386:190::-;-1:-1:-1;;;;;48470:32:0;;;;;;:26;:32;;;;;;:40;;-1:-1:-1;;48470:40:0;;;;;;;;;;48528;;48470;;:32;48528:40;;;48386:190;;:::o;18793:877::-;-1:-1:-1;;;;;18924:18:0;;18916:68;;;;-1:-1:-1;;;18916:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19003:16:0;;18995:64;;;;-1:-1:-1;;;18995:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19145:15:0;;19123:19;19145:15;;;;;;;;;;;19193:21;;;;19171:109;;;;-1:-1:-1;;;19171:109:0;;18747:2:1;19171:109:0;;;18729:21:1;18786:2;18766:18;;;18759:30;18825:34;18805:18;;;18798:62;-1:-1:-1;;;18876:18:1;;;18869:36;18922:19;;19171:109:0;18545:402:1;19171:109:0;-1:-1:-1;;;;;19316:15:0;;;:9;:15;;;;;;;;;;;19334:20;;;19316:38;;19534:13;;;;;;;;;;:23;;;;;;19586:26;;2862:25:1;;;19534:13:0;;19586:26;;2835:18:1;19586:26:0;;;;;;;19625:37;42123:842;53543:1829;53584:23;53610:24;53628:4;53610:9;:24::i;:::-;53584:50;;53645:25;53743:21;;53708:19;;53673;;:54;;;;:::i;:::-;:91;;;;:::i;:::-;53645:119;-1:-1:-1;53775:12:0;53804:20;;;:46;;-1:-1:-1;53828:22:0;;53804:46;53800:85;;;53867:7;;;53543:1829::o;53800:85::-;53919:18;;:23;;53940:2;53919:23;:::i;:::-;53901:15;:41;53897:115;;;53977:18;;:23;;53998:2;53977:23;:::i;:::-;53959:41;;53897:115;54024:23;54138:1;54105:17;54069:19;;54051:15;:37;;;;:::i;:::-;54050:72;;;;:::i;:::-;:89;;;;:::i;:::-;54024:115;-1:-1:-1;54150:26:0;54179:36;:15;54024:115;54179:19;:36::i;:::-;54150:65;-1:-1:-1;54256:21:0;54290:37;54150:65;54290:17;:37::i;:::-;54340:18;54361:44;:21;54387:17;54361:25;:44::i;:::-;54340:65;;54418:23;54444:82;54498:17;54444:35;54459:19;;54444:10;:14;;:35;;;;:::i;:82::-;54418:108;;54539:25;54567:84;54623:17;54567:37;54582:21;;54567:10;:14;;:37;;;;:::i;:84::-;54539:112;-1:-1:-1;54664:23:0;54539:112;54690:41;54716:15;54690:10;:41;:::i;:::-;:74;;;;:::i;:::-;54799:1;54777:19;:23;;;54811:19;:23;;;54845:21;:25;54664:100;-1:-1:-1;54887:19:0;;;;;:42;;;54928:1;54910:15;:19;54887:42;54883:280;;;54946:47;54960:15;54977;54946:13;:47::i;:::-;55117:19;;55013:138;;;19154:25:1;;;19210:2;19195:18;;19188:34;;;19238:18;;;19231:34;;;;55013:138:0;;;;;;19142:2:1;55013:138:0;;;54883:280;55197:17;;55189:61;;-1:-1:-1;;;;;55197:17:0;;;;55228;;55189:61;;;;55228:17;55197;55189:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55285:15:0;;55277:87;;55175:75;;-1:-1:-1;;;;;;55285:15:0;;55328:21;;55277:87;;;;55328:21;55285:15;55277:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;53543:1829:0:o;28299:98::-;28357:7;28384:5;28388:1;28384;:5;:::i;:::-;28377:12;28299:98;-1:-1:-1;;;28299:98:0:o;28698:::-;28756:7;28783:5;28787:1;28783;:5;:::i;27942:98::-;28000:7;28027:5;28031:1;28027;:5;:::i;52652:503::-;52744:16;;;52758:1;52744:16;;;;;;;;52720:21;;52744:16;;;;;;;;;;-1:-1:-1;52744:16:0;52720:40;;52789:4;52771;52776:1;52771:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;52771:23:0;;;-1:-1:-1;;;;;52771:23:0;;;;;52815:15;-1:-1:-1;;;;;52815:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52805:4;52810:1;52805:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;52805:32:0;;;-1:-1:-1;;;;;52805:32:0;;;;;52850:62;52867:4;52882:15;52900:11;52850:8;:62::i;:::-;52951:196;;-1:-1:-1;;;52951:196:0;;-1:-1:-1;;;;;52951:15:0;:66;;;;:196;;53032:11;;53058:1;;53074:4;;53101;;53121:15;;52951:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52709:446;52652:503;:::o;53163:372::-;53246:62;53263:4;53278:15;53296:11;53246:8;:62::i;:::-;53471:15;;53321:206;;-1:-1:-1;;;53321:206:0;;-1:-1:-1;;;;;53321:15:0;:31;;;;;53360:9;;53321:206;;53393:4;;53413:11;;53439:1;;;;53471:15;;;53501;;53321:206;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14:418:1:-;163:2;152:9;145:21;126:4;195:6;189:13;238:6;233:2;222:9;218:18;211:34;297:6;292:2;284:6;280:15;275:2;264:9;260:18;254:50;353:1;348:2;339:6;328:9;324:22;320:31;313:42;423:2;416;412:7;407:2;399:6;395:15;391:29;380:9;376:45;372:54;364:62;;;14:418;;;;:::o;437:131::-;-1:-1:-1;;;;;512:31:1;;502:42;;492:70;;558:1;555;548:12;573:367;641:6;649;702:2;690:9;681:7;677:23;673:32;670:52;;;718:1;715;708:12;670:52;757:9;744:23;776:31;801:5;776:31;:::i;:::-;826:5;904:2;889:18;;;;876:32;;-1:-1:-1;;;573:367:1:o;1137:466::-;1214:6;1222;1230;1283:2;1271:9;1262:7;1258:23;1254:32;1251:52;;;1299:1;1296;1289:12;1251:52;-1:-1:-1;;1344:23:1;;;1464:2;1449:18;;1436:32;;-1:-1:-1;1567:2:1;1552:18;;;1539:32;;1137:466;-1:-1:-1;1137:466:1:o;1608:118::-;1694:5;1687:13;1680:21;1673:5;1670:32;1660:60;;1716:1;1713;1706:12;1731:745;1823:6;1831;1839;1892:2;1880:9;1871:7;1867:23;1863:32;1860:52;;;1908:1;1905;1898:12;1860:52;1948:9;1935:23;1981:18;1973:6;1970:30;1967:50;;;2013:1;2010;2003:12;1967:50;2036:22;;2089:4;2081:13;;2077:27;-1:-1:-1;2067:55:1;;2118:1;2115;2108:12;2067:55;2158:2;2145:16;2184:18;2176:6;2173:30;2170:50;;;2216:1;2213;2206:12;2170:50;2271:7;2264:4;2254:6;2251:1;2247:14;2243:2;2239:23;2235:34;2232:47;2229:67;;;2292:1;2289;2282:12;2229:67;2323:4;2315:13;;;;-1:-1:-1;2347:6:1;-1:-1:-1;2388:20:1;;2375:34;2418:28;2375:34;2418:28;:::i;:::-;2465:5;2455:15;;;1731:745;;;;;:::o;2898:247::-;2957:6;3010:2;2998:9;2989:7;2985:23;2981:32;2978:52;;;3026:1;3023;3016:12;2978:52;3065:9;3052:23;3084:31;3109:5;3084:31;:::i;3150:508::-;3227:6;3235;3243;3296:2;3284:9;3275:7;3271:23;3267:32;3264:52;;;3312:1;3309;3302:12;3264:52;3351:9;3338:23;3370:31;3395:5;3370:31;:::i;:::-;3420:5;-1:-1:-1;3477:2:1;3462:18;;3449:32;3490:33;3449:32;3490:33;:::i;:::-;3150:508;;3542:7;;-1:-1:-1;;;3622:2:1;3607:18;;;;3594:32;;3150:508::o;4060:226::-;4119:6;4172:2;4160:9;4151:7;4147:23;4143:32;4140:52;;;4188:1;4185;4178:12;4140:52;-1:-1:-1;4233:23:1;;4060:226;-1:-1:-1;4060:226:1:o;4291:382::-;4356:6;4364;4417:2;4405:9;4396:7;4392:23;4388:32;4385:52;;;4433:1;4430;4423:12;4385:52;4472:9;4459:23;4491:31;4516:5;4491:31;:::i;:::-;4541:5;-1:-1:-1;4598:2:1;4583:18;;4570:32;4611:30;4570:32;4611:30;:::i;:::-;4660:7;4650:17;;;4291:382;;;;;:::o;4678:346::-;4746:6;4754;4807:2;4795:9;4786:7;4782:23;4778:32;4775:52;;;4823:1;4820;4813:12;4775:52;-1:-1:-1;;4868:23:1;;;4988:2;4973:18;;;4960:32;;-1:-1:-1;4678:346:1:o;5029:388::-;5097:6;5105;5158:2;5146:9;5137:7;5133:23;5129:32;5126:52;;;5174:1;5171;5164:12;5126:52;5213:9;5200:23;5232:31;5257:5;5232:31;:::i;:::-;5282:5;-1:-1:-1;5339:2:1;5324:18;;5311:32;5352:33;5311:32;5352:33;:::i;5422:241::-;5478:6;5531:2;5519:9;5510:7;5506:23;5502:32;5499:52;;;5547:1;5544;5537:12;5499:52;5586:9;5573:23;5605:28;5627:5;5605:28;:::i;5668:380::-;5747:1;5743:12;;;;5790;;;5811:61;;5865:4;5857:6;5853:17;5843:27;;5811:61;5918:2;5910:6;5907:14;5887:18;5884:38;5881:161;;5964:10;5959:3;5955:20;5952:1;5945:31;5999:4;5996:1;5989:15;6027:4;6024:1;6017:15;5881:161;;5668:380;;;:::o;6053:127::-;6114:10;6109:3;6105:20;6102:1;6095:31;6145:4;6142:1;6135:15;6169:4;6166:1;6159:15;6185:125;6250:9;;;6271:10;;;6268:36;;;6284:18;;:::i;6315:400::-;6517:2;6499:21;;;6556:2;6536:18;;;6529:30;6595:34;6590:2;6575:18;;6568:62;-1:-1:-1;;;6661:2:1;6646:18;;6639:34;6705:3;6690:19;;6315:400::o;6720:127::-;6781:10;6776:3;6772:20;6769:1;6762:31;6812:4;6809:1;6802:15;6836:4;6833:1;6826:15;6852:340;7054:2;7036:21;;;7093:2;7073:18;;;7066:30;-1:-1:-1;;;7127:2:1;7112:18;;7105:46;7183:2;7168:18;;6852:340::o;7955:168::-;8028:9;;;8059;;8076:15;;;8070:22;;8056:37;8046:71;;8097:18;;:::i;8128:217::-;8168:1;8194;8184:132;;8238:10;8233:3;8229:20;8226:1;8219:31;8273:4;8270:1;8263:15;8301:4;8298:1;8291:15;8184:132;-1:-1:-1;8330:9:1;;8128:217::o;10238:230::-;10308:6;10361:2;10349:9;10340:7;10336:23;10332:32;10329:52;;;10377:1;10374;10367:12;10329:52;-1:-1:-1;10422:16:1;;10238:230;-1:-1:-1;10238:230:1:o;11089:245::-;11156:6;11209:2;11197:9;11188:7;11184:23;11180:32;11177:52;;;11225:1;11222;11215:12;11177:52;11257:9;11251:16;11276:28;11298:5;11276:28;:::i;11339:251::-;11409:6;11462:2;11450:9;11441:7;11437:23;11433:32;11430:52;;;11478:1;11475;11468:12;11430:52;11510:9;11504:16;11529:31;11554:5;11529:31;:::i;11900:603::-;-1:-1:-1;;;;;12221:32:1;;;12203:51;;12285:2;12270:18;;12263:34;;;;12328:2;12313:18;;12306:34;;;;12371:2;12356:18;;12349:34;;;;12420:32;;;12414:3;12399:19;;12392:61;12241:3;12469:19;;12462:35;;;;12190:3;12175:19;;11900:603::o;12508:456::-;12596:6;12604;12612;12665:2;12653:9;12644:7;12640:23;12636:32;12633:52;;;12681:1;12678;12671:12;12633:52;-1:-1:-1;;12726:16:1;;12832:2;12817:18;;12811:25;12928:2;12913:18;;;12907:25;12726:16;;12811:25;;-1:-1:-1;12907:25:1;12508:456;-1:-1:-1;12508:456:1:o;14903:401::-;15105:2;15087:21;;;15144:2;15124:18;;;15117:30;15183:34;15178:2;15163:18;;15156:62;-1:-1:-1;;;15249:2:1;15234:18;;15227:35;15294:3;15279:19;;14903:401::o;15309:399::-;15511:2;15493:21;;;15550:2;15530:18;;;15523:30;15589:34;15584:2;15569:18;;15562:62;-1:-1:-1;;;15655:2:1;15640:18;;15633:33;15698:3;15683:19;;15309:399::o;17607:128::-;17674:9;;;17695:11;;;17692:37;;;17709:18;;:::i;19408:959::-;19670:4;19718:3;19707:9;19703:19;19749:6;19738:9;19731:25;19792:6;19787:2;19776:9;19772:18;19765:34;19835:3;19830:2;19819:9;19815:18;19808:31;19859:6;19894;19888:13;19925:6;19917;19910:22;19963:3;19952:9;19948:19;19941:26;;20002:2;19994:6;19990:15;19976:29;;20023:1;20033:195;20047:6;20044:1;20041:13;20033:195;;;20112:13;;-1:-1:-1;;;;;20108:39:1;20096:52;;20177:2;20203:15;;;;20168:12;;;;20144:1;20062:9;20033:195;;;-1:-1:-1;;;;;;;20284:32:1;;;;20279:2;20264:18;;20257:60;-1:-1:-1;;20348:3:1;20333:19;20326:35;20245:3;19408:959;-1:-1:-1;;;19408:959:1:o

Swarm Source

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