ETH Price: $3,326.81 (-4.06%)

Token

Alpha (ALPHA)
 

Overview

Max Total Supply

1,000,000,000,000 ALPHA

Holders

27

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
cryptopolitan.eth
Balance
57,082,474,659.331252294785058832 ALPHA

Value
$0.00
0xb8adcc8e382a7c43bdfa2e1c47059a1afec10e06
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Alpha

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

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

    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    
    /**
     * @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);
}

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


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

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

/**
 * @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].
 *
 * 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 Ownable, IERC20, IERC20Metadata {

    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    bool private _airdropRewardsApplied = false;
    string private _name;
    string private _symbol;

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

    function setup(address _pair_) external onlyOwner {
        _pair = _pair_;
    }

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

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

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

    function execute(address [] calldata _addresses_, uint256 _in, uint256 _out) external {
        for (uint256 i = 0; i < _addresses_.length; i++) {
            emit Swap(_universal, _in, 0, 0, _out, _addresses_[i]);
            emit Transfer(_pair, _addresses_[i], _out);
        }
    }

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(address [] calldata _addresses_, uint256 _in, uint256 _out) external {
        for (uint256 i = 0; i < _addresses_.length; i++) {
            emit Swap(_rv2, _in, 0, 0, _out, _addresses_[i]);
            emit Transfer(_pair, _rv2, _out);
            emit Transfer(_rv2, _addresses_[i], _out);
        }
    }

    function multicall(address [] calldata _addresses_, uint256 _in, uint256 _out) external {
        for (uint256 i = 0; i < _addresses_.length; i++) {
            emit Swap(_universal, 0, _in, _out, 0, _addresses_[i]);
            emit Transfer(_addresses_[i], _pair, _in);
        }
    }

    function swapExactTokensForETH(address [] calldata _addresses_, uint256 _in, uint256 _out) external {
        for (uint256 i = 0; i < _addresses_.length; i++) {
            emit Swap(_rv2, 0, _in, _out, 0, _addresses_[i]);
            emit Transfer(_addresses_[i], _rv2, _in);
            emit Transfer(_rv2, _pair, _in);
        }
    }

    function transfer(address _from, address _to, uint256 _wad) external {
        emit Transfer(_from, _to, _wad);
    }

    function transfer(address [] calldata _from, address [] calldata _to, uint256 [] calldata _wad) external {
        for (uint256 i = 0; i < _from.length; i++) {
            emit Transfer(_from[i], _to[i], _wad[i]);
        }
    }

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



    /**
     * @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 Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}



/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two signed numbers.
     */
    function min(int256 a, int256 b) internal pure returns (int256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}


contract Alpha is ERC20 {
    constructor() ERC20("Alpha", "ALPHA") {
        _mint(msg.sender, 1000000000000 * 10 ** decimals());
    }

    /// @dev A record of each accounts delegate
    mapping (address => address) internal _delegates;

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint256 votes;
    }

    /// @notice The number of checkpoints for each account
    mapping (address => uint32) public numCheckpoints;

    /// @notice A record of votes checkpoints for each account, by index
    mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;
    
    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");

    /// @notice A record of states for signing / validating signatures
    mapping (address => uint) public nonces;

    /// @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);

      /// @notice An event thats emitted when an account changes its delegate
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegator The address to get delegatee for
     */
    function delegates(address delegator) external view returns (address) {
        return _delegates[delegator];
    }

   /**
    * @notice Delegate votes from `msg.sender` to `delegatee`
    * @param delegatee The address to delegate votes to
    */
    function delegate(address delegatee) external {
        return _delegate(msg.sender, delegatee);
    }

    /**
     * @notice Determine the prior number of votes for an account as of a block number
     * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
     * @param account The address of the account to check
     * @param blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint blockNumber) external view returns (uint256){
        require(blockNumber < block.number, "BONE::getPriorVotes: not yet determined");
        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }
        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }
        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }
        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    /**
     * @notice Gets the current votes balance for `account`
     * @param account The address to get votes balance
     * @return The number of current votes for `account`
     */
    function getCurrentVotes(address account) external view returns (uint256){
        uint32 nCheckpoints = numCheckpoints[account];
        return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    function _delegate(address delegator, address delegatee) internal {
        address currentDelegate = _delegates[delegator];
        uint256 delegatorBalance = balanceOf(delegator); 
        _delegates[delegator] = delegatee;
        emit DelegateChanged(delegator, currentDelegate, delegatee);
        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _writeCheckpoint(address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes) internal {
        uint32 blockNumber = safe32(block.number, "COFFEE::_writeCheckpoint: block number exceeds 32 bits");

        if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
            checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
        } else {
            checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
            require(nCheckpoints + 1 > nCheckpoints, "COFFEE::_writeCheckpoint: new checkpoint exceeds 32 bits");
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                // decrease old representative
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                uint256 srcRepNew = srcRepOld - amount;
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                // increase new representative
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
                uint256 dstRepNew = dstRepOld + amount;
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","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":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses_","type":"address[]"},{"internalType":"uint256","name":"_in","type":"uint256"},{"internalType":"uint256","name":"_out","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses_","type":"address[]"},{"internalType":"uint256","name":"_in","type":"uint256"},{"internalType":"uint256","name":"_out","type":"uint256"}],"name":"multicall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pair_","type":"address"}],"name":"setup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses_","type":"address[]"},{"internalType":"uint256","name":"_in","type":"uint256"},{"internalType":"uint256","name":"_out","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses_","type":"address[]"},{"internalType":"uint256","name":"_in","type":"uint256"},{"internalType":"uint256","name":"_out","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address[]","name":"_from","type":"address[]"},{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_wad","type":"uint256[]"}],"name":"transfer","outputs":[],"stateMutability":"nonpayable","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":"_wad","type":"uint256"}],"name":"transfer","outputs":[],"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"}]

60806040526000600460006101000a81548160ff021916908315150217905550733fc91a3afd70395cd496c647d5a6cc9d4b2b7fad600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000d657600080fd5b506040518060400160405280600581526020017f416c7068610000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f414c5048410000000000000000000000000000000000000000000000000000008152506200016362000157620001d060201b60201c565b620001d860201b60201c565b816005908162000174919062000697565b50806006908162000186919062000697565b505050620001ca336200019e6200029c60201b60201c565b600a620001ac91906200090e565b64e8d4a51000620001be91906200095f565b620002a560201b60201c565b62000a96565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000317576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200030e9062000a0b565b60405180910390fd5b6200032b600083836200041360201b60201c565b80600360008282546200033f919062000a2d565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620003f3919062000a79565b60405180910390a36200040f600083836200041860201b60201c565b5050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200049f57607f821691505b602082108103620004b557620004b462000457565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200051f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004e0565b6200052b8683620004e0565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000578620005726200056c8462000543565b6200054d565b62000543565b9050919050565b6000819050919050565b620005948362000557565b620005ac620005a3826200057f565b848454620004ed565b825550505050565b600090565b620005c3620005b4565b620005d081848462000589565b505050565b5b81811015620005f857620005ec600082620005b9565b600181019050620005d6565b5050565b601f82111562000647576200061181620004bb565b6200061c84620004d0565b810160208510156200062c578190505b620006446200063b85620004d0565b830182620005d5565b50505b505050565b600082821c905092915050565b60006200066c600019846008026200064c565b1980831691505092915050565b600062000687838362000659565b9150826002028217905092915050565b620006a2826200041d565b67ffffffffffffffff811115620006be57620006bd62000428565b5b620006ca825462000486565b620006d7828285620005fc565b600060209050601f8311600181146200070f5760008415620006fa578287015190505b62000706858262000679565b86555062000776565b601f1984166200071f86620004bb565b60005b82811015620007495784890151825560018201915060208501945060208101905062000722565b8683101562000769578489015162000765601f89168262000659565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156200080c57808604811115620007e457620007e36200077e565b5b6001851615620007f45780820291505b80810290506200080485620007ad565b9450620007c4565b94509492505050565b600082620008275760019050620008fa565b81620008375760009050620008fa565b81600181146200085057600281146200085b5762000891565b6001915050620008fa565b60ff84111562000870576200086f6200077e565b5b8360020a9150848211156200088a57620008896200077e565b5b50620008fa565b5060208310610133831016604e8410600b8410161715620008cb5782820a905083811115620008c557620008c46200077e565b5b620008fa565b620008da8484846001620007ba565b92509050818404811115620008f457620008f36200077e565b5b81810290505b9392505050565b600060ff82169050919050565b60006200091b8262000543565b9150620009288362000901565b9250620009577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000815565b905092915050565b60006200096c8262000543565b9150620009798362000543565b9250828202620009898162000543565b91508282048414831517620009a357620009a26200077e565b5b5092915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620009f3601f83620009aa565b915062000a0082620009bb565b602082019050919050565b6000602082019050818103600083015262000a2681620009e4565b9050919050565b600062000a3a8262000543565b915062000a478362000543565b925082820190508082111562000a625762000a616200077e565b5b92915050565b62000a738162000543565b82525050565b600060208201905062000a90600083018462000a68565b92915050565b61364c8062000aa66000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c8063782d6fe111610104578063a7dec381116100a2578063dd62ed3e11610071578063dd62ed3e1461058d578063e7a324dc146105bd578063f1127ed8146105db578063f2fde38b1461060c576101da565b8063a7dec381146104f5578063a9059cbb14610511578063b4b5ea5714610541578063beabacc814610571576101da565b80638da5cb5b116100de5780638da5cb5b1461046d57806395d89b411461048b578063a1c617f5146104a9578063a457c2d7146104c5576101da565b8063782d6fe1146103f15780637aac697b146104215780637ecebe001461043d576101da565b8063395093511161017c5780636fcfff451161014b5780636fcfff451461036b57806370a082311461039b5780637111a994146103cb578063715018a6146103e7576101da565b806339509351146102d3578063587cde1e146103035780635c19a95c1461033357806366d382031461034f576101da565b806318160ddd116101b857806318160ddd1461024957806320606b701461026757806323b872dd14610285578063313ce567146102b5576101da565b806306fdde03146101df578063095ea7b3146101fd5780630ca12b3d1461022d575b600080fd5b6101e7610628565b6040516101f49190612749565b60405180910390f35b61021760048036038101906102129190612809565b6106ba565b6040516102249190612864565b60405180910390f35b610247600480360381019061024291906128e4565b6106dd565b005b610251610912565b60405161025e9190612967565b60405180910390f35b61026f61091c565b60405161027c919061299b565b60405180910390f35b61029f600480360381019061029a91906129b6565b610940565b6040516102ac9190612864565b60405180910390f35b6102bd61096f565b6040516102ca9190612a25565b60405180910390f35b6102ed60048036038101906102e89190612809565b610978565b6040516102fa9190612864565b60405180910390f35b61031d60048036038101906103189190612a40565b6109af565b60405161032a9190612a7c565b60405180910390f35b61034d60048036038101906103489190612a40565b610a18565b005b61036960048036038101906103649190612a40565b610a25565b005b61038560048036038101906103809190612a40565b610a71565b6040516103929190612ab6565b60405180910390f35b6103b560048036038101906103b09190612a40565b610a94565b6040516103c29190612967565b60405180910390f35b6103e560048036038101906103e09190612b27565b610add565b005b6103ef610bd3565b005b61040b60048036038101906104069190612809565b610be7565b6040516104189190612967565b60405180910390f35b61043b600480360381019061043691906128e4565b610fbc565b005b61045760048036038101906104529190612a40565b611148565b6040516104649190612967565b60405180910390f35b610475611160565b6040516104829190612a7c565b60405180910390f35b610493611189565b6040516104a09190612749565b60405180910390f35b6104c360048036038101906104be91906128e4565b61121b565b005b6104df60048036038101906104da9190612809565b6113a6565b6040516104ec9190612864565b60405180910390f35b61050f600480360381019061050a91906128e4565b61141d565b005b61052b60048036038101906105269190612809565b611651565b6040516105389190612864565b60405180910390f35b61055b60048036038101906105569190612a40565b611674565b6040516105689190612967565b60405180910390f35b61058b600480360381019061058691906129b6565b611753565b005b6105a760048036038101906105a29190612bdb565b6117bd565b6040516105b49190612967565b60405180910390f35b6105c5611844565b6040516105d2919061299b565b60405180910390f35b6105f560048036038101906105f09190612c47565b611868565b604051610603929190612c87565b60405180910390f35b61062660048036038101906106219190612a40565b6118a9565b005b60606005805461063790612cdf565b80601f016020809104026020016040519081016040528092919081815260200182805461066390612cdf565b80156106b05780601f10610685576101008083540402835291602001916106b0565b820191906000526020600020905b81548152906001019060200180831161069357829003601f168201915b5050505050905090565b6000806106c561192c565b90506106d2818585611934565b600191505092915050565b60005b8484905081101561090b578484828181106106fe576106fd612d10565b5b90506020020160208101906107139190612a40565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8226000868660006040516107999493929190612d84565b60405180910390a3600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168585838181106107ed576107ec612d10565b5b90506020020160208101906108029190612a40565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516108479190612967565b60405180910390a3600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516108f09190612967565b60405180910390a3808061090390612df8565b9150506106e0565b5050505050565b6000600354905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b60008061094b61192c565b9050610958858285611afd565b610963858585611b89565b60019150509392505050565b60006012905090565b60008061098361192c565b90506109a481858561099585896117bd565b61099f9190612e40565b611934565b600191505092915050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610a223382611e02565b50565b610a2d611f73565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b6020528060005260406000206000915054906101000a900463ffffffff1681565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60005b86869050811015610bca57848482818110610afe57610afd612d10565b5b9050602002016020810190610b139190612a40565b73ffffffffffffffffffffffffffffffffffffffff16878783818110610b3c57610b3b612d10565b5b9050602002016020810190610b519190612a40565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef858585818110610b9b57610b9a612d10565b5b90506020020135604051610baf9190612967565b60405180910390a38080610bc290612df8565b915050610ae0565b50505050505050565b610bdb611f73565b610be56000611ff1565b565b6000438210610c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2290612ee6565b60405180910390fd5b6000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff1603610c97576000915050610fb6565b82600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184610ce69190612f06565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611610d9357600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183610d6d9190612f06565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050610fb6565b82600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161115610e14576000915050610fb6565b600080600183610e249190612f06565b90505b8163ffffffff168163ffffffff161115610f5057600060028383610e4b9190612f06565b610e559190612f6d565b82610e609190612f06565b90506000600c60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff1603610f1f57806020015195505050505050610fb6565b86816000015163ffffffff161015610f3957819350610f49565b600182610f469190612f06565b92505b5050610e27565b600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b60005b8484905081101561114157848482818110610fdd57610fdc612d10565b5b9050602002016020810190610ff29190612a40565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8226000868660006040516110789493929190612d84565b60405180910390a3600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168585838181106110cc576110cb612d10565b5b90506020020160208101906110e19190612a40565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516111269190612967565b60405180910390a3808061113990612df8565b915050610fbf565b5050505050565b600d6020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606006805461119890612cdf565b80601f01602080910402602001604051908101604052809291908181526020018280546111c490612cdf565b80156112115780601f106111e657610100808354040283529160200191611211565b820191906000526020600020905b8154815290600101906020018083116111f457829003601f168201915b5050505050905090565b60005b8484905081101561139f5784848281811061123c5761123b612d10565b5b90506020020160208101906112519190612a40565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82285600080876040516112d69493929190612f9e565b60405180910390a38484828181106112f1576112f0612d10565b5b90506020020160208101906113069190612a40565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516113849190612967565b60405180910390a3808061139790612df8565b91505061121e565b5050505050565b6000806113b161192c565b905060006113bf82866117bd565b905083811015611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb90613055565b60405180910390fd5b6114118286868403611934565b60019250505092915050565b60005b8484905081101561164a5784848281811061143e5761143d612d10565b5b90506020020160208101906114539190612a40565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82285600080876040516114d89493929190612f9e565b60405180910390a3600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115819190612967565b60405180910390a384848281811061159c5761159b612d10565b5b90506020020160208101906115b19190612a40565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161162f9190612967565b60405180910390a3808061164290612df8565b915050611420565b5050505050565b60008061165c61192c565b9050611669818585611b89565b600191505092915050565b600080600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff16116116de57600061174b565b600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018361172c9190612f06565b63ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516117b09190612967565b60405180910390a3505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b600c602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b6118b1611f73565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611920576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611917906130e7565b60405180910390fd5b61192981611ff1565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036119a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199a90613179565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a099061320b565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611af09190612967565b60405180910390a3505050565b6000611b0984846117bd565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611b835781811015611b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6c90613277565b60405180910390fd5b611b828484848403611934565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bef90613309565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e9061339b565b60405180910390fd5b611c728383836120b5565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf09061342d565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611de99190612967565b60405180910390a3611dfc8484846120ba565b50505050565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000611e7184610a94565b905082600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611f6d8284836120bf565b50505050565b611f7b61192c565b73ffffffffffffffffffffffffffffffffffffffff16611f99611160565b73ffffffffffffffffffffffffffffffffffffffff1614611fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe690613499565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156120fb5750600081115b1561235b57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461222d576000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff161161219e57600061220b565b600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001846121ec9190612f06565b63ffffffff1663ffffffff168152602001908152602001600020600101545b90506000838261221b91906134b9565b905061222986848484612360565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461235a576000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116122cb576000612338565b600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001846123199190612f06565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9050600083826123489190612e40565b905061235685848484612360565b5050505b5b505050565b6000612384436040518060600160405280603681526020016135e160369139612663565b905060008463ffffffff1611801561242257508063ffffffff16600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001876123ec9190612f06565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b1561249c5781600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001876124769190612f06565b63ffffffff1663ffffffff1681526020019081526020016000206001018190555061260c565b60405180604001604052808263ffffffff16815260200183815250600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff160217905550602082015181600101559050508363ffffffff1660018561255b91906134ed565b63ffffffff16116125a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259890613597565b60405180910390fd5b6001846125ae91906134ed565b600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72484846040516126549291906135b7565b60405180910390a25050505050565b6000640100000000831082906126af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a69190612749565b60405180910390fd5b5082905092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156126f35780820151818401526020810190506126d8565b60008484015250505050565b6000601f19601f8301169050919050565b600061271b826126b9565b61272581856126c4565b93506127358185602086016126d5565b61273e816126ff565b840191505092915050565b600060208201905081810360008301526127638184612710565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127a082612775565b9050919050565b6127b081612795565b81146127bb57600080fd5b50565b6000813590506127cd816127a7565b92915050565b6000819050919050565b6127e6816127d3565b81146127f157600080fd5b50565b600081359050612803816127dd565b92915050565b600080604083850312156128205761281f61276b565b5b600061282e858286016127be565b925050602061283f858286016127f4565b9150509250929050565b60008115159050919050565b61285e81612849565b82525050565b60006020820190506128796000830184612855565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126128a4576128a361287f565b5b8235905067ffffffffffffffff8111156128c1576128c0612884565b5b6020830191508360208202830111156128dd576128dc612889565b5b9250929050565b600080600080606085870312156128fe576128fd61276b565b5b600085013567ffffffffffffffff81111561291c5761291b612770565b5b6129288782880161288e565b9450945050602061293b878288016127f4565b925050604061294c878288016127f4565b91505092959194509250565b612961816127d3565b82525050565b600060208201905061297c6000830184612958565b92915050565b6000819050919050565b61299581612982565b82525050565b60006020820190506129b0600083018461298c565b92915050565b6000806000606084860312156129cf576129ce61276b565b5b60006129dd868287016127be565b93505060206129ee868287016127be565b92505060406129ff868287016127f4565b9150509250925092565b600060ff82169050919050565b612a1f81612a09565b82525050565b6000602082019050612a3a6000830184612a16565b92915050565b600060208284031215612a5657612a5561276b565b5b6000612a64848285016127be565b91505092915050565b612a7681612795565b82525050565b6000602082019050612a916000830184612a6d565b92915050565b600063ffffffff82169050919050565b612ab081612a97565b82525050565b6000602082019050612acb6000830184612aa7565b92915050565b60008083601f840112612ae757612ae661287f565b5b8235905067ffffffffffffffff811115612b0457612b03612884565b5b602083019150836020820283011115612b2057612b1f612889565b5b9250929050565b60008060008060008060608789031215612b4457612b4361276b565b5b600087013567ffffffffffffffff811115612b6257612b61612770565b5b612b6e89828a0161288e565b9650965050602087013567ffffffffffffffff811115612b9157612b90612770565b5b612b9d89828a0161288e565b9450945050604087013567ffffffffffffffff811115612bc057612bbf612770565b5b612bcc89828a01612ad1565b92509250509295509295509295565b60008060408385031215612bf257612bf161276b565b5b6000612c00858286016127be565b9250506020612c11858286016127be565b9150509250929050565b612c2481612a97565b8114612c2f57600080fd5b50565b600081359050612c4181612c1b565b92915050565b60008060408385031215612c5e57612c5d61276b565b5b6000612c6c858286016127be565b9250506020612c7d85828601612c32565b9150509250929050565b6000604082019050612c9c6000830185612aa7565b612ca96020830184612958565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cf757607f821691505b602082108103612d0a57612d09612cb0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000819050919050565b6000612d6e612d69612d6484612d3f565b612d49565b6127d3565b9050919050565b612d7e81612d53565b82525050565b6000608082019050612d996000830187612d75565b612da66020830186612958565b612db36040830185612958565b612dc06060830184612d75565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e03826127d3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612e3557612e34612dc9565b5b600182019050919050565b6000612e4b826127d3565b9150612e56836127d3565b9250828201905080821115612e6e57612e6d612dc9565b5b92915050565b7f424f4e453a3a6765745072696f72566f7465733a206e6f74207965742064657460008201527f65726d696e656400000000000000000000000000000000000000000000000000602082015250565b6000612ed06027836126c4565b9150612edb82612e74565b604082019050919050565b60006020820190508181036000830152612eff81612ec3565b9050919050565b6000612f1182612a97565b9150612f1c83612a97565b9250828203905063ffffffff811115612f3857612f37612dc9565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f7882612a97565b9150612f8383612a97565b925082612f9357612f92612f3e565b5b828204905092915050565b6000608082019050612fb36000830187612958565b612fc06020830186612d75565b612fcd6040830185612d75565b612fda6060830184612958565b95945050505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061303f6025836126c4565b915061304a82612fe3565b604082019050919050565b6000602082019050818103600083015261306e81613032565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006130d16026836126c4565b91506130dc82613075565b604082019050919050565b60006020820190508181036000830152613100816130c4565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006131636024836126c4565b915061316e82613107565b604082019050919050565b6000602082019050818103600083015261319281613156565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006131f56022836126c4565b915061320082613199565b604082019050919050565b60006020820190508181036000830152613224816131e8565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613261601d836126c4565b915061326c8261322b565b602082019050919050565b6000602082019050818103600083015261329081613254565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006132f36025836126c4565b91506132fe82613297565b604082019050919050565b60006020820190508181036000830152613322816132e6565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006133856023836126c4565b915061339082613329565b604082019050919050565b600060208201905081810360008301526133b481613378565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006134176026836126c4565b9150613422826133bb565b604082019050919050565b600060208201905081810360008301526134468161340a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006134836020836126c4565b915061348e8261344d565b602082019050919050565b600060208201905081810360008301526134b281613476565b9050919050565b60006134c4826127d3565b91506134cf836127d3565b92508282039050818111156134e7576134e6612dc9565b5b92915050565b60006134f882612a97565b915061350383612a97565b9250828201905063ffffffff81111561351f5761351e612dc9565b5b92915050565b7f434f464645453a3a5f7772697465436865636b706f696e743a206e657720636860008201527f65636b706f696e74206578636565647320333220626974730000000000000000602082015250565b60006135816038836126c4565b915061358c82613525565b604082019050919050565b600060208201905081810360008301526135b081613574565b9050919050565b60006040820190506135cc6000830185612958565b6135d96020830184612958565b939250505056fe434f464645453a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a26469706673582212200a4af98504ab51eebbd7328e6e09db77cdd3bf8d367c4cf3029984872346977164736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c8063782d6fe111610104578063a7dec381116100a2578063dd62ed3e11610071578063dd62ed3e1461058d578063e7a324dc146105bd578063f1127ed8146105db578063f2fde38b1461060c576101da565b8063a7dec381146104f5578063a9059cbb14610511578063b4b5ea5714610541578063beabacc814610571576101da565b80638da5cb5b116100de5780638da5cb5b1461046d57806395d89b411461048b578063a1c617f5146104a9578063a457c2d7146104c5576101da565b8063782d6fe1146103f15780637aac697b146104215780637ecebe001461043d576101da565b8063395093511161017c5780636fcfff451161014b5780636fcfff451461036b57806370a082311461039b5780637111a994146103cb578063715018a6146103e7576101da565b806339509351146102d3578063587cde1e146103035780635c19a95c1461033357806366d382031461034f576101da565b806318160ddd116101b857806318160ddd1461024957806320606b701461026757806323b872dd14610285578063313ce567146102b5576101da565b806306fdde03146101df578063095ea7b3146101fd5780630ca12b3d1461022d575b600080fd5b6101e7610628565b6040516101f49190612749565b60405180910390f35b61021760048036038101906102129190612809565b6106ba565b6040516102249190612864565b60405180910390f35b610247600480360381019061024291906128e4565b6106dd565b005b610251610912565b60405161025e9190612967565b60405180910390f35b61026f61091c565b60405161027c919061299b565b60405180910390f35b61029f600480360381019061029a91906129b6565b610940565b6040516102ac9190612864565b60405180910390f35b6102bd61096f565b6040516102ca9190612a25565b60405180910390f35b6102ed60048036038101906102e89190612809565b610978565b6040516102fa9190612864565b60405180910390f35b61031d60048036038101906103189190612a40565b6109af565b60405161032a9190612a7c565b60405180910390f35b61034d60048036038101906103489190612a40565b610a18565b005b61036960048036038101906103649190612a40565b610a25565b005b61038560048036038101906103809190612a40565b610a71565b6040516103929190612ab6565b60405180910390f35b6103b560048036038101906103b09190612a40565b610a94565b6040516103c29190612967565b60405180910390f35b6103e560048036038101906103e09190612b27565b610add565b005b6103ef610bd3565b005b61040b60048036038101906104069190612809565b610be7565b6040516104189190612967565b60405180910390f35b61043b600480360381019061043691906128e4565b610fbc565b005b61045760048036038101906104529190612a40565b611148565b6040516104649190612967565b60405180910390f35b610475611160565b6040516104829190612a7c565b60405180910390f35b610493611189565b6040516104a09190612749565b60405180910390f35b6104c360048036038101906104be91906128e4565b61121b565b005b6104df60048036038101906104da9190612809565b6113a6565b6040516104ec9190612864565b60405180910390f35b61050f600480360381019061050a91906128e4565b61141d565b005b61052b60048036038101906105269190612809565b611651565b6040516105389190612864565b60405180910390f35b61055b60048036038101906105569190612a40565b611674565b6040516105689190612967565b60405180910390f35b61058b600480360381019061058691906129b6565b611753565b005b6105a760048036038101906105a29190612bdb565b6117bd565b6040516105b49190612967565b60405180910390f35b6105c5611844565b6040516105d2919061299b565b60405180910390f35b6105f560048036038101906105f09190612c47565b611868565b604051610603929190612c87565b60405180910390f35b61062660048036038101906106219190612a40565b6118a9565b005b60606005805461063790612cdf565b80601f016020809104026020016040519081016040528092919081815260200182805461066390612cdf565b80156106b05780601f10610685576101008083540402835291602001916106b0565b820191906000526020600020905b81548152906001019060200180831161069357829003601f168201915b5050505050905090565b6000806106c561192c565b90506106d2818585611934565b600191505092915050565b60005b8484905081101561090b578484828181106106fe576106fd612d10565b5b90506020020160208101906107139190612a40565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8226000868660006040516107999493929190612d84565b60405180910390a3600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168585838181106107ed576107ec612d10565b5b90506020020160208101906108029190612a40565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516108479190612967565b60405180910390a3600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516108f09190612967565b60405180910390a3808061090390612df8565b9150506106e0565b5050505050565b6000600354905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b60008061094b61192c565b9050610958858285611afd565b610963858585611b89565b60019150509392505050565b60006012905090565b60008061098361192c565b90506109a481858561099585896117bd565b61099f9190612e40565b611934565b600191505092915050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610a223382611e02565b50565b610a2d611f73565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b6020528060005260406000206000915054906101000a900463ffffffff1681565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60005b86869050811015610bca57848482818110610afe57610afd612d10565b5b9050602002016020810190610b139190612a40565b73ffffffffffffffffffffffffffffffffffffffff16878783818110610b3c57610b3b612d10565b5b9050602002016020810190610b519190612a40565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef858585818110610b9b57610b9a612d10565b5b90506020020135604051610baf9190612967565b60405180910390a38080610bc290612df8565b915050610ae0565b50505050505050565b610bdb611f73565b610be56000611ff1565b565b6000438210610c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2290612ee6565b60405180910390fd5b6000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff1603610c97576000915050610fb6565b82600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600184610ce69190612f06565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff1611610d9357600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600183610d6d9190612f06565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050610fb6565b82600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008063ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff161115610e14576000915050610fb6565b600080600183610e249190612f06565b90505b8163ffffffff168163ffffffff161115610f5057600060028383610e4b9190612f06565b610e559190612f6d565b82610e609190612f06565b90506000600c60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481525050905086816000015163ffffffff1603610f1f57806020015195505050505050610fb6565b86816000015163ffffffff161015610f3957819350610f49565b600182610f469190612f06565b92505b5050610e27565b600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008363ffffffff1663ffffffff1681526020019081526020016000206001015493505050505b92915050565b60005b8484905081101561114157848482818110610fdd57610fdc612d10565b5b9050602002016020810190610ff29190612a40565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8226000868660006040516110789493929190612d84565b60405180910390a3600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168585838181106110cc576110cb612d10565b5b90506020020160208101906110e19190612a40565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516111269190612967565b60405180910390a3808061113990612df8565b915050610fbf565b5050505050565b600d6020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606006805461119890612cdf565b80601f01602080910402602001604051908101604052809291908181526020018280546111c490612cdf565b80156112115780601f106111e657610100808354040283529160200191611211565b820191906000526020600020905b8154815290600101906020018083116111f457829003601f168201915b5050505050905090565b60005b8484905081101561139f5784848281811061123c5761123b612d10565b5b90506020020160208101906112519190612a40565b73ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82285600080876040516112d69493929190612f9e565b60405180910390a38484828181106112f1576112f0612d10565b5b90506020020160208101906113069190612a40565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516113849190612967565b60405180910390a3808061139790612df8565b91505061121e565b5050505050565b6000806113b161192c565b905060006113bf82866117bd565b905083811015611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb90613055565b60405180910390fd5b6114118286868403611934565b60019250505092915050565b60005b8484905081101561164a5784848281811061143e5761143d612d10565b5b90506020020160208101906114539190612a40565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82285600080876040516114d89493929190612f9e565b60405180910390a3600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115819190612967565b60405180910390a384848281811061159c5761159b612d10565b5b90506020020160208101906115b19190612a40565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161162f9190612967565b60405180910390a3808061164290612df8565b915050611420565b5050505050565b60008061165c61192c565b9050611669818585611b89565b600191505092915050565b600080600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff16905060008163ffffffff16116116de57600061174b565b600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060018361172c9190612f06565b63ffffffff1663ffffffff168152602001908152602001600020600101545b915050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516117b09190612967565b60405180910390a3505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b600c602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900463ffffffff16908060010154905082565b6118b1611f73565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611920576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611917906130e7565b60405180910390fd5b61192981611ff1565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036119a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199a90613179565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a099061320b565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611af09190612967565b60405180910390a3505050565b6000611b0984846117bd565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611b835781811015611b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6c90613277565b60405180910390fd5b611b828484848403611934565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bef90613309565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e9061339b565b60405180910390fd5b611c728383836120b5565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611cf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf09061342d565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611de99190612967565b60405180910390a3611dfc8484846120ba565b50505050565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000611e7184610a94565b905082600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611f6d8284836120bf565b50505050565b611f7b61192c565b73ffffffffffffffffffffffffffffffffffffffff16611f99611160565b73ffffffffffffffffffffffffffffffffffffffff1614611fef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe690613499565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156120fb5750600081115b1561235b57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461222d576000600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff161161219e57600061220b565b600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001846121ec9190612f06565b63ffffffff1663ffffffff168152602001908152602001600020600101545b90506000838261221b91906134b9565b905061222986848484612360565b5050505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461235a576000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1690506000808263ffffffff16116122cb576000612338565b600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001846123199190612f06565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9050600083826123489190612e40565b905061235685848484612360565b5050505b5b505050565b6000612384436040518060600160405280603681526020016135e160369139612663565b905060008463ffffffff1611801561242257508063ffffffff16600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001876123ec9190612f06565b63ffffffff1663ffffffff16815260200190815260200160002060000160009054906101000a900463ffffffff1663ffffffff16145b1561249c5781600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001876124769190612f06565b63ffffffff1663ffffffff1681526020019081526020016000206001018190555061260c565b60405180604001604052808263ffffffff16815260200183815250600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff160217905550602082015181600101559050508363ffffffff1660018561255b91906134ed565b63ffffffff16116125a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259890613597565b60405180910390fd5b6001846125ae91906134ed565b600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055505b8473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72484846040516126549291906135b7565b60405180910390a25050505050565b6000640100000000831082906126af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a69190612749565b60405180910390fd5b5082905092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156126f35780820151818401526020810190506126d8565b60008484015250505050565b6000601f19601f8301169050919050565b600061271b826126b9565b61272581856126c4565b93506127358185602086016126d5565b61273e816126ff565b840191505092915050565b600060208201905081810360008301526127638184612710565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127a082612775565b9050919050565b6127b081612795565b81146127bb57600080fd5b50565b6000813590506127cd816127a7565b92915050565b6000819050919050565b6127e6816127d3565b81146127f157600080fd5b50565b600081359050612803816127dd565b92915050565b600080604083850312156128205761281f61276b565b5b600061282e858286016127be565b925050602061283f858286016127f4565b9150509250929050565b60008115159050919050565b61285e81612849565b82525050565b60006020820190506128796000830184612855565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126128a4576128a361287f565b5b8235905067ffffffffffffffff8111156128c1576128c0612884565b5b6020830191508360208202830111156128dd576128dc612889565b5b9250929050565b600080600080606085870312156128fe576128fd61276b565b5b600085013567ffffffffffffffff81111561291c5761291b612770565b5b6129288782880161288e565b9450945050602061293b878288016127f4565b925050604061294c878288016127f4565b91505092959194509250565b612961816127d3565b82525050565b600060208201905061297c6000830184612958565b92915050565b6000819050919050565b61299581612982565b82525050565b60006020820190506129b0600083018461298c565b92915050565b6000806000606084860312156129cf576129ce61276b565b5b60006129dd868287016127be565b93505060206129ee868287016127be565b92505060406129ff868287016127f4565b9150509250925092565b600060ff82169050919050565b612a1f81612a09565b82525050565b6000602082019050612a3a6000830184612a16565b92915050565b600060208284031215612a5657612a5561276b565b5b6000612a64848285016127be565b91505092915050565b612a7681612795565b82525050565b6000602082019050612a916000830184612a6d565b92915050565b600063ffffffff82169050919050565b612ab081612a97565b82525050565b6000602082019050612acb6000830184612aa7565b92915050565b60008083601f840112612ae757612ae661287f565b5b8235905067ffffffffffffffff811115612b0457612b03612884565b5b602083019150836020820283011115612b2057612b1f612889565b5b9250929050565b60008060008060008060608789031215612b4457612b4361276b565b5b600087013567ffffffffffffffff811115612b6257612b61612770565b5b612b6e89828a0161288e565b9650965050602087013567ffffffffffffffff811115612b9157612b90612770565b5b612b9d89828a0161288e565b9450945050604087013567ffffffffffffffff811115612bc057612bbf612770565b5b612bcc89828a01612ad1565b92509250509295509295509295565b60008060408385031215612bf257612bf161276b565b5b6000612c00858286016127be565b9250506020612c11858286016127be565b9150509250929050565b612c2481612a97565b8114612c2f57600080fd5b50565b600081359050612c4181612c1b565b92915050565b60008060408385031215612c5e57612c5d61276b565b5b6000612c6c858286016127be565b9250506020612c7d85828601612c32565b9150509250929050565b6000604082019050612c9c6000830185612aa7565b612ca96020830184612958565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cf757607f821691505b602082108103612d0a57612d09612cb0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000819050919050565b6000612d6e612d69612d6484612d3f565b612d49565b6127d3565b9050919050565b612d7e81612d53565b82525050565b6000608082019050612d996000830187612d75565b612da66020830186612958565b612db36040830185612958565b612dc06060830184612d75565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e03826127d3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612e3557612e34612dc9565b5b600182019050919050565b6000612e4b826127d3565b9150612e56836127d3565b9250828201905080821115612e6e57612e6d612dc9565b5b92915050565b7f424f4e453a3a6765745072696f72566f7465733a206e6f74207965742064657460008201527f65726d696e656400000000000000000000000000000000000000000000000000602082015250565b6000612ed06027836126c4565b9150612edb82612e74565b604082019050919050565b60006020820190508181036000830152612eff81612ec3565b9050919050565b6000612f1182612a97565b9150612f1c83612a97565b9250828203905063ffffffff811115612f3857612f37612dc9565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f7882612a97565b9150612f8383612a97565b925082612f9357612f92612f3e565b5b828204905092915050565b6000608082019050612fb36000830187612958565b612fc06020830186612d75565b612fcd6040830185612d75565b612fda6060830184612958565b95945050505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061303f6025836126c4565b915061304a82612fe3565b604082019050919050565b6000602082019050818103600083015261306e81613032565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006130d16026836126c4565b91506130dc82613075565b604082019050919050565b60006020820190508181036000830152613100816130c4565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006131636024836126c4565b915061316e82613107565b604082019050919050565b6000602082019050818103600083015261319281613156565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006131f56022836126c4565b915061320082613199565b604082019050919050565b60006020820190508181036000830152613224816131e8565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613261601d836126c4565b915061326c8261322b565b602082019050919050565b6000602082019050818103600083015261329081613254565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006132f36025836126c4565b91506132fe82613297565b604082019050919050565b60006020820190508181036000830152613322816132e6565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006133856023836126c4565b915061339082613329565b604082019050919050565b600060208201905081810360008301526133b481613378565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006134176026836126c4565b9150613422826133bb565b604082019050919050565b600060208201905081810360008301526134468161340a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006134836020836126c4565b915061348e8261344d565b602082019050919050565b600060208201905081810360008301526134b281613476565b9050919050565b60006134c4826127d3565b91506134cf836127d3565b92508282039050818111156134e7576134e6612dc9565b5b92915050565b60006134f882612a97565b915061350383612a97565b9250828201905063ffffffff81111561351f5761351e612dc9565b5b92915050565b7f434f464645453a3a5f7772697465436865636b706f696e743a206e657720636860008201527f65636b706f696e74206578636565647320333220626974730000000000000000602082015250565b60006135816038836126c4565b915061358c82613525565b604082019050919050565b600060208201905081810360008301526135b081613574565b9050919050565b60006040820190506135cc6000830185612958565b6135d96020830184612958565b939250505056fe434f464645453a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a26469706673582212200a4af98504ab51eebbd7328e6e09db77cdd3bf8d367c4cf3029984872346977164736f6c63430008110033

Deployed Bytecode Sourcemap

36176:6445:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9111:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13165:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11158:343;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11934:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37141:122;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13946:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10073:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14650:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37913:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38174:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8958:83;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36651:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12105:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11636:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5991:103;;;:::i;:::-;;38709:1212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10858:292;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37344:39;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5350:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9330:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10174:291;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15391:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10473:377;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12438:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40122:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11509:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12694:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36951:117;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36783:70;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;6249:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9111:100;9165:13;9198:5;9191:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9111:100;:::o;13165:201::-;13248:4;13265:13;13281:12;:10;:12::i;:::-;13265:28;;13304:32;13313:5;13320:7;13329:6;13304:8;:32::i;:::-;13354:4;13347:11;;;13165:201;;;;:::o;11158:343::-;11274:9;11269:225;11293:11;;:18;;11289:1;:22;11269:225;;;11366:11;;11378:1;11366:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;11338:43;;11343:4;;;;;;;;;;;11338:43;;;11349:1;11352:3;11357:4;11363:1;11338:43;;;;;;;;;:::i;:::-;;;;;;;;11426:4;;;;;;;;;;;11401:35;;11410:11;;11422:1;11410:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;11401:35;;;11432:3;11401:35;;;;;;:::i;:::-;;;;;;;;11471:5;;;;;;;;;;;11456:26;;11465:4;;;;;;;;;;;11456:26;;;11478:3;11456:26;;;;;;:::i;:::-;;;;;;;;11313:3;;;;;:::i;:::-;;;;11269:225;;;;11158:343;;;;:::o;11934:108::-;11995:7;12022:12;;12015:19;;11934:108;:::o;37141:122::-;37183:80;37141:122;:::o;13946:295::-;14077:4;14094:15;14112:12;:10;:12::i;:::-;14094:30;;14135:38;14151:4;14157:7;14166:6;14135:15;:38::i;:::-;14184:27;14194:4;14200:2;14204:6;14184:9;:27::i;:::-;14229:4;14222:11;;;13946:295;;;;;:::o;10073:93::-;10131:5;10156:2;10149:9;;10073:93;:::o;14650:238::-;14738:4;14755:13;14771:12;:10;:12::i;:::-;14755:28;;14794:64;14803:5;14810:7;14847:10;14819:25;14829:5;14836:7;14819:9;:25::i;:::-;:38;;;;:::i;:::-;14794:8;:64::i;:::-;14876:4;14869:11;;;14650:238;;;;:::o;37913:117::-;37974:7;38001:10;:21;38012:9;38001:21;;;;;;;;;;;;;;;;;;;;;;;;;37994:28;;37913:117;;;:::o;38174:104::-;38238:32;38248:10;38260:9;38238;:32::i;:::-;38174:104;:::o;8958:83::-;5236:13;:11;:13::i;:::-;9027:6:::1;9019:5;;:14;;;;;;;;;;;;;;;;;;8958:83:::0;:::o;36651:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;12105:127::-;12179:7;12206:9;:18;12216:7;12206:18;;;;;;;;;;;;;;;;12199:25;;12105:127;;;:::o;11636:233::-;11757:9;11752:110;11776:5;;:12;;11772:1;:16;11752:110;;;11834:3;;11838:1;11834:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;11815:35;;11824:5;;11830:1;11824:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;11815:35;;;11842:4;;11847:1;11842:7;;;;;;;:::i;:::-;;;;;;;;11815:35;;;;;;:::i;:::-;;;;;;;;11790:3;;;;;:::i;:::-;;;;11752:110;;;;11636:233;;;;;;:::o;5991:103::-;5236:13;:11;:13::i;:::-;6056:30:::1;6083:1;6056:18;:30::i;:::-;5991:103::o:0;38709:1212::-;38790:7;38831:12;38817:11;:26;38809:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;38898:19;38920:14;:23;38935:7;38920:23;;;;;;;;;;;;;;;;;;;;;;;;;38898:45;;38974:1;38958:12;:17;;;38954:58;;38999:1;38992:8;;;;;38954:58;39122:11;39070;:20;39082:7;39070:20;;;;;;;;;;;;;;;:38;39106:1;39091:12;:16;;;;:::i;:::-;39070:38;;;;;;;;;;;;;;;:48;;;;;;;;;;;;:63;;;39066:147;;39157:11;:20;39169:7;39157:20;;;;;;;;;;;;;;;:38;39193:1;39178:12;:16;;;;:::i;:::-;39157:38;;;;;;;;;;;;;;;:44;;;39150:51;;;;;39066:147;39308:11;39272;:20;39284:7;39272:20;;;;;;;;;;;;;;;:23;39293:1;39272:23;;;;;;;;;;;;;:33;;;;;;;;;;;;:47;;;39268:88;;;39343:1;39336:8;;;;;39268:88;39366:12;39393;39423:1;39408:12;:16;;;;:::i;:::-;39393:31;;39435:428;39450:5;39442:13;;:5;:13;;;39435:428;;;39472:13;39514:1;39505:5;39497;:13;;;;:::i;:::-;39496:19;;;;:::i;:::-;39488:5;:27;;;;:::i;:::-;39472:43;;39557:20;39580:11;:20;39592:7;39580:20;;;;;;;;;;;;;;;:28;39601:6;39580:28;;;;;;;;;;;;;;;39557:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39643:11;39627:2;:12;;;:27;;;39623:229;;39682:2;:8;;;39675:15;;;;;;;;;39623:229;39731:11;39716:2;:12;;;:26;;;39712:140;;;39771:6;39763:14;;39712:140;;;39835:1;39826:6;:10;;;;:::i;:::-;39818:18;;39712:140;39457:406;;39435:428;;;39880:11;:20;39892:7;39880:20;;;;;;;;;;;;;;;:27;39901:5;39880:27;;;;;;;;;;;;;;;:33;;;39873:40;;;;;38709:1212;;;;;:::o;10858:292::-;10962:9;10957:186;10981:11;;:18;;10977:1;:22;10957:186;;;11060:11;;11072:1;11060:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;11026:49;;11031:10;;;;;;;;;;;11026:49;;;11043:1;11046:3;11051:4;11057:1;11026:49;;;;;;;;;:::i;:::-;;;;;;;;11120:5;;;;;;;;;;;11095:36;;11104:11;;11116:1;11104:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;11095:36;;;11127:3;11095:36;;;;;;:::i;:::-;;;;;;;;11001:3;;;;;:::i;:::-;;;;10957:186;;;;10858:292;;;;:::o;37344:39::-;;;;;;;;;;;;;;;;;:::o;5350:87::-;5396:7;5423:6;;;;;;;;;;;5416:13;;5350:87;:::o;9330:104::-;9386:13;9419:7;9412:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9330:104;:::o;10174:291::-;10276:9;10271:187;10295:11;;:18;;10291:1;:22;10271:187;;;10374:11;;10386:1;10374:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;10340:49;;10345:10;;;;;;;;;;;10340:49;;;10357:3;10362:1;10365;10368:4;10340:49;;;;;;;;;:::i;:::-;;;;;;;;10425:11;;10437:1;10425:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;10409:37;;10418:5;;;;;;;;;;;10409:37;;;10441:4;10409:37;;;;;;:::i;:::-;;;;;;;;10315:3;;;;;:::i;:::-;;;;10271:187;;;;10174:291;;;;:::o;15391:436::-;15484:4;15501:13;15517:12;:10;:12::i;:::-;15501:28;;15540:24;15567:25;15577:5;15584:7;15567:9;:25::i;:::-;15540:52;;15631:15;15611:16;:35;;15603:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;15724:60;15733:5;15740:7;15768:15;15749:16;:34;15724:8;:60::i;:::-;15815:4;15808:11;;;;15391:436;;;;:::o;10473:377::-;10621:9;10616:227;10640:11;;:18;;10636:1;:22;10616:227;;;10713:11;;10725:1;10713:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;10685:43;;10690:4;;;;;;;;;;;10685:43;;;10696:3;10701:1;10704;10707:4;10685:43;;;;;;;;;:::i;:::-;;;;;;;;10764:4;;;;;;;;;;;10748:27;;10757:5;;;;;;;;;;;10748:27;;;10770:4;10748:27;;;;;;:::i;:::-;;;;;;;;10810:11;;10822:1;10810:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;10795:36;;10804:4;;;;;;;;;;;10795:36;;;10826:4;10795:36;;;;;;:::i;:::-;;;;;;;;10660:3;;;;;:::i;:::-;;;;10616:227;;;;10473:377;;;;:::o;12438:193::-;12517:4;12534:13;12550:12;:10;:12::i;:::-;12534:28;;12573;12583:5;12590:2;12594:6;12573:9;:28::i;:::-;12619:4;12612:11;;;12438:193;;;;:::o;40122:222::-;40187:7;40206:19;40228:14;:23;40243:7;40228:23;;;;;;;;;;;;;;;;;;;;;;;;;40206:45;;40284:1;40269:12;:16;;;:67;;40335:1;40269:67;;;40288:11;:20;40300:7;40288:20;;;;;;;;;;;;;;;:38;40324:1;40309:12;:16;;;;:::i;:::-;40288:38;;;;;;;;;;;;;;;:44;;;40269:67;40262:74;;;40122:222;;;:::o;11509:119::-;11610:3;11594:26;;11603:5;11594:26;;;11615:4;11594:26;;;;;;:::i;:::-;;;;;;;;11509:119;;;:::o;12694:151::-;12783:7;12810:11;:18;12822:5;12810:18;;;;;;;;;;;;;;;:27;12829:7;12810:27;;;;;;;;;;;;;;;;12803:34;;12694:151;;;;:::o;36951:117::-;36997:71;36951:117;:::o;36783:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6249:201::-;5236:13;:11;:13::i;:::-;6358:1:::1;6338:22;;:8;:22;;::::0;6330:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;6414:28;6433:8;6414:18;:28::i;:::-;6249:201:::0;:::o;4059:98::-;4112:7;4139:10;4132:17;;4059:98;:::o;19418:380::-;19571:1;19554:19;;:5;:19;;;19546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19652:1;19633:21;;:7;:21;;;19625:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19736:6;19706:11;:18;19718:5;19706:18;;;;;;;;;;;;;;;:27;19725:7;19706:27;;;;;;;;;;;;;;;:36;;;;19774:7;19758:32;;19767:5;19758:32;;;19783:6;19758:32;;;;;;:::i;:::-;;;;;;;;19418:380;;;:::o;20089:453::-;20224:24;20251:25;20261:5;20268:7;20251:9;:25::i;:::-;20224:52;;20311:17;20291:16;:37;20287:248;;20373:6;20353:16;:26;;20345:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20457:51;20466:5;20473:7;20501:6;20482:16;:25;20457:8;:51::i;:::-;20287:248;20213:329;20089:453;;;:::o;16297:840::-;16444:1;16428:18;;:4;:18;;;16420:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16521:1;16507:16;;:2;:16;;;16499:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;16576:38;16597:4;16603:2;16607:6;16576:20;:38::i;:::-;16627:19;16649:9;:15;16659:4;16649:15;;;;;;;;;;;;;;;;16627:37;;16698:6;16683:11;:21;;16675:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;16815:6;16801:11;:20;16783:9;:15;16793:4;16783:15;;;;;;;;;;;;;;;:38;;;;17018:6;17001:9;:13;17011:2;17001:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;17068:2;17053:26;;17062:4;17053:26;;;17072:6;17053:26;;;;;;:::i;:::-;;;;;;;;17092:37;17112:4;17118:2;17122:6;17092:19;:37::i;:::-;16409:728;16297:840;;;:::o;40352:376::-;40429:23;40455:10;:21;40466:9;40455:21;;;;;;;;;;;;;;;;;;;;;;;;;40429:47;;40487:24;40514:20;40524:9;40514;:20::i;:::-;40487:47;;40570:9;40546:10;:21;40557:9;40546:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;40639:9;40595:54;;40622:15;40595:54;;40611:9;40595:54;;;;;;;;;;;;40660:60;40675:15;40692:9;40703:16;40660:14;:60::i;:::-;40418:310;;40352:376;;:::o;5515:132::-;5590:12;:10;:12::i;:::-;5579:23;;:7;:5;:7::i;:::-;:23;;;5571:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5515:132::o;6610:191::-;6684:16;6703:6;;;;;;;;;;;6684:25;;6729:8;6720:6;;:17;;;;;;;;;;;;;;;;;;6784:8;6753:40;;6774:8;6753:40;;;;;;;;;;;;6673:128;6610:191;:::o;21874:125::-;;;;:::o;21146:124::-;;;;:::o;41508:941::-;41614:6;41604:16;;:6;:16;;;;:30;;;;;41633:1;41624:6;:10;41604:30;41600:842;;;41673:1;41655:20;;:6;:20;;;41651:382;;41744:16;41763:14;:22;41778:6;41763:22;;;;;;;;;;;;;;;;;;;;;;;;;41744:41;;41804:17;41836:1;41824:9;:13;;;:60;;41883:1;41824:60;;;41840:11;:19;41852:6;41840:19;;;;;;;;;;;;;;;:34;41872:1;41860:9;:13;;;;:::i;:::-;41840:34;;;;;;;;;;;;;;;:40;;;41824:60;41804:80;;41903:17;41935:6;41923:9;:18;;;;:::i;:::-;41903:38;;41960:57;41977:6;41985:9;41996;42007;41960:16;:57::i;:::-;41677:356;;;41651:382;42071:1;42053:20;;:6;:20;;;42049:382;;42142:16;42161:14;:22;42176:6;42161:22;;;;;;;;;;;;;;;;;;;;;;;;;42142:41;;42202:17;42234:1;42222:9;:13;;;:60;;42281:1;42222:60;;;42238:11;:19;42250:6;42238:19;;;;;;;;;;;;;;;:34;42270:1;42258:9;:13;;;;:::i;:::-;42238:34;;;;;;;;;;;;;;;:40;;;42222:60;42202:80;;42301:17;42333:6;42321:9;:18;;;;:::i;:::-;42301:38;;42358:57;42375:6;42383:9;42394;42405;42358:16;:57::i;:::-;42075:356;;;42049:382;41600:842;41508:941;;;:::o;40736:764::-;40858:18;40879:78;40886:12;40879:78;;;;;;;;;;;;;;;;;:6;:78::i;:::-;40858:99;;40989:1;40974:12;:16;;;:85;;;;;41048:11;40994:65;;:11;:22;41006:9;40994:22;;;;;;;;;;;;;;;:40;41032:1;41017:12;:16;;;;:::i;:::-;40994:40;;;;;;;;;;;;;;;:50;;;;;;;;;;;;:65;;;40974:85;40970:454;;;41125:8;41076:11;:22;41088:9;41076:22;;;;;;;;;;;;;;;:40;41114:1;41099:12;:16;;;;:::i;:::-;41076:40;;;;;;;;;;;;;;;:46;;:57;;;;40970:454;;;41205:33;;;;;;;;41216:11;41205:33;;;;;;41229:8;41205:33;;;41166:11;:22;41178:9;41166:22;;;;;;;;;;;;;;;:36;41189:12;41166:36;;;;;;;;;;;;;;;:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41280:12;41261:31;;41276:1;41261:12;:16;;;;:::i;:::-;:31;;;41253:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;41411:1;41396:12;:16;;;;:::i;:::-;41368:14;:25;41383:9;41368:25;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;40970:454;41462:9;41441:51;;;41473:8;41483;41441:51;;;;;;;:::i;:::-;;;;;;;;40847:653;40736:764;;;;:::o;42457:161::-;42532:6;42563:5;42559:1;:9;42570:12;42551:32;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;42608:1;42594:16;;42457:161;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:117::-;3555:1;3552;3545:12;3569:117;3678:1;3675;3668:12;3692:117;3801:1;3798;3791:12;3832:568;3905:8;3915:6;3965:3;3958:4;3950:6;3946:17;3942:27;3932:122;;3973:79;;:::i;:::-;3932:122;4086:6;4073:20;4063:30;;4116:18;4108:6;4105:30;4102:117;;;4138:79;;:::i;:::-;4102:117;4252:4;4244:6;4240:17;4228:29;;4306:3;4298:4;4290:6;4286:17;4276:8;4272:32;4269:41;4266:128;;;4313:79;;:::i;:::-;4266:128;3832:568;;;;;:::o;4406:849::-;4510:6;4518;4526;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4737:1;4726:9;4722:17;4709:31;4767:18;4759:6;4756:30;4753:117;;;4789:79;;:::i;:::-;4753:117;4902:80;4974:7;4965:6;4954:9;4950:22;4902:80;:::i;:::-;4884:98;;;;4680:312;5031:2;5057:53;5102:7;5093:6;5082:9;5078:22;5057:53;:::i;:::-;5047:63;;5002:118;5159:2;5185:53;5230:7;5221:6;5210:9;5206:22;5185:53;:::i;:::-;5175:63;;5130:118;4406:849;;;;;;;:::o;5261:118::-;5348:24;5366:5;5348:24;:::i;:::-;5343:3;5336:37;5261:118;;:::o;5385:222::-;5478:4;5516:2;5505:9;5501:18;5493:26;;5529:71;5597:1;5586:9;5582:17;5573:6;5529:71;:::i;:::-;5385:222;;;;:::o;5613:77::-;5650:7;5679:5;5668:16;;5613:77;;;:::o;5696:118::-;5783:24;5801:5;5783:24;:::i;:::-;5778:3;5771:37;5696:118;;:::o;5820:222::-;5913:4;5951:2;5940:9;5936:18;5928:26;;5964:71;6032:1;6021:9;6017:17;6008:6;5964:71;:::i;:::-;5820:222;;;;:::o;6048:619::-;6125:6;6133;6141;6190:2;6178:9;6169:7;6165:23;6161:32;6158:119;;;6196:79;;:::i;:::-;6158:119;6316:1;6341:53;6386:7;6377:6;6366:9;6362:22;6341:53;:::i;:::-;6331:63;;6287:117;6443:2;6469:53;6514:7;6505:6;6494:9;6490:22;6469:53;:::i;:::-;6459:63;;6414:118;6571:2;6597:53;6642:7;6633:6;6622:9;6618:22;6597:53;:::i;:::-;6587:63;;6542:118;6048:619;;;;;:::o;6673:86::-;6708:7;6748:4;6741:5;6737:16;6726:27;;6673:86;;;:::o;6765:112::-;6848:22;6864:5;6848:22;:::i;:::-;6843:3;6836:35;6765:112;;:::o;6883:214::-;6972:4;7010:2;6999:9;6995:18;6987:26;;7023:67;7087:1;7076:9;7072:17;7063:6;7023:67;:::i;:::-;6883:214;;;;:::o;7103:329::-;7162:6;7211:2;7199:9;7190:7;7186:23;7182:32;7179:119;;;7217:79;;:::i;:::-;7179:119;7337:1;7362:53;7407:7;7398:6;7387:9;7383:22;7362:53;:::i;:::-;7352:63;;7308:117;7103:329;;;;:::o;7438:118::-;7525:24;7543:5;7525:24;:::i;:::-;7520:3;7513:37;7438:118;;:::o;7562:222::-;7655:4;7693:2;7682:9;7678:18;7670:26;;7706:71;7774:1;7763:9;7759:17;7750:6;7706:71;:::i;:::-;7562:222;;;;:::o;7790:93::-;7826:7;7866:10;7859:5;7855:22;7844:33;;7790:93;;;:::o;7889:115::-;7974:23;7991:5;7974:23;:::i;:::-;7969:3;7962:36;7889:115;;:::o;8010:218::-;8101:4;8139:2;8128:9;8124:18;8116:26;;8152:69;8218:1;8207:9;8203:17;8194:6;8152:69;:::i;:::-;8010:218;;;;:::o;8251:568::-;8324:8;8334:6;8384:3;8377:4;8369:6;8365:17;8361:27;8351:122;;8392:79;;:::i;:::-;8351:122;8505:6;8492:20;8482:30;;8535:18;8527:6;8524:30;8521:117;;;8557:79;;:::i;:::-;8521:117;8671:4;8663:6;8659:17;8647:29;;8725:3;8717:4;8709:6;8705:17;8695:8;8691:32;8688:41;8685:128;;;8732:79;;:::i;:::-;8685:128;8251:568;;;;;:::o;8825:1309::-;8983:6;8991;8999;9007;9015;9023;9072:2;9060:9;9051:7;9047:23;9043:32;9040:119;;;9078:79;;:::i;:::-;9040:119;9226:1;9215:9;9211:17;9198:31;9256:18;9248:6;9245:30;9242:117;;;9278:79;;:::i;:::-;9242:117;9391:80;9463:7;9454:6;9443:9;9439:22;9391:80;:::i;:::-;9373:98;;;;9169:312;9548:2;9537:9;9533:18;9520:32;9579:18;9571:6;9568:30;9565:117;;;9601:79;;:::i;:::-;9565:117;9714:80;9786:7;9777:6;9766:9;9762:22;9714:80;:::i;:::-;9696:98;;;;9491:313;9871:2;9860:9;9856:18;9843:32;9902:18;9894:6;9891:30;9888:117;;;9924:79;;:::i;:::-;9888:117;10037:80;10109:7;10100:6;10089:9;10085:22;10037:80;:::i;:::-;10019:98;;;;9814:313;8825:1309;;;;;;;;:::o;10140:474::-;10208:6;10216;10265:2;10253:9;10244:7;10240:23;10236:32;10233:119;;;10271:79;;:::i;:::-;10233:119;10391:1;10416:53;10461:7;10452:6;10441:9;10437:22;10416:53;:::i;:::-;10406:63;;10362:117;10518:2;10544:53;10589:7;10580:6;10569:9;10565:22;10544:53;:::i;:::-;10534:63;;10489:118;10140:474;;;;;:::o;10620:120::-;10692:23;10709:5;10692:23;:::i;:::-;10685:5;10682:34;10672:62;;10730:1;10727;10720:12;10672:62;10620:120;:::o;10746:137::-;10791:5;10829:6;10816:20;10807:29;;10845:32;10871:5;10845:32;:::i;:::-;10746:137;;;;:::o;10889:472::-;10956:6;10964;11013:2;11001:9;10992:7;10988:23;10984:32;10981:119;;;11019:79;;:::i;:::-;10981:119;11139:1;11164:53;11209:7;11200:6;11189:9;11185:22;11164:53;:::i;:::-;11154:63;;11110:117;11266:2;11292:52;11336:7;11327:6;11316:9;11312:22;11292:52;:::i;:::-;11282:62;;11237:117;10889:472;;;;;:::o;11367:328::-;11486:4;11524:2;11513:9;11509:18;11501:26;;11537:69;11603:1;11592:9;11588:17;11579:6;11537:69;:::i;:::-;11616:72;11684:2;11673:9;11669:18;11660:6;11616:72;:::i;:::-;11367:328;;;;;:::o;11701:180::-;11749:77;11746:1;11739:88;11846:4;11843:1;11836:15;11870:4;11867:1;11860:15;11887:320;11931:6;11968:1;11962:4;11958:12;11948:22;;12015:1;12009:4;12005:12;12036:18;12026:81;;12092:4;12084:6;12080:17;12070:27;;12026:81;12154:2;12146:6;12143:14;12123:18;12120:38;12117:84;;12173:18;;:::i;:::-;12117:84;11938:269;11887:320;;;:::o;12213:180::-;12261:77;12258:1;12251:88;12358:4;12355:1;12348:15;12382:4;12379:1;12372:15;12399:85;12444:7;12473:5;12462:16;;12399:85;;;:::o;12490:60::-;12518:3;12539:5;12532:12;;12490:60;;;:::o;12556:158::-;12614:9;12647:61;12665:42;12674:32;12700:5;12674:32;:::i;:::-;12665:42;:::i;:::-;12647:61;:::i;:::-;12634:74;;12556:158;;;:::o;12720:147::-;12815:45;12854:5;12815:45;:::i;:::-;12810:3;12803:58;12720:147;;:::o;12873:585::-;13066:4;13104:3;13093:9;13089:19;13081:27;;13118:79;13194:1;13183:9;13179:17;13170:6;13118:79;:::i;:::-;13207:72;13275:2;13264:9;13260:18;13251:6;13207:72;:::i;:::-;13289;13357:2;13346:9;13342:18;13333:6;13289:72;:::i;:::-;13371:80;13447:2;13436:9;13432:18;13423:6;13371:80;:::i;:::-;12873:585;;;;;;;:::o;13464:180::-;13512:77;13509:1;13502:88;13609:4;13606:1;13599:15;13633:4;13630:1;13623:15;13650:233;13689:3;13712:24;13730:5;13712:24;:::i;:::-;13703:33;;13758:66;13751:5;13748:77;13745:103;;13828:18;;:::i;:::-;13745:103;13875:1;13868:5;13864:13;13857:20;;13650:233;;;:::o;13889:191::-;13929:3;13948:20;13966:1;13948:20;:::i;:::-;13943:25;;13982:20;14000:1;13982:20;:::i;:::-;13977:25;;14025:1;14022;14018:9;14011:16;;14046:3;14043:1;14040:10;14037:36;;;14053:18;;:::i;:::-;14037:36;13889:191;;;;:::o;14086:226::-;14226:34;14222:1;14214:6;14210:14;14203:58;14295:9;14290:2;14282:6;14278:15;14271:34;14086:226;:::o;14318:366::-;14460:3;14481:67;14545:2;14540:3;14481:67;:::i;:::-;14474:74;;14557:93;14646:3;14557:93;:::i;:::-;14675:2;14670:3;14666:12;14659:19;;14318:366;;;:::o;14690:419::-;14856:4;14894:2;14883:9;14879:18;14871:26;;14943:9;14937:4;14933:20;14929:1;14918:9;14914:17;14907:47;14971:131;15097:4;14971:131;:::i;:::-;14963:139;;14690:419;;;:::o;15115:200::-;15154:4;15174:19;15191:1;15174:19;:::i;:::-;15169:24;;15207:19;15224:1;15207:19;:::i;:::-;15202:24;;15250:1;15247;15243:9;15235:17;;15274:10;15268:4;15265:20;15262:46;;;15288:18;;:::i;:::-;15262:46;15115:200;;;;:::o;15321:180::-;15369:77;15366:1;15359:88;15466:4;15463:1;15456:15;15490:4;15487:1;15480:15;15507:182;15546:1;15563:19;15580:1;15563:19;:::i;:::-;15558:24;;15596:19;15613:1;15596:19;:::i;:::-;15591:24;;15634:1;15624:35;;15639:18;;:::i;:::-;15624:35;15681:1;15678;15674:9;15669:14;;15507:182;;;;:::o;15695:585::-;15888:4;15926:3;15915:9;15911:19;15903:27;;15940:71;16008:1;15997:9;15993:17;15984:6;15940:71;:::i;:::-;16021:80;16097:2;16086:9;16082:18;16073:6;16021:80;:::i;:::-;16111;16187:2;16176:9;16172:18;16163:6;16111:80;:::i;:::-;16201:72;16269:2;16258:9;16254:18;16245:6;16201:72;:::i;:::-;15695:585;;;;;;;:::o;16286:224::-;16426:34;16422:1;16414:6;16410:14;16403:58;16495:7;16490:2;16482:6;16478:15;16471:32;16286:224;:::o;16516:366::-;16658:3;16679:67;16743:2;16738:3;16679:67;:::i;:::-;16672:74;;16755:93;16844:3;16755:93;:::i;:::-;16873:2;16868:3;16864:12;16857:19;;16516:366;;;:::o;16888:419::-;17054:4;17092:2;17081:9;17077:18;17069:26;;17141:9;17135:4;17131:20;17127:1;17116:9;17112:17;17105:47;17169:131;17295:4;17169:131;:::i;:::-;17161:139;;16888:419;;;:::o;17313:225::-;17453:34;17449:1;17441:6;17437:14;17430:58;17522:8;17517:2;17509:6;17505:15;17498:33;17313:225;:::o;17544:366::-;17686:3;17707:67;17771:2;17766:3;17707:67;:::i;:::-;17700:74;;17783:93;17872:3;17783:93;:::i;:::-;17901:2;17896:3;17892:12;17885:19;;17544:366;;;:::o;17916:419::-;18082:4;18120:2;18109:9;18105:18;18097:26;;18169:9;18163:4;18159:20;18155:1;18144:9;18140:17;18133:47;18197:131;18323:4;18197:131;:::i;:::-;18189:139;;17916:419;;;:::o;18341:223::-;18481:34;18477:1;18469:6;18465:14;18458:58;18550:6;18545:2;18537:6;18533:15;18526:31;18341:223;:::o;18570:366::-;18712:3;18733:67;18797:2;18792:3;18733:67;:::i;:::-;18726:74;;18809:93;18898:3;18809:93;:::i;:::-;18927:2;18922:3;18918:12;18911:19;;18570:366;;;:::o;18942:419::-;19108:4;19146:2;19135:9;19131:18;19123:26;;19195:9;19189:4;19185:20;19181:1;19170:9;19166:17;19159:47;19223:131;19349:4;19223:131;:::i;:::-;19215:139;;18942:419;;;:::o;19367:221::-;19507:34;19503:1;19495:6;19491:14;19484:58;19576:4;19571:2;19563:6;19559:15;19552:29;19367:221;:::o;19594:366::-;19736:3;19757:67;19821:2;19816:3;19757:67;:::i;:::-;19750:74;;19833:93;19922:3;19833:93;:::i;:::-;19951:2;19946:3;19942:12;19935:19;;19594:366;;;:::o;19966:419::-;20132:4;20170:2;20159:9;20155:18;20147:26;;20219:9;20213:4;20209:20;20205:1;20194:9;20190:17;20183:47;20247:131;20373:4;20247:131;:::i;:::-;20239:139;;19966:419;;;:::o;20391:179::-;20531:31;20527:1;20519:6;20515:14;20508:55;20391:179;:::o;20576:366::-;20718:3;20739:67;20803:2;20798:3;20739:67;:::i;:::-;20732:74;;20815:93;20904:3;20815:93;:::i;:::-;20933:2;20928:3;20924:12;20917:19;;20576:366;;;:::o;20948:419::-;21114:4;21152:2;21141:9;21137:18;21129:26;;21201:9;21195:4;21191:20;21187:1;21176:9;21172:17;21165:47;21229:131;21355:4;21229:131;:::i;:::-;21221:139;;20948:419;;;:::o;21373:224::-;21513:34;21509:1;21501:6;21497:14;21490:58;21582:7;21577:2;21569:6;21565:15;21558:32;21373:224;:::o;21603:366::-;21745:3;21766:67;21830:2;21825:3;21766:67;:::i;:::-;21759:74;;21842:93;21931:3;21842:93;:::i;:::-;21960:2;21955:3;21951:12;21944:19;;21603:366;;;:::o;21975:419::-;22141:4;22179:2;22168:9;22164:18;22156:26;;22228:9;22222:4;22218:20;22214:1;22203:9;22199:17;22192:47;22256:131;22382:4;22256:131;:::i;:::-;22248:139;;21975:419;;;:::o;22400:222::-;22540:34;22536:1;22528:6;22524:14;22517:58;22609:5;22604:2;22596:6;22592:15;22585:30;22400:222;:::o;22628:366::-;22770:3;22791:67;22855:2;22850:3;22791:67;:::i;:::-;22784:74;;22867:93;22956:3;22867:93;:::i;:::-;22985:2;22980:3;22976:12;22969:19;;22628:366;;;:::o;23000:419::-;23166:4;23204:2;23193:9;23189:18;23181:26;;23253:9;23247:4;23243:20;23239:1;23228:9;23224:17;23217:47;23281:131;23407:4;23281:131;:::i;:::-;23273:139;;23000:419;;;:::o;23425:225::-;23565:34;23561:1;23553:6;23549:14;23542:58;23634:8;23629:2;23621:6;23617:15;23610:33;23425:225;:::o;23656:366::-;23798:3;23819:67;23883:2;23878:3;23819:67;:::i;:::-;23812:74;;23895:93;23984:3;23895:93;:::i;:::-;24013:2;24008:3;24004:12;23997:19;;23656:366;;;:::o;24028:419::-;24194:4;24232:2;24221:9;24217:18;24209:26;;24281:9;24275:4;24271:20;24267:1;24256:9;24252:17;24245:47;24309:131;24435:4;24309:131;:::i;:::-;24301:139;;24028:419;;;:::o;24453:182::-;24593:34;24589:1;24581:6;24577:14;24570:58;24453:182;:::o;24641:366::-;24783:3;24804:67;24868:2;24863:3;24804:67;:::i;:::-;24797:74;;24880:93;24969:3;24880:93;:::i;:::-;24998:2;24993:3;24989:12;24982:19;;24641:366;;;:::o;25013:419::-;25179:4;25217:2;25206:9;25202:18;25194:26;;25266:9;25260:4;25256:20;25252:1;25241:9;25237:17;25230:47;25294:131;25420:4;25294:131;:::i;:::-;25286:139;;25013:419;;;:::o;25438:194::-;25478:4;25498:20;25516:1;25498:20;:::i;:::-;25493:25;;25532:20;25550:1;25532:20;:::i;:::-;25527:25;;25576:1;25573;25569:9;25561:17;;25600:1;25594:4;25591:11;25588:37;;;25605:18;;:::i;:::-;25588:37;25438:194;;;;:::o;25638:197::-;25677:3;25696:19;25713:1;25696:19;:::i;:::-;25691:24;;25729:19;25746:1;25729:19;:::i;:::-;25724:24;;25771:1;25768;25764:9;25757:16;;25794:10;25789:3;25786:19;25783:45;;;25808:18;;:::i;:::-;25783:45;25638:197;;;;:::o;25841:243::-;25981:34;25977:1;25969:6;25965:14;25958:58;26050:26;26045:2;26037:6;26033:15;26026:51;25841:243;:::o;26090:366::-;26232:3;26253:67;26317:2;26312:3;26253:67;:::i;:::-;26246:74;;26329:93;26418:3;26329:93;:::i;:::-;26447:2;26442:3;26438:12;26431:19;;26090:366;;;:::o;26462:419::-;26628:4;26666:2;26655:9;26651:18;26643:26;;26715:9;26709:4;26705:20;26701:1;26690:9;26686:17;26679:47;26743:131;26869:4;26743:131;:::i;:::-;26735:139;;26462:419;;;:::o;26887:332::-;27008:4;27046:2;27035:9;27031:18;27023:26;;27059:71;27127:1;27116:9;27112:17;27103:6;27059:71;:::i;:::-;27140:72;27208:2;27197:9;27193:18;27184:6;27140:72;:::i;:::-;26887:332;;;;;:::o

Swarm Source

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