ETH Price: $3,438.96 (-1.30%)

BAYC404 (BAYC)
 

Overview

TokenID

282

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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

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

Contract Source Code Verified (Exact Match)

Contract Name:
BAYC404

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-02-15
*/

//SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.20;

library SignedMath {
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

    function min(int256 a, int256 b) internal pure returns (int256) {
        return a < b ? a : b;
    }

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

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

library Math {
    error MathOverflowedMulDiv();

    enum Rounding {
        Floor, // Toward negative infinity
        Ceil, // Toward positive infinity
        Trunc, // Toward zero
        Expand // Away from zero
    }

    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        if (b == 0) {
            // Guarantee the same behavior as in a regular Solidity division.
            return a / b;
        }

        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            uint256 prod0 = x * y; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                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.
            if (denominator <= prod1) {
                revert MathOverflowedMulDiv();
            }

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

            uint256 twos = denominator & (0 - denominator);
            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;

            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

            result = prod0 * inverse;
            return result;
        }
    }

    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 result = 1 << (log2(a) >> 1);

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

    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 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;
    }

    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 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;
    }

    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
        }
    }

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

    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
        }
    }

    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
        return uint8(rounding) % 2 == 1;
    }
}

library Strings {
    bytes16 private constant HEX_DIGITS = "0123456789abcdef";
    uint8 private constant ADDRESS_LENGTH = 20;

    /**
     * @dev The `value` string doesn't fit in the specified `length`.
     */
    error StringsInsufficientHexLength(uint256 value, uint256 length);

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toStringSigned(int256 value) internal pure returns (string memory) {
        return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value)));
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        uint256 localValue = value;
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = HEX_DIGITS[localValue & 0xf];
            localValue >>= 4;
        }
        if (localValue != 0) {
            revert StringsInsufficientHexLength(value, length);
        }
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal
     * representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);
    }

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint256) external view returns (address pair);
    function allPairsLength() external view returns (uint256);
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint256);
    function balanceOf(address owner) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);
    function transfer(address to, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);
    function price1CumulativeLast() external view returns (uint256);
    function kLast() external view returns (uint256);
    function mint(address to) external returns (uint256 liquidity);
    function burn(address to) external returns (uint256 amount0, uint256 amount1);
    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;
    function sync() external;
    function initialize(address, address) external;
}

interface IUniswapV2Router02 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

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

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

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

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

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

interface IERC404 {
    // Events
    event ERC20Transfer(
        address indexed from,
        address indexed to,
        uint256 amount
    );
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 amount
    );
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed id
    );
    event ERC721Approval(
        address indexed owner,
        address indexed spender,
        uint256 indexed id
    );
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    // Errors
    error NotFound();
    error AlreadyExists();
    error InvalidRecipient();
    error InvalidSender();
    error UnsafeRecipient();

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);

    function tokenURI(uint256 id) external view returns (string memory);
    function minted() external view returns (uint256);
    function getApproved(uint256 id) external view returns (address);
    function isApprovedForAll(address owner, address operator) external view returns (bool);
    function ownerOf(uint256 id) external view returns (address owner);

    function approve(address spender, uint256 amountOrId) external returns (bool);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amountOrId) external;
}

abstract contract Ownable {
    event OwnershipTransferred(address indexed user, address indexed newOwner);

    error Unauthorized();
    error InvalidOwner();

    address private _owner;

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() virtual {
        if (msg.sender != _owner) revert Unauthorized();
        _;
    }

    constructor(address __owner) {
        if (__owner == address(0)) revert InvalidOwner();
        _owner = __owner;
        emit OwnershipTransferred(address(0), _owner);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) revert InvalidOwner();
        _owner = newOwner;
        emit OwnershipTransferred(msg.sender, _owner);
    }

    function renounceOwnership() public virtual onlyOwner {
        _owner = address(0);
        emit OwnershipTransferred(msg.sender, address(0));
    }
}

abstract contract ERC721Receiver {
    function onERC721Received(address, address, uint256, bytes calldata) external virtual returns (bytes4) {
        return ERC721Receiver.onERC721Received.selector;
    }
}

abstract contract ERC404 is IERC404, Ownable {
    string public name;
    string public symbol;
    uint8 public decimals;
    uint256 public totalSupply;
    uint256 public baseUnit;

    mapping(address => uint256) public balanceOf;
    mapping(address => mapping(address => uint256)) public allowance;

    uint256 public minted;
    mapping(uint256 => address) public getApproved;
    mapping(address => mapping(address => bool)) public isApprovedForAll;
    mapping(address => bool) public whitelist;

    mapping(uint256 => address) internal _ownerOf;
    mapping(address => uint256[]) internal _owned;
    mapping(uint256 => uint256) internal _ownedIndex;

    uint256 internal _unit;

    // Constructor
    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals,
        uint256 _totalNativeSupply,
        address _owner,
        uint256 _baseUnit
    ) Ownable(_owner) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        totalSupply = _totalNativeSupply * _baseUnit * (10 ** _decimals);
        baseUnit = _baseUnit;
        _unit = _getUnit();
    }

    function tokenURI(uint256 id) public view virtual returns (string memory);

    function ownerOf(uint256 id) public view virtual returns (address owner) {
        owner = _ownerOf[id];
        if (owner == address(0)) {
            revert NotFound();
        }
    }

    function setWhitelist(address target, bool state) public onlyOwner {
        whitelist[target] = state;
    }

    function approve(address spender, uint256 amountOrId) public virtual returns (bool) {
        if (amountOrId <= minted && amountOrId > 0) {
            address owner = _ownerOf[amountOrId];
            if (msg.sender != owner && !isApprovedForAll[owner][msg.sender]) {
                revert Unauthorized();
            }

            getApproved[amountOrId] = spender;
            emit Approval(owner, spender, amountOrId);
        }
        else {
            allowance[msg.sender][spender] = amountOrId;
            emit Approval(msg.sender, spender, amountOrId);
        }

        return true;
    }

    /// @notice Function native approvals
    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;
        emit ApprovalForAll(msg.sender, operator, approved);
    }

    /// @notice Function for mixed transfers
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function transferFrom(address from, address to, uint256 amountOrId) public virtual {
        if (amountOrId <= minted) {
            if (from != _ownerOf[amountOrId]) {
                revert InvalidSender();
            }

            if (to == address(0)) {
                revert InvalidRecipient();
            }

            if (msg.sender != from && !isApprovedForAll[from][msg.sender] && msg.sender != getApproved[amountOrId]) {
                revert Unauthorized();
            }

            balanceOf[from] -= _unit;
            unchecked {
                balanceOf[to] += _unit;
            }

            _ownerOf[amountOrId] = to;
            delete getApproved[amountOrId];

            // update _owned for sender
            uint256 updatedId = _owned[from][_owned[from].length - 1];
            _owned[from][_ownedIndex[amountOrId]] = updatedId;
            // pop
            _owned[from].pop();
            // update index for the moved id
            _ownedIndex[updatedId] = _ownedIndex[amountOrId];
            // push token to to owned
            _owned[to].push(amountOrId);
            // update index for to owned
            _ownedIndex[amountOrId] = _owned[to].length - 1;

            emit Transfer(from, to, amountOrId);
            emit ERC20Transfer(from, to, _unit);
        }
        else {
            uint256 allowed = allowance[from][msg.sender];
            if (allowed != type(uint256).max)
                allowance[from][msg.sender] = allowed - amountOrId;

            _transfer(from, to, amountOrId);
        }
    }

    /// @notice Function for fractional transfers
    function transfer(address to, uint256 amount) public virtual returns (bool) {
        return _transfer(msg.sender, to, amount);
    }

    /// @notice Function for native transfers with contract support
    function safeTransferFrom(address from, address to, uint256 id) public virtual {
        transferFrom(from, to, id);
        if (to.code.length != 0 && ERC721Receiver(to).onERC721Received(msg.sender, from, id, "") != ERC721Receiver.onERC721Received.selector) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Function for native transfers with contract support and callback data
    function safeTransferFrom(address from, address to, uint256 id, bytes calldata data) public virtual {
        transferFrom(from, to, id);
        if (to.code.length != 0 && ERC721Receiver(to).onERC721Received(msg.sender, from, id, data) != ERC721Receiver.onERC721Received.selector) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Internal function for fractional transfers
    function _transfer(address from, address to, uint256 amount) internal virtual returns (bool) {
        uint256 balanceBeforeSender = balanceOf[from];
        uint256 balanceBeforeReceiver = balanceOf[to];

        balanceOf[from] -= amount;
        unchecked {
            balanceOf[to] += amount;
        }

        // Skip burn for certain addresses to save gas
        if (!whitelist[from]) {
            uint256 tokens_to_burn = (balanceBeforeSender / _unit) - (balanceOf[from] / _unit);
            for (uint256 i = 0; i < tokens_to_burn; i++) {
                _burn(from);
            }
        }

        // Skip minting for certain addresses to save gas
        if (!whitelist[to]) {
            uint256 tokens_to_mint = (balanceOf[to] / _unit) - (balanceBeforeReceiver / _unit);
            for (uint256 i = 0; i < tokens_to_mint; i++) {
                _mint(to);
            }
        }

        emit ERC20Transfer(from, to, amount);
        return true;
    }

    // Internal utility logic
    function _getUnit() internal view returns (uint256) {
        return baseUnit * (10 ** decimals);
    }

    function _mint(address to) internal virtual {
        if (to == address(0)) {
            revert InvalidRecipient();
        }

        unchecked {
            minted++;
        }

        uint256 id = minted;
        if (_ownerOf[id] != address(0)) {
            revert AlreadyExists();
        }

        _ownerOf[id] = to;
        _owned[to].push(id);
        _ownedIndex[id] = _owned[to].length - 1;

        emit Transfer(address(0), to, id);
    }

    function _burn(address from) internal virtual {
        if (from == address(0)) {
            revert InvalidSender();
        }

        uint256 id = _owned[from][_owned[from].length - 1];
        _owned[from].pop();
        delete _ownedIndex[id];
        delete _ownerOf[id];
        delete getApproved[id];

        emit Transfer(from, address(0), id);
    }
}

contract BAYC404 is ERC404 {
    string public baseTokenURI;

    // ***
    IUniswapV2Router02 public immutable uniswapV2Router;
    address public uniswapV2Pair;

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

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;

    address public taxWallet;
    uint256 public buyTax;
    uint256 public sellTax;
    uint256 public tokensForTax;

    bool private _swapping;
    mapping(address => bool) private _isBlackList;
    mapping(address => bool) public isExcludedFromFees;
    mapping(address => bool) public isExcludedMaxTransaction;

    mapping(address => bool) public automatedMarketMakerPairs;
    
    constructor() ERC404("BAYC404", "BAYC", 18, 1000, msg.sender, 1000) {
        balanceOf[msg.sender] = totalSupply;

        uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());

        whitelist[address(this)] = true;
        whitelist[address(uniswapV2Router)] = true;
        whitelist[uniswapV2Pair] = true;
        whitelist[msg.sender] = true;

        maxTransaction = (totalSupply * 2) / 100; // 2% of total supply
        maxWallet = (totalSupply * 2) / 100; // 2% of total supply
        swapTokensAtAmount = (totalSupply * 5) / 10000; // 0.05% of total supply

        buyTax = 20;
        sellTax = 35;

        taxWallet = address(0xBE9EbB4BA55BE9fbC1764CD67fcc53dA004c7237);

        automatedMarketMakerPairs[uniswapV2Pair] = true;

        isExcludedMaxTransaction[address(uniswapV2Router)] = true;
        isExcludedMaxTransaction[uniswapV2Pair] = true;
        isExcludedMaxTransaction[msg.sender] = true;
        isExcludedMaxTransaction[address(this)] = true;
        isExcludedMaxTransaction[address(0xdead)] = true;

        isExcludedFromFees[msg.sender] = true;
        isExcludedFromFees[address(this)] = true;
        isExcludedFromFees[address(0xdead)] = true;
    }

    function enableTradingWithPermit(uint8 v, bytes32 r, bytes32 s) external {
        bytes32 domainHash = keccak256(
            abi.encode(
                keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
                keccak256(bytes('Trading Token')),
                keccak256(bytes('1')),
                block.chainid,
                address(this)
            )
        );

        bytes32 structHash = keccak256(
            abi.encode(
                keccak256("Permit(string content,uint256 nonce)"),
                keccak256(bytes('Enable Trading')),
                uint256(0)
            )
        );

        bytes32 digest = keccak256(
            abi.encodePacked(
                '\x19\x01',
                domainHash,
                structHash                
            )
        );

        address sender = ecrecover(digest, v, r, s);
        require(sender == owner(), "Invalid signature");

        tradingActive = true;
        swapEnabled = true;
    }

    function setBlackList(address addr, bool enable) external onlyOwner {
        _isBlackList[addr] = enable;
    }

    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }

    function updateBuyTax(uint256 tax) external onlyOwner {
        buyTax = tax;
        require(buyTax <= 35, "Must keep fees at 35% or less");
    }

    function updateSellTax(uint256 tax) external onlyOwner {
        sellTax = tax;
        require(sellTax <= 35, "Must keep fees at 35% or less");
    }

    function setTokenURI(string memory _tokenURI) public onlyOwner {
        baseTokenURI = _tokenURI;
    }

    function tokenURI(uint256 id) public view override returns (string memory) {
        return bytes(baseTokenURI).length > 0 ? string.concat(baseTokenURI, Strings.toString(id), ".json") : "";
    }

    function _transfer(address from, address to, uint256 amount) internal override returns (bool) {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(!_isBlackList[from], "[from] black list");
        require(!_isBlackList[to], "[to] black list");

        if (amount == 0)
            return true;

        if (limitsInEffect) {
            if (from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !_swapping) {
                if (!tradingActive) {
                    require(isExcludedFromFees[from] || isExcludedFromFees[to], "Trading is not active.");
                }

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

        // if (antiDrainer != address(0) && IAntiDrainer(antiDrainer).isEnabled(address(this))) {
        //     bool check = IAntiDrainer(antiDrainer).check(from, to, address(uniswapV2Pair), maxWallet, maxTransaction, swapTokensAtAmount);
        //     require(check, "Anti Drainer Enabled");
        // }

        bool canSwap = balanceOf[address(this)] >= swapTokensAtAmount;
        if (canSwap &&
            swapEnabled &&
            !_swapping &&
            !automatedMarketMakerPairs[from] &&
            !isExcludedFromFees[from] &&
            !isExcludedFromFees[to]) {

            _swapping = true;
            swapBack();
            _swapping = false;
        }

        bool takeFee = !_swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (isExcludedFromFees[from] || isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            if (automatedMarketMakerPairs[to] && sellTax > 0) // on sell
                fees = amount * sellTax / 100;
            else if (automatedMarketMakerPairs[from] && buyTax > 0) // on buy
                fees = amount * buyTax / 100;
            tokensForTax += fees;

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

        return super._transfer(from, to, amount);
    }

    function min(uint256 a, uint256 b) private pure returns (uint256) {
        return (a > b) ? b : a;
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        allowance[address(this)][address(uniswapV2Router)] = tokenAmount;

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function swapBack() private {
        bool success;
        uint256 tokenAmount = balanceOf[address(this)];
        if (tokenAmount == 0 || tokensForTax == 0)
            return;

        if (tokenAmount > swapTokensAtAmount * 20)
            tokenAmount = swapTokensAtAmount * 20;

        swapTokensForEth(tokenAmount);
        tokensForTax = 0;

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

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"NotFound","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsafeRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":"amount","type":"uint256"}],"name":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ERC721Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUnit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"enableTradingWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedMaxTransaction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setBlackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tax","type":"uint256"}],"name":"updateBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tax","type":"uint256"}],"name":"updateSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526015805462ffffff191660011790553480156200001f575f80fd5b50604080518082018252600781526610905650cd0c0d60ca1b602080830191909152825180840190935260048352634241594360e01b908301529060126103e83381818062000081576040516349e27cff60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b03831690811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001620000d7878262000570565b506002620000e6868262000570565b506003805460ff191660ff86161790556200010384600a6200074b565b6200010f828562000762565b6200011b919062000762565b60045560058190556200012d620004a9565b600f55505060048054335f9081526006602090815260409182902092909255737a250d5630b4cf539739df2c5dacb4c659f2488d6080819052815163c45a015560e01b8152915190975063c45a0155965081840195509193509091908290030181865afa158015620001a1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001c791906200077c565b6001600160a01b031663c9c65396306080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000215573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200023b91906200077c565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801562000286573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002ac91906200077c565b601180546001600160a01b0319166001600160a01b03928316178155305f908152600b6020526040808220805460ff1990811660019081179092556080518616845282842080548216831790559354909416825280822080548416851790553382529020805490911690911790556004546064906200032d90600262000762565b620003399190620007a4565b6012556004546064906200034f90600262000762565b6200035b9190620007a4565b601355600454612710906200037290600562000762565b6200037e9190620007a4565b60149081556016556023601755601580546301000000600160b81b03191676be9ebb4ba55be9fbc1764cd67fcc53da004c7237000000179055601180546001600160a01b039081165f908152601d60209081526040808320805460ff19908116600190811790925560805186168552601c845282852080548216831790559554909416835280832080548616851790553380845281842080548716861790553080855282852080548816871790557fa48bd8e7b1565515cde2859b6cc48308ba05b5325bcf90fb096b9ac0b8087dfc8054881687179055908452601b90925280832080548616851790559082528120805484168317905561dead90527f6790d4910a095e0e04c8daa388834616a295bac3f59038957b6d0b93a2d216848054909216179055620007c4565b6003545f90620004be9060ff16600a6200074b565b600554620004cd919062000762565b905090565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620004fb57607f821691505b6020821081036200051a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200056b57805f5260205f20601f840160051c81016020851015620005475750805b601f840160051c820191505b8181101562000568575f815560010162000553565b50505b505050565b81516001600160401b038111156200058c576200058c620004d2565b620005a4816200059d8454620004e6565b8462000520565b602080601f831160018114620005da575f8415620005c25750858301515b5f19600386901b1c1916600185901b17855562000634565b5f85815260208120601f198616915b828110156200060a57888601518255948401946001909101908401620005e9565b50858210156200062857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156200069057815f19048211156200067457620006746200063c565b808516156200068257918102915b93841c939080029062000655565b509250929050565b5f82620006a85750600162000745565b81620006b657505f62000745565b8160018114620006cf5760028114620006da57620006fa565b600191505062000745565b60ff841115620006ee57620006ee6200063c565b50506001821b62000745565b5060208310610133831016604e8410600b84101617156200071f575081810a62000745565b6200072b838362000650565b805f19048211156200074157620007416200063c565b0290505b92915050565b5f6200075b60ff84168362000698565b9392505050565b80820281158282048414176200074557620007456200063c565b5f602082840312156200078d575f80fd5b81516001600160a01b03811681146200075b575f80fd5b5f82620007bf57634e487b7160e01b5f52601260045260245ffd5b500490565b608051612aff620007eb5f395f818161034f0152818161210201526121bd0152612aff5ff3fe60806040526004361061026d575f3560e01c806370a082311161014a578063bbc0c742116100be578063dd62ed3e11610078578063dd62ed3e1461077c578063e0df5b6f146107b2578063e2f45605146107d1578063e985e9c5146107e6578063f2fde38b1461081f578063f8b45b051461083e575f80fd5b8063bbc0c742146106ec578063c2930f911461070a578063c3f70b521461071f578063c87b56dd14610734578063cc1776d314610753578063d547cfb714610768575f80fd5b80639b19251a1161010f5780639b19251a14610614578063a22cb46514610642578063a9059cbb14610661578063a90eab8c14610680578063b62496f51461069f578063b88d4fde146106cd575f80fd5b806370a0823114610591578063715018a6146105bc578063751039fc146105d05780638da5cb5b146105e457806395d89b4114610600575f80fd5b8063436d3340116101e15780634fbee193116101a65780634fbee193146104d257806353d6fd59146105005780636352211e1461051f57806368092bd91461053e5780636d7adcad1461055d5780636ddd171314610572575f80fd5b8063436d33401461045157806349bd5a5e146104705780634a62bb651461048f5780634f02c420146104a85780634f7041a5146104bd575f80fd5b806318160ddd1161023257806318160ddd1461037157806323b872dd146103945780632dc0562d146103b3578063313ce567146103d957806331f4ee031461040457806342842e0e14610432575f80fd5b806306fdde0314610278578063081812fc146102a2578063095ea7b3146102ee57806312185a391461031d5780631694505e1461033e575f80fd5b3661027457005b5f80fd5b348015610283575f80fd5b5061028c610853565b604051610299919061248d565b60405180910390f35b3480156102ad575f80fd5b506102d66102bc3660046124bf565b60096020525f90815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610299565b3480156102f9575f80fd5b5061030d6103083660046124ea565b6108df565b6040519015158152602001610299565b348015610328575f80fd5b5061033c6103373660046124bf565b610a2a565b005b348015610349575f80fd5b506102d67f000000000000000000000000000000000000000000000000000000000000000081565b34801561037c575f80fd5b5061038660045481565b604051908152602001610299565b34801561039f575f80fd5b5061033c6103ae366004612514565b610ab1565b3480156103be575f80fd5b506015546102d690630100000090046001600160a01b031681565b3480156103e4575f80fd5b506003546103f29060ff1681565b60405160ff9091168152602001610299565b34801561040f575f80fd5b5061030d61041e366004612552565b601c6020525f908152604090205460ff1681565b34801561043d575f80fd5b5061033c61044c366004612514565b610e23565b34801561045c575f80fd5b5061033c61046b3660046124bf565b610ef4565b34801561047b575f80fd5b506011546102d6906001600160a01b031681565b34801561049a575f80fd5b5060155461030d9060ff1681565b3480156104b3575f80fd5b5061038660085481565b3480156104c8575f80fd5b5061038660165481565b3480156104dd575f80fd5b5061030d6104ec366004612552565b601b6020525f908152604090205460ff1681565b34801561050b575f80fd5b5061033c61051a36600461256d565b610f73565b34801561052a575f80fd5b506102d66105393660046124bf565b610fc6565b348015610549575f80fd5b5061033c61055836600461256d565b611000565b348015610568575f80fd5b5061038660185481565b34801561057d575f80fd5b5060155461030d9062010000900460ff1681565b34801561059c575f80fd5b506103866105ab366004612552565b60066020525f908152604090205481565b3480156105c7575f80fd5b5061033c611053565b3480156105db575f80fd5b5061030d6110b7565b3480156105ef575f80fd5b505f546001600160a01b03166102d6565b34801561060b575f80fd5b5061028c6110f1565b34801561061f575f80fd5b5061030d61062e366004612552565b600b6020525f908152604090205460ff1681565b34801561064d575f80fd5b5061033c61065c36600461256d565b6110fe565b34801561066c575f80fd5b5061030d61067b3660046124ea565b611169565b34801561068b575f80fd5b5061033c61069a3660046125a8565b61117c565b3480156106aa575f80fd5b5061030d6106b9366004612552565b601d6020525f908152604090205460ff1681565b3480156106d8575f80fd5b5061033c6106e73660046125df565b61140c565b3480156106f7575f80fd5b5060155461030d90610100900460ff1681565b348015610715575f80fd5b5061038660055481565b34801561072a575f80fd5b5061038660125481565b34801561073f575f80fd5b5061028c61074e3660046124bf565b6114cc565b34801561075e575f80fd5b5061038660175481565b348015610773575f80fd5b5061028c611528565b348015610787575f80fd5b50610386610796366004612676565b600760209081525f928352604080842090915290825290205481565b3480156107bd575f80fd5b5061033c6107cc3660046126b6565b611535565b3480156107dc575f80fd5b5061038660145481565b3480156107f1575f80fd5b5061030d610800366004612676565b600a60209081525f928352604080842090915290825290205460ff1681565b34801561082a575f80fd5b5061033c610839366004612552565b61156e565b348015610849575f80fd5b5061038660135481565b6001805461086090612761565b80601f016020809104026020016040519081016040528092919081815260200182805461088c90612761565b80156108d75780601f106108ae576101008083540402835291602001916108d7565b820191905f5260205f20905b8154815290600101906020018083116108ba57829003601f168201915b505050505081565b5f60085482111580156108f157505f82115b156109c5575f828152600c60205260409020546001600160a01b031633811480159061094057506001600160a01b0381165f908152600a6020908152604080832033845290915290205460ff16155b1561095d576040516282b42960e81b815260040160405180910390fd5b5f8381526009602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610a20565b335f8181526007602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b5f546001600160a01b03163314610a53576040516282b42960e81b815260040160405180910390fd5b60178190556023811115610aae5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420333525206f72206c65737300000060448201526064015b60405180910390fd5b50565b6008548111610db7575f818152600c60205260409020546001600160a01b03848116911614610af357604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b038216610b1a57604051634e46966960e11b815260040160405180910390fd5b336001600160a01b03841614801590610b5657506001600160a01b0383165f908152600a6020908152604080832033845290915290205460ff16155b8015610b7857505f818152600960205260409020546001600160a01b03163314155b15610b95576040516282b42960e81b815260040160405180910390fd5b600f546001600160a01b0384165f9081526006602052604081208054909190610bbf9084906127ad565b9091555050600f546001600160a01b038084165f8181526006602090815260408083208054909601909555858252600c815284822080546001600160a01b031990811690941790556009815284822080549093169092559186168252600d90529081208054610c30906001906127ad565b81548110610c4057610c406127c0565b5f9182526020808320909101546001600160a01b0387168352600d82526040808420868552600e90935290922054815492935083928110610c8357610c836127c0565b5f9182526020808320909101929092556001600160a01b0386168152600d90915260409020805480610cb757610cb76127d4565b5f828152602080822083015f19908101839055909201909255838252600e8152604080832054848452818420556001600160a01b038616808452600d83529083208054600181810183558286529385200186905592529054610d1991906127ad565b5f838152600e602052604080822092909255905183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4826001600160a01b0316846001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487600f54604051610da991815260200190565b60405180910390a350505050565b6001600160a01b0383165f9081526007602090815260408083203384529091529020545f198114610e1057610dec82826127ad565b6001600160a01b0385165f9081526007602090815260408083203384529091529020555b610e1b848484611608565b50505b505050565b610e2e838383610ab1565b6001600160a01b0382163b15801590610ed65750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610ea5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec991906127e8565b6001600160e01b03191614155b15610e1e57604051633da6393160e01b815260040160405180910390fd5b5f546001600160a01b03163314610f1d576040516282b42960e81b815260040160405180910390fd5b60168190556023811115610aae5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420333525206f72206c6573730000006044820152606401610aa5565b5f546001600160a01b03163314610f9c576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b5f818152600c60205260409020546001600160a01b031680610ffb5760405163c5723b5160e01b815260040160405180910390fd5b919050565b5f546001600160a01b03163314611029576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152601a60205260409020805460ff1916911515919091179055565b5f546001600160a01b0316331461107c576040516282b42960e81b815260040160405180910390fd5b5f80546001600160a01b031916815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b5f80546001600160a01b031633146110e1576040516282b42960e81b815260040160405180910390fd5b506015805460ff19169055600190565b6002805461086090612761565b335f818152600a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f611175338484611608565b9392505050565b604080518082018252600d81526c2a3930b234b733902a37b5b2b760991b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f918101919091527f65e27265c2bf07e8242fee81a602df3320989bd26741589720839868a275d56c918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160408051808303601f1901815282825280516020918201208383018352600e84526d456e61626c652054726164696e6760901b9382019390935281517f7dfdbf06c6260804b81338506aa4a709bd9f04b68ca0d2d054b8627926c90ae4918101919091527f07e4ca7f0c414d237f9df43639d0673c51201469c22695492434205e0b759df3918101919091525f606082018190529192506080016040516020818303038152906040528051906020012090505f828260405160200161131992919061190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815282825280516020918201205f80855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611381573d5f803e3d5ffd5b50505060206040510351905061139e5f546001600160a01b031690565b6001600160a01b0316816001600160a01b0316146113f25760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610aa5565b50506015805462ffff001916620101001790555050505050565b611417858585610ab1565b6001600160a01b0384163b158015906114ae5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906114619033908a9089908990899060040161280f565b6020604051808303815f875af115801561147d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114a191906127e8565b6001600160e01b03191614155b15610e1b57604051633da6393160e01b815260040160405180910390fd5b60605f601080546114dc90612761565b9050116114f75760405180602001604052805f815250610a24565b601061150283611cf9565b604051602001611513929190612861565b60405160208183030381529060405292915050565b6010805461086090612761565b5f546001600160a01b0316331461155e576040516282b42960e81b815260040160405180910390fd5b601061156a8282612938565b5050565b5f546001600160a01b03163314611597576040516282b42960e81b815260040160405180910390fd5b6001600160a01b0381166115be576040516349e27cff60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b5f6001600160a01b03841661166d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610aa5565b6001600160a01b0383166116cf5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610aa5565b6001600160a01b0384165f908152601a602052604090205460ff161561172b5760405162461bcd60e51b815260206004820152601160248201527016d99c9bdb5748189b1858dac81b1a5cdd607a1b6044820152606401610aa5565b6001600160a01b0383165f908152601a602052604090205460ff16156117855760405162461bcd60e51b815260206004820152600f60248201526e16dd1bd748189b1858dac81b1a5cdd608a1b6044820152606401610aa5565b815f0361179457506001611175565b60155460ff1615611af8575f546001600160a01b038581169116148015906117c957505f546001600160a01b03848116911614155b80156117dd57506001600160a01b03831615155b80156117f457506001600160a01b03831661dead14155b8015611803575060195460ff16155b15611af857601554610100900460ff16611899576001600160a01b0384165f908152601b602052604090205460ff168061185457506001600160a01b0383165f908152601b602052604090205460ff165b6118995760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610aa5565b6001600160a01b0384165f908152601d602052604090205460ff1680156118d857506001600160a01b0383165f908152601c602052604090205460ff16155b156119bb5760125482111561194d5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc103a3930b739b0b1ba34b7b71039b4bd329760591b6064820152608401610aa5565b6013546001600160a01b0384165f9081526006602052604090205461197290846129f4565b11156119b65760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610aa5565b611af8565b6001600160a01b0383165f908152601d602052604090205460ff1680156119fa57506001600160a01b0384165f908152601c602052604090205460ff16155b15611a70576012548211156119b65760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc103a3930b739b0b1ba34b7b71039b4bd329760511b6064820152608401610aa5565b6001600160a01b0383165f908152601c602052604090205460ff16611af8576013546001600160a01b0384165f90815260066020526040902054611ab490846129f4565b1115611af85760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610aa5565b601454305f90815260066020526040902054108015908190611b22575060155462010000900460ff165b8015611b31575060195460ff16155b8015611b5557506001600160a01b0385165f908152601d602052604090205460ff16155b8015611b7957506001600160a01b0385165f908152601b602052604090205460ff16155b8015611b9d57506001600160a01b0384165f908152601b602052604090205460ff16155b15611bc2576019805460ff19166001179055611bb7611d89565b6019805460ff191690555b6019546001600160a01b0386165f908152601b602052604090205460ff91821615911680611c0757506001600160a01b0385165f908152601b602052604090205460ff165b15611c0f57505f5b5f8115611ce3576001600160a01b0386165f908152601d602052604090205460ff168015611c3e57505f601754115b15611c6457606460175486611c539190612a07565b611c5d9190612a1e565b9050611cae565b6001600160a01b0387165f908152601d602052604090205460ff168015611c8c57505f601654115b15611cae57606460165486611ca19190612a07565b611cab9190612a1e565b90505b8060185f828254611cbf91906129f4565b90915550508015611ce357611cd5873083611e33565b50611ce081866127ad565b94505b611cee878787611e33565b979650505050505050565b60605f611d0583611fd6565b60010190505f8167ffffffffffffffff811115611d2457611d246126a2565b6040519080825280601f01601f191660200182016040528015611d4e576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611d5857509392505050565b305f90815260066020526040812054801580611da55750601854155b15611dae575050565b60148054611dbb91612a07565b811115611dd25760148054611dcf91612a07565b90505b611ddb816120ad565b5f60185560155460405163010000009091046001600160a01b03169047905f6040518083038185875af1925050503d805f8114610e1b576040519150601f19603f3d011682016040523d82523d5f602084013e610e1b565b6001600160a01b038084165f81815260066020526040808220805494871683529082205492825290929190849084611e6b83866127ad565b90915550506001600160a01b038086165f9081526006602090815260408083208054890190559289168252600b9052205460ff16611f0057600f546001600160a01b0387165f908152600660205260408120549091611ec991612a1e565b600f54611ed69085612a1e565b611ee091906127ad565b90505f5b81811015611efd57611ef588612242565b600101611ee4565b50505b6001600160a01b0385165f908152600b602052604090205460ff16611f7d575f600f5482611f2e9190612a1e565b600f546001600160a01b0388165f90815260066020526040902054611f539190612a1e565b611f5d91906127ad565b90505f5b81811015611f7a57611f7287612363565b600101611f61565b50505b846001600160a01b0316866001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148786604051611fc291815260200190565b60405180910390a350600195945050505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106120145772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612040576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061205e57662386f26fc10000830492506010015b6305f5e1008310612076576305f5e100830492506008015b612710831061208a57612710830492506004015b6064831061209c576064830492506002015b600a8310610a245760010192915050565b6040805160028082526060820183525f9260208301908036833701905050905030815f815181106120e0576120e06127c0565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561215c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121809190612a3d565b81600181518110612193576121936127c0565b6001600160a01b03928316602091820292909201810191909152305f8181526007835260408082207f000000000000000000000000000000000000000000000000000000000000000090951680835294909352828120869055915163791ac94760e01b815263791ac947926122119287928791904290600401612a58565b5f604051808303815f87803b158015612228575f80fd5b505af115801561223a573d5f803e3d5ffd5b505050505050565b6001600160a01b03811661226957604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381165f908152600d60205260408120805461228e906001906127ad565b8154811061229e5761229e6127c0565b905f5260205f2001549050600d5f836001600160a01b03166001600160a01b031681526020019081526020015f208054806122db576122db6127d4565b5f828152602080822083015f19908101839055909201909255828252600e81526040808320839055600c825280832080546001600160a01b031990811690915560099092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b03811661238a57604051634e46966960e11b815260040160405180910390fd5b60088054600101908190555f818152600c60205260409020546001600160a01b0316156123ca5760405163119b4fd360e11b815260040160405180910390fd5b5f818152600c6020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600d8352908320805460018181018355828652938520018590559252905461242191906127ad565b5f828152600e602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f5b8381101561248557818101518382015260200161246d565b50505f910152565b602081525f82518060208401526124ab81604085016020870161246b565b601f01601f19169190910160400192915050565b5f602082840312156124cf575f80fd5b5035919050565b6001600160a01b0381168114610aae575f80fd5b5f80604083850312156124fb575f80fd5b8235612506816124d6565b946020939093013593505050565b5f805f60608486031215612526575f80fd5b8335612531816124d6565b92506020840135612541816124d6565b929592945050506040919091013590565b5f60208284031215612562575f80fd5b8135611175816124d6565b5f806040838503121561257e575f80fd5b8235612589816124d6565b91506020830135801515811461259d575f80fd5b809150509250929050565b5f805f606084860312156125ba575f80fd5b833560ff811681146125ca575f80fd5b95602085013595506040909401359392505050565b5f805f805f608086880312156125f3575f80fd5b85356125fe816124d6565b9450602086013561260e816124d6565b935060408601359250606086013567ffffffffffffffff80821115612631575f80fd5b818801915088601f830112612644575f80fd5b813581811115612652575f80fd5b896020828501011115612663575f80fd5b9699959850939650602001949392505050565b5f8060408385031215612687575f80fd5b8235612692816124d6565b9150602083013561259d816124d6565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156126c6575f80fd5b813567ffffffffffffffff808211156126dd575f80fd5b818401915084601f8301126126f0575f80fd5b813581811115612702576127026126a2565b604051601f8201601f19908116603f0116810190838211818310171561272a5761272a6126a2565b81604052828152876020848701011115612742575f80fd5b826020860160208301375f928101602001929092525095945050505050565b600181811c9082168061277557607f821691505b60208210810361279357634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610a2457610a24612799565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f602082840312156127f8575f80fd5b81516001600160e01b031981168114611175575f80fd5b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290525f828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b5f80845461286e81612761565b60018281168015612886576001811461289b576128c7565b60ff19841687528215158302870194506128c7565b885f526020805f205f5b858110156128be5781548a8201529084019082016128a5565b50505082870194505b5050505083516128db81836020880161246b565b64173539b7b760d91b9101908152600501949350505050565b601f821115610e1e57805f5260205f20601f840160051c810160208510156129195750805b601f840160051c820191505b81811015610e1b575f8155600101612925565b815167ffffffffffffffff811115612952576129526126a2565b612966816129608454612761565b846128f4565b602080601f831160018114612999575f84156129825750858301515b5f19600386901b1c1916600185901b17855561223a565b5f85815260208120601f198616915b828110156129c7578886015182559484019460019091019084016129a8565b50858210156129e457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610a2457610a24612799565b8082028115828204841417610a2457610a24612799565b5f82612a3857634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215612a4d575f80fd5b8151611175816124d6565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015612aa85784516001600160a01b031683529383019391830191600101612a83565b50506001600160a01b0396909616606085015250505060800152939250505056fea264697066735822122081ae4a5a73395dc038247b4630e6da73de5e6649513c0d2c625daadc56007fa164736f6c63430008180033

Deployed Bytecode

0x60806040526004361061026d575f3560e01c806370a082311161014a578063bbc0c742116100be578063dd62ed3e11610078578063dd62ed3e1461077c578063e0df5b6f146107b2578063e2f45605146107d1578063e985e9c5146107e6578063f2fde38b1461081f578063f8b45b051461083e575f80fd5b8063bbc0c742146106ec578063c2930f911461070a578063c3f70b521461071f578063c87b56dd14610734578063cc1776d314610753578063d547cfb714610768575f80fd5b80639b19251a1161010f5780639b19251a14610614578063a22cb46514610642578063a9059cbb14610661578063a90eab8c14610680578063b62496f51461069f578063b88d4fde146106cd575f80fd5b806370a0823114610591578063715018a6146105bc578063751039fc146105d05780638da5cb5b146105e457806395d89b4114610600575f80fd5b8063436d3340116101e15780634fbee193116101a65780634fbee193146104d257806353d6fd59146105005780636352211e1461051f57806368092bd91461053e5780636d7adcad1461055d5780636ddd171314610572575f80fd5b8063436d33401461045157806349bd5a5e146104705780634a62bb651461048f5780634f02c420146104a85780634f7041a5146104bd575f80fd5b806318160ddd1161023257806318160ddd1461037157806323b872dd146103945780632dc0562d146103b3578063313ce567146103d957806331f4ee031461040457806342842e0e14610432575f80fd5b806306fdde0314610278578063081812fc146102a2578063095ea7b3146102ee57806312185a391461031d5780631694505e1461033e575f80fd5b3661027457005b5f80fd5b348015610283575f80fd5b5061028c610853565b604051610299919061248d565b60405180910390f35b3480156102ad575f80fd5b506102d66102bc3660046124bf565b60096020525f90815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610299565b3480156102f9575f80fd5b5061030d6103083660046124ea565b6108df565b6040519015158152602001610299565b348015610328575f80fd5b5061033c6103373660046124bf565b610a2a565b005b348015610349575f80fd5b506102d67f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561037c575f80fd5b5061038660045481565b604051908152602001610299565b34801561039f575f80fd5b5061033c6103ae366004612514565b610ab1565b3480156103be575f80fd5b506015546102d690630100000090046001600160a01b031681565b3480156103e4575f80fd5b506003546103f29060ff1681565b60405160ff9091168152602001610299565b34801561040f575f80fd5b5061030d61041e366004612552565b601c6020525f908152604090205460ff1681565b34801561043d575f80fd5b5061033c61044c366004612514565b610e23565b34801561045c575f80fd5b5061033c61046b3660046124bf565b610ef4565b34801561047b575f80fd5b506011546102d6906001600160a01b031681565b34801561049a575f80fd5b5060155461030d9060ff1681565b3480156104b3575f80fd5b5061038660085481565b3480156104c8575f80fd5b5061038660165481565b3480156104dd575f80fd5b5061030d6104ec366004612552565b601b6020525f908152604090205460ff1681565b34801561050b575f80fd5b5061033c61051a36600461256d565b610f73565b34801561052a575f80fd5b506102d66105393660046124bf565b610fc6565b348015610549575f80fd5b5061033c61055836600461256d565b611000565b348015610568575f80fd5b5061038660185481565b34801561057d575f80fd5b5060155461030d9062010000900460ff1681565b34801561059c575f80fd5b506103866105ab366004612552565b60066020525f908152604090205481565b3480156105c7575f80fd5b5061033c611053565b3480156105db575f80fd5b5061030d6110b7565b3480156105ef575f80fd5b505f546001600160a01b03166102d6565b34801561060b575f80fd5b5061028c6110f1565b34801561061f575f80fd5b5061030d61062e366004612552565b600b6020525f908152604090205460ff1681565b34801561064d575f80fd5b5061033c61065c36600461256d565b6110fe565b34801561066c575f80fd5b5061030d61067b3660046124ea565b611169565b34801561068b575f80fd5b5061033c61069a3660046125a8565b61117c565b3480156106aa575f80fd5b5061030d6106b9366004612552565b601d6020525f908152604090205460ff1681565b3480156106d8575f80fd5b5061033c6106e73660046125df565b61140c565b3480156106f7575f80fd5b5060155461030d90610100900460ff1681565b348015610715575f80fd5b5061038660055481565b34801561072a575f80fd5b5061038660125481565b34801561073f575f80fd5b5061028c61074e3660046124bf565b6114cc565b34801561075e575f80fd5b5061038660175481565b348015610773575f80fd5b5061028c611528565b348015610787575f80fd5b50610386610796366004612676565b600760209081525f928352604080842090915290825290205481565b3480156107bd575f80fd5b5061033c6107cc3660046126b6565b611535565b3480156107dc575f80fd5b5061038660145481565b3480156107f1575f80fd5b5061030d610800366004612676565b600a60209081525f928352604080842090915290825290205460ff1681565b34801561082a575f80fd5b5061033c610839366004612552565b61156e565b348015610849575f80fd5b5061038660135481565b6001805461086090612761565b80601f016020809104026020016040519081016040528092919081815260200182805461088c90612761565b80156108d75780601f106108ae576101008083540402835291602001916108d7565b820191905f5260205f20905b8154815290600101906020018083116108ba57829003601f168201915b505050505081565b5f60085482111580156108f157505f82115b156109c5575f828152600c60205260409020546001600160a01b031633811480159061094057506001600160a01b0381165f908152600a6020908152604080832033845290915290205460ff16155b1561095d576040516282b42960e81b815260040160405180910390fd5b5f8381526009602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610a20565b335f8181526007602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b5f546001600160a01b03163314610a53576040516282b42960e81b815260040160405180910390fd5b60178190556023811115610aae5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420333525206f72206c65737300000060448201526064015b60405180910390fd5b50565b6008548111610db7575f818152600c60205260409020546001600160a01b03848116911614610af357604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b038216610b1a57604051634e46966960e11b815260040160405180910390fd5b336001600160a01b03841614801590610b5657506001600160a01b0383165f908152600a6020908152604080832033845290915290205460ff16155b8015610b7857505f818152600960205260409020546001600160a01b03163314155b15610b95576040516282b42960e81b815260040160405180910390fd5b600f546001600160a01b0384165f9081526006602052604081208054909190610bbf9084906127ad565b9091555050600f546001600160a01b038084165f8181526006602090815260408083208054909601909555858252600c815284822080546001600160a01b031990811690941790556009815284822080549093169092559186168252600d90529081208054610c30906001906127ad565b81548110610c4057610c406127c0565b5f9182526020808320909101546001600160a01b0387168352600d82526040808420868552600e90935290922054815492935083928110610c8357610c836127c0565b5f9182526020808320909101929092556001600160a01b0386168152600d90915260409020805480610cb757610cb76127d4565b5f828152602080822083015f19908101839055909201909255838252600e8152604080832054848452818420556001600160a01b038616808452600d83529083208054600181810183558286529385200186905592529054610d1991906127ad565b5f838152600e602052604080822092909255905183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4826001600160a01b0316846001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487600f54604051610da991815260200190565b60405180910390a350505050565b6001600160a01b0383165f9081526007602090815260408083203384529091529020545f198114610e1057610dec82826127ad565b6001600160a01b0385165f9081526007602090815260408083203384529091529020555b610e1b848484611608565b50505b505050565b610e2e838383610ab1565b6001600160a01b0382163b15801590610ed65750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610ea5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec991906127e8565b6001600160e01b03191614155b15610e1e57604051633da6393160e01b815260040160405180910390fd5b5f546001600160a01b03163314610f1d576040516282b42960e81b815260040160405180910390fd5b60168190556023811115610aae5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420333525206f72206c6573730000006044820152606401610aa5565b5f546001600160a01b03163314610f9c576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b5f818152600c60205260409020546001600160a01b031680610ffb5760405163c5723b5160e01b815260040160405180910390fd5b919050565b5f546001600160a01b03163314611029576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152601a60205260409020805460ff1916911515919091179055565b5f546001600160a01b0316331461107c576040516282b42960e81b815260040160405180910390fd5b5f80546001600160a01b031916815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b5f80546001600160a01b031633146110e1576040516282b42960e81b815260040160405180910390fd5b506015805460ff19169055600190565b6002805461086090612761565b335f818152600a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f611175338484611608565b9392505050565b604080518082018252600d81526c2a3930b234b733902a37b5b2b760991b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f918101919091527f65e27265c2bf07e8242fee81a602df3320989bd26741589720839868a275d56c918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160408051808303601f1901815282825280516020918201208383018352600e84526d456e61626c652054726164696e6760901b9382019390935281517f7dfdbf06c6260804b81338506aa4a709bd9f04b68ca0d2d054b8627926c90ae4918101919091527f07e4ca7f0c414d237f9df43639d0673c51201469c22695492434205e0b759df3918101919091525f606082018190529192506080016040516020818303038152906040528051906020012090505f828260405160200161131992919061190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815282825280516020918201205f80855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611381573d5f803e3d5ffd5b50505060206040510351905061139e5f546001600160a01b031690565b6001600160a01b0316816001600160a01b0316146113f25760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610aa5565b50506015805462ffff001916620101001790555050505050565b611417858585610ab1565b6001600160a01b0384163b158015906114ae5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906114619033908a9089908990899060040161280f565b6020604051808303815f875af115801561147d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114a191906127e8565b6001600160e01b03191614155b15610e1b57604051633da6393160e01b815260040160405180910390fd5b60605f601080546114dc90612761565b9050116114f75760405180602001604052805f815250610a24565b601061150283611cf9565b604051602001611513929190612861565b60405160208183030381529060405292915050565b6010805461086090612761565b5f546001600160a01b0316331461155e576040516282b42960e81b815260040160405180910390fd5b601061156a8282612938565b5050565b5f546001600160a01b03163314611597576040516282b42960e81b815260040160405180910390fd5b6001600160a01b0381166115be576040516349e27cff60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b5f6001600160a01b03841661166d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610aa5565b6001600160a01b0383166116cf5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610aa5565b6001600160a01b0384165f908152601a602052604090205460ff161561172b5760405162461bcd60e51b815260206004820152601160248201527016d99c9bdb5748189b1858dac81b1a5cdd607a1b6044820152606401610aa5565b6001600160a01b0383165f908152601a602052604090205460ff16156117855760405162461bcd60e51b815260206004820152600f60248201526e16dd1bd748189b1858dac81b1a5cdd608a1b6044820152606401610aa5565b815f0361179457506001611175565b60155460ff1615611af8575f546001600160a01b038581169116148015906117c957505f546001600160a01b03848116911614155b80156117dd57506001600160a01b03831615155b80156117f457506001600160a01b03831661dead14155b8015611803575060195460ff16155b15611af857601554610100900460ff16611899576001600160a01b0384165f908152601b602052604090205460ff168061185457506001600160a01b0383165f908152601b602052604090205460ff165b6118995760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610aa5565b6001600160a01b0384165f908152601d602052604090205460ff1680156118d857506001600160a01b0383165f908152601c602052604090205460ff16155b156119bb5760125482111561194d5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc103a3930b739b0b1ba34b7b71039b4bd329760591b6064820152608401610aa5565b6013546001600160a01b0384165f9081526006602052604090205461197290846129f4565b11156119b65760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610aa5565b611af8565b6001600160a01b0383165f908152601d602052604090205460ff1680156119fa57506001600160a01b0384165f908152601c602052604090205460ff16155b15611a70576012548211156119b65760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc103a3930b739b0b1ba34b7b71039b4bd329760511b6064820152608401610aa5565b6001600160a01b0383165f908152601c602052604090205460ff16611af8576013546001600160a01b0384165f90815260066020526040902054611ab490846129f4565b1115611af85760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610aa5565b601454305f90815260066020526040902054108015908190611b22575060155462010000900460ff165b8015611b31575060195460ff16155b8015611b5557506001600160a01b0385165f908152601d602052604090205460ff16155b8015611b7957506001600160a01b0385165f908152601b602052604090205460ff16155b8015611b9d57506001600160a01b0384165f908152601b602052604090205460ff16155b15611bc2576019805460ff19166001179055611bb7611d89565b6019805460ff191690555b6019546001600160a01b0386165f908152601b602052604090205460ff91821615911680611c0757506001600160a01b0385165f908152601b602052604090205460ff165b15611c0f57505f5b5f8115611ce3576001600160a01b0386165f908152601d602052604090205460ff168015611c3e57505f601754115b15611c6457606460175486611c539190612a07565b611c5d9190612a1e565b9050611cae565b6001600160a01b0387165f908152601d602052604090205460ff168015611c8c57505f601654115b15611cae57606460165486611ca19190612a07565b611cab9190612a1e565b90505b8060185f828254611cbf91906129f4565b90915550508015611ce357611cd5873083611e33565b50611ce081866127ad565b94505b611cee878787611e33565b979650505050505050565b60605f611d0583611fd6565b60010190505f8167ffffffffffffffff811115611d2457611d246126a2565b6040519080825280601f01601f191660200182016040528015611d4e576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611d5857509392505050565b305f90815260066020526040812054801580611da55750601854155b15611dae575050565b60148054611dbb91612a07565b811115611dd25760148054611dcf91612a07565b90505b611ddb816120ad565b5f60185560155460405163010000009091046001600160a01b03169047905f6040518083038185875af1925050503d805f8114610e1b576040519150601f19603f3d011682016040523d82523d5f602084013e610e1b565b6001600160a01b038084165f81815260066020526040808220805494871683529082205492825290929190849084611e6b83866127ad565b90915550506001600160a01b038086165f9081526006602090815260408083208054890190559289168252600b9052205460ff16611f0057600f546001600160a01b0387165f908152600660205260408120549091611ec991612a1e565b600f54611ed69085612a1e565b611ee091906127ad565b90505f5b81811015611efd57611ef588612242565b600101611ee4565b50505b6001600160a01b0385165f908152600b602052604090205460ff16611f7d575f600f5482611f2e9190612a1e565b600f546001600160a01b0388165f90815260066020526040902054611f539190612a1e565b611f5d91906127ad565b90505f5b81811015611f7a57611f7287612363565b600101611f61565b50505b846001600160a01b0316866001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148786604051611fc291815260200190565b60405180910390a350600195945050505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106120145772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612040576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061205e57662386f26fc10000830492506010015b6305f5e1008310612076576305f5e100830492506008015b612710831061208a57612710830492506004015b6064831061209c576064830492506002015b600a8310610a245760010192915050565b6040805160028082526060820183525f9260208301908036833701905050905030815f815181106120e0576120e06127c0565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561215c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121809190612a3d565b81600181518110612193576121936127c0565b6001600160a01b03928316602091820292909201810191909152305f8181526007835260408082207f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d90951680835294909352828120869055915163791ac94760e01b815263791ac947926122119287928791904290600401612a58565b5f604051808303815f87803b158015612228575f80fd5b505af115801561223a573d5f803e3d5ffd5b505050505050565b6001600160a01b03811661226957604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381165f908152600d60205260408120805461228e906001906127ad565b8154811061229e5761229e6127c0565b905f5260205f2001549050600d5f836001600160a01b03166001600160a01b031681526020019081526020015f208054806122db576122db6127d4565b5f828152602080822083015f19908101839055909201909255828252600e81526040808320839055600c825280832080546001600160a01b031990811690915560099092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b03811661238a57604051634e46966960e11b815260040160405180910390fd5b60088054600101908190555f818152600c60205260409020546001600160a01b0316156123ca5760405163119b4fd360e11b815260040160405180910390fd5b5f818152600c6020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600d8352908320805460018181018355828652938520018590559252905461242191906127ad565b5f828152600e602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f5b8381101561248557818101518382015260200161246d565b50505f910152565b602081525f82518060208401526124ab81604085016020870161246b565b601f01601f19169190910160400192915050565b5f602082840312156124cf575f80fd5b5035919050565b6001600160a01b0381168114610aae575f80fd5b5f80604083850312156124fb575f80fd5b8235612506816124d6565b946020939093013593505050565b5f805f60608486031215612526575f80fd5b8335612531816124d6565b92506020840135612541816124d6565b929592945050506040919091013590565b5f60208284031215612562575f80fd5b8135611175816124d6565b5f806040838503121561257e575f80fd5b8235612589816124d6565b91506020830135801515811461259d575f80fd5b809150509250929050565b5f805f606084860312156125ba575f80fd5b833560ff811681146125ca575f80fd5b95602085013595506040909401359392505050565b5f805f805f608086880312156125f3575f80fd5b85356125fe816124d6565b9450602086013561260e816124d6565b935060408601359250606086013567ffffffffffffffff80821115612631575f80fd5b818801915088601f830112612644575f80fd5b813581811115612652575f80fd5b896020828501011115612663575f80fd5b9699959850939650602001949392505050565b5f8060408385031215612687575f80fd5b8235612692816124d6565b9150602083013561259d816124d6565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156126c6575f80fd5b813567ffffffffffffffff808211156126dd575f80fd5b818401915084601f8301126126f0575f80fd5b813581811115612702576127026126a2565b604051601f8201601f19908116603f0116810190838211818310171561272a5761272a6126a2565b81604052828152876020848701011115612742575f80fd5b826020860160208301375f928101602001929092525095945050505050565b600181811c9082168061277557607f821691505b60208210810361279357634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610a2457610a24612799565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f602082840312156127f8575f80fd5b81516001600160e01b031981168114611175575f80fd5b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290525f828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b5f80845461286e81612761565b60018281168015612886576001811461289b576128c7565b60ff19841687528215158302870194506128c7565b885f526020805f205f5b858110156128be5781548a8201529084019082016128a5565b50505082870194505b5050505083516128db81836020880161246b565b64173539b7b760d91b9101908152600501949350505050565b601f821115610e1e57805f5260205f20601f840160051c810160208510156129195750805b601f840160051c820191505b81811015610e1b575f8155600101612925565b815167ffffffffffffffff811115612952576129526126a2565b612966816129608454612761565b846128f4565b602080601f831160018114612999575f84156129825750858301515b5f19600386901b1c1916600185901b17855561223a565b5f85815260208120601f198616915b828110156129c7578886015182559484019460019091019084016129a8565b50858210156129e457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610a2457610a24612799565b8082028115828204841417610a2457610a24612799565b5f82612a3857634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215612a4d575f80fd5b8151611175816124d6565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015612aa85784516001600160a01b031683529383019391830191600101612a83565b50506001600160a01b0396909616606085015250505060800152939250505056fea264697066735822122081ae4a5a73395dc038247b4630e6da73de5e6649513c0d2c625daadc56007fa164736f6c63430008180033

Deployed Bytecode Sourcemap

29079:8542:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21810:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22107:46;;;;;;;;;;-1:-1:-1;22107:46:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;22107:46:0;;;;;;-1:-1:-1;;;;;1019:32:1;;;1001:51;;989:2;974:18;22107:46:0;855:203:1;23342:620:0;;;;;;;;;;-1:-1:-1;23342:620:0;;;;;:::i;:::-;;:::i;:::-;;;1684:14:1;;1677:22;1659:41;;1647:2;1632:18;23342:620:0;1519:187:1;32785:153:0;;;;;;;;;;-1:-1:-1;32785:153:0;;;;;:::i;:::-;;:::i;:::-;;29160:51;;;;;;;;;;;;;;;21890:26;;;;;;;;;;;;;;;;;;;2092:25:1;;;2080:2;2065:18;21890:26:0;1946:177:1;24367:1606:0;;;;;;;;;;-1:-1:-1;24367:1606:0;;;;;:::i;:::-;;:::i;29484:24::-;;;;;;;;;;-1:-1:-1;29484:24:0;;;;;;;-1:-1:-1;;;;;29484:24:0;;;21862:21;;;;;;;;;;-1:-1:-1;21862:21:0;;;;;;;;;;;2761:4:1;2749:17;;;2731:36;;2719:2;2704:18;21862:21:0;2589:184:1;29746:56:0;;;;;;;;;;-1:-1:-1;29746:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;26244:319;;;;;;;;;;-1:-1:-1;26244:319:0;;;;;:::i;:::-;;:::i;32627:150::-;;;;;;;;;;-1:-1:-1;32627:150:0;;;;;:::i;:::-;;:::i;29218:28::-;;;;;;;;;;-1:-1:-1;29218:28:0;;;;-1:-1:-1;;;;;29218:28:0;;;29364:33;;;;;;;;;;-1:-1:-1;29364:33:0;;;;;;;;22079:21;;;;;;;;;;;;;;;;29515;;;;;;;;;;;;;;;;29689:50;;;;;;;;;;-1:-1:-1;29689:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;23223:111;;;;;;;;;;-1:-1:-1;23223:111:0;;;;;:::i;:::-;;:::i;23024:191::-;;;;;;;;;;-1:-1:-1;23024:191:0;;;;;:::i;:::-;;:::i;32332:114::-;;;;;;;;;;-1:-1:-1;32332:114:0;;;;;:::i;:::-;;:::i;29572:27::-;;;;;;;;;;;;;;;;29444:31;;;;;;;;;;-1:-1:-1;29444:31:0;;;;;;;;;;;21955:44;;;;;;;;;;-1:-1:-1;21955:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;21383:152;;;;;;;;;;;;;:::i;32498:121::-;;;;;;;;;;;;;:::i;20756:87::-;;;;;;;;;;-1:-1:-1;20802:7:0;20829:6;-1:-1:-1;;;;;20829:6:0;20756:87;;21835:20;;;;;;;;;;;;;:::i;22235:41::-;;;;;;;;;;-1:-1:-1;22235:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;24013:205;;;;;;;;;;-1:-1:-1;24013:205:0;;;;;:::i;:::-;;:::i;26032:135::-;;;;;;;;;;-1:-1:-1;26032:135:0;;;;;:::i;:::-;;:::i;31262:1062::-;;;;;;;;;;-1:-1:-1;31262:1062:0;;;;;:::i;:::-;;:::i;29811:57::-;;;;;;;;;;-1:-1:-1;29811:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;26658:342;;;;;;;;;;-1:-1:-1;26658:342:0;;;;;:::i;:::-;;:::i;29404:33::-;;;;;;;;;;-1:-1:-1;29404:33:0;;;;;;;;;;;21923:23;;;;;;;;;;;;;;;;29255:29;;;;;;;;;;;;;;;;33060:197;;;;;;;;;;-1:-1:-1;33060:197:0;;;;;:::i;:::-;;:::i;29543:22::-;;;;;;;;;;;;;;;;29113:26;;;;;;;;;;;;;:::i;22006:64::-;;;;;;;;;;-1:-1:-1;22006:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;32946:106;;;;;;;;;;-1:-1:-1;32946:106:0;;;;;:::i;:::-;;:::i;29322:33::-;;;;;;;;;;;;;;;;22160:68;;;;;;;;;;-1:-1:-1;22160:68:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;21153:222;;;;;;;;;;-1:-1:-1;21153:222:0;;;;;:::i;:::-;;:::i;29291:24::-;;;;;;;;;;;;;;;;21810:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23342:620::-;23420:4;23455:6;;23441:10;:20;;:38;;;;;23478:1;23465:10;:14;23441:38;23437:494;;;23496:13;23512:20;;;:8;:20;;;;;;-1:-1:-1;;;;;23512:20:0;23551:10;:19;;;;;:59;;-1:-1:-1;;;;;;23575:23:0;;;;;;:16;:23;;;;;;;;23599:10;23575:35;;;;;;;;;;23574:36;23551:59;23547:121;;;23638:14;;-1:-1:-1;;;23638:14:0;;;;;;;;;;;23547:121;23684:23;;;;:11;:23;;;;;;;;;:33;;-1:-1:-1;;;;;;23684:33:0;-1:-1:-1;;;;;23684:33:0;;;;;;;;;23737:36;;2092:25:1;;;23737:36:0;;;;;;2065:18:1;23737:36:0;;;;;;;23481:304;23437:494;;;23825:10;23815:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;23815:30:0;;;;;;;;;;;;:43;;;23878:41;2092:25:1;;;23815:30:0;;23825:10;23878:41;;2065:18:1;23878:41:0;;;;;;;23437:494;-1:-1:-1;23950:4:0;23342:620;;;;;:::o;32785:153::-;20909:6;;-1:-1:-1;;;;;20909:6:0;20895:10;:20;20891:47;;20924:14;;-1:-1:-1;;;20924:14:0;;;;;;;;;;;20891:47;32851:7:::1;:13:::0;;;32894:2:::1;32883:13:::0;::::1;;32875:55;;;::::0;-1:-1:-1;;;32875:55:0;;6841:2:1;32875:55:0::1;::::0;::::1;6823:21:1::0;6880:2;6860:18;;;6853:30;6919:31;6899:18;;;6892:59;6968:18;;32875:55:0::1;;;;;;;;;32785:153:::0;:::o;24367:1606::-;24479:6;;24465:10;:20;24461:1505;;24514:20;;;;:8;:20;;;;;;-1:-1:-1;;;;;24506:28:0;;;24514:20;;24506:28;24502:91;;24562:15;;-1:-1:-1;;;24562:15:0;;;;;;;;;;;24502:91;-1:-1:-1;;;;;24613:16:0;;24609:82;;24657:18;;-1:-1:-1;;;24657:18:0;;;;;;;;;;;24609:82;24711:10;-1:-1:-1;;;;;24711:18:0;;;;;;:57;;-1:-1:-1;;;;;;24734:22:0;;;;;;:16;:22;;;;;;;;24757:10;24734:34;;;;;;;;;;24733:35;24711:57;:98;;;;-1:-1:-1;24786:23:0;;;;:11;:23;;;;;;-1:-1:-1;;;;;24786:23:0;24772:10;:37;;24711:98;24707:160;;;24837:14;;-1:-1:-1;;;24837:14:0;;;;;;;;;;;24707:160;24902:5;;-1:-1:-1;;;;;24883:15:0;;;;;;:9;:15;;;;;:24;;:15;;;:24;;24902:5;;24883:24;:::i;:::-;;;;-1:-1:-1;;24968:5:0;;-1:-1:-1;;;;;24951:13:0;;;;;;;:9;:13;;;;;;;;:22;;;;;;;;25005:20;;;:8;:20;;;;;:25;;-1:-1:-1;;;;;;25005:25:0;;;;;;;;25052:11;:23;;;;;25045:30;;;;;;;;25153:12;;;;;:6;:12;;;;;25166:19;;:23;;-1:-1:-1;;25166:23:0;:::i;:::-;25153:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;25205:12:0;;;;:6;:12;;;;;;25218:23;;;:11;:23;;;;;;;25205:37;;25153;;-1:-1:-1;25153:37:0;;25205;;;;;;:::i;:::-;;;;;;;;;;;;:49;;;;-1:-1:-1;;;;;25289:12:0;;;;:6;:12;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;25289:18:0;;;;;;;;;;;;25393:23;;;:11;:23;;;;;;;25368:22;;;;;;:48;-1:-1:-1;;;;;25470:10:0;;;;;:6;:10;;;;;:27;;25289:18;25470:27;;;;;;;;;;;;;;;25580:10;;:17;;:21;;25289:18;25580:21;:::i;:::-;25554:23;;;;:11;:23;;;;;;:47;;;;25623:30;;25566:10;;-1:-1:-1;;;;;25623:30:0;;;;;;;;;;;25693:2;-1:-1:-1;;;;;25673:30:0;25687:4;-1:-1:-1;;;;;25673:30:0;;25697:5;;25673:30;;;;2092:25:1;;2080:2;2065:18;;1946:177;25673:30:0;;;;;;;;24487:1228;24367:1606;;;:::o;24461:1505::-;-1:-1:-1;;;;;25763:15:0;;25745;25763;;;:9;:15;;;;;;;;25779:10;25763:27;;;;;;;;-1:-1:-1;;25809:28:0;;25805:101;;25886:20;25896:10;25886:7;:20;:::i;:::-;-1:-1:-1;;;;;25856:15:0;;;;;;:9;:15;;;;;;;;25872:10;25856:27;;;;;;;:50;25805:101;25923:31;25933:4;25939:2;25943:10;25923:9;:31::i;:::-;;25730:236;24461:1505;24367:1606;;;:::o;26244:319::-;26334:26;26347:4;26353:2;26357;26334:12;:26::i;:::-;-1:-1:-1;;;;;26375:14:0;;;:19;;;;:128;;-1:-1:-1;26398:61:0;;-1:-1:-1;;;26398:61:0;;;26434:10;26398:61;;;7831:34:1;-1:-1:-1;;;;;7901:15:1;;;7881:18;;;7874:43;7933:18;;;7926:34;;;7996:3;7976:18;;;7969:31;-1:-1:-1;8016:19:1;;;8009:30;26463:40:0;;26398:35;;;;26463:40;;8056:19:1;;26398:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;26398:105:0;;;26375:128;26371:185;;;26527:17;;-1:-1:-1;;;26527:17:0;;;;;;;;;;;32627:150;20909:6;;-1:-1:-1;;;;;20909:6:0;20895:10;:20;20891:47;;20924:14;;-1:-1:-1;;;20924:14:0;;;;;;;;;;;20891:47;32692:6:::1;:12:::0;;;32733:2:::1;32723:12:::0;::::1;;32715:54;;;::::0;-1:-1:-1;;;32715:54:0;;6841:2:1;32715:54:0::1;::::0;::::1;6823:21:1::0;6880:2;6860:18;;;6853:30;6919:31;6899:18;;;6892:59;6968:18;;32715:54:0::1;6639:353:1::0;23223:111:0;20909:6;;-1:-1:-1;;;;;20909:6:0;20895:10;:20;20891:47;;20924:14;;-1:-1:-1;;;20924:14:0;;;;;;;;;;;20891:47;-1:-1:-1;;;;;23301:17:0;;;::::1;;::::0;;;:9:::1;:17;::::0;;;;:25;;-1:-1:-1;;23301:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;23223:111::o;23024:191::-;23082:13;23116:12;;;:8;:12;;;;;;-1:-1:-1;;;;;23116:12:0;;23139:69;;23186:10;;-1:-1:-1;;;23186:10:0;;;;;;;;;;;23139:69;23024:191;;;:::o;32332:114::-;20909:6;;-1:-1:-1;;;;;20909:6:0;20895:10;:20;20891:47;;20924:14;;-1:-1:-1;;;20924:14:0;;;;;;;;;;;20891:47;-1:-1:-1;;;;;32411:18:0;;;::::1;;::::0;;;:12:::1;:18;::::0;;;;:27;;-1:-1:-1;;32411:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;32332:114::o;21383:152::-;20909:6;;-1:-1:-1;;;;;20909:6:0;20895:10;:20;20891:47;;20924:14;;-1:-1:-1;;;20924:14:0;;;;;;;;;;;20891:47;21465:1:::1;21448:19:::0;;-1:-1:-1;;;;;;21448:19:0::1;::::0;;21483:44:::1;::::0;21504:10:::1;::::0;21483:44:::1;::::0;21465:1;;21483:44:::1;21383:152::o:0;32498:121::-;32550:4;20909:6;;-1:-1:-1;;;;;20909:6:0;20895:10;:20;20891:47;;20924:14;;-1:-1:-1;;;20924:14:0;;;;;;;;;;;20891:47;-1:-1:-1;32567:14:0::1;:22:::0;;-1:-1:-1;;32567:22:0::1;::::0;;;32498:121;:::o;21835:20::-;;;;;;;:::i;24013:205::-;24116:10;24099:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;24099:38:0;;;;;;;;;;;;:49;;-1:-1:-1;;24099:49:0;;;;;;;;;;24164:46;;1659:41:1;;;24099:38:0;;24116:10;24164:46;;1632:18:1;24164:46:0;;;;;;;24013:205;;:::o;26032:135::-;26102:4;26126:33;26136:10;26148:2;26152:6;26126:9;:33::i;:::-;26119:40;26032:135;-1:-1:-1;;;26032:135:0:o;31262:1062::-;31544:22;;;;;;;;;;;-1:-1:-1;;;31544:22:0;;;;;31596:10;;;;;;;;;;-1:-1:-1;;;31596:10:0;;;;31391:295;;31420:95;31391:295;;;8640:25:1;;;;31534:33:0;8681:18:1;;;8674:34;;;;31586:21:0;8724:18:1;;;8717:34;31626:13:0;8767:18:1;;;8760:34;31666:4:0;8810:19:1;;;8803:61;-1:-1:-1;;8612:19:1;;31391:295:0;;;;;;-1:-1:-1;;31391:295:0;;;;;;31367:330;;31391:295;31367:330;;;;31862:23;;;;;;;;-1:-1:-1;;;31862:23:0;;;;;;;31755:175;;31784:49;31755:175;;;9077:25:1;;;;31852:34:0;9118:18:1;;;9111:34;;;;-1:-1:-1;9161:18:1;;;9154:34;;;31367:330:0;;-1:-1:-1;9050:18:1;;31755:175:0;;;;;;;;;;;;31731:210;;;;;;31710:231;;31954:14;32059:10;32088;31995:134;;;;;;;;-1:-1:-1;;;9457:27:1;;9509:1;9500:11;;9493:27;;;;9545:2;9536:12;;9529:28;9582:2;9573:12;;9199:392;31995:134:0;;;;-1:-1:-1;;31995:134:0;;;;;;;;;31971:169;;31995:134;31971:169;;;;32153:14;32170:26;;;;;;;;;9823:25:1;;;9896:4;9884:17;;9864:18;;;9857:45;;;;9918:18;;;9911:34;;;9961:18;;;9954:34;;;31971:169:0;;-1:-1:-1;32153:14:0;32170:26;;9795:19:1;;32170:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32153:43;;32225:7;20802;20829:6;-1:-1:-1;;;;;20829:6:0;;20756:87;32225:7;-1:-1:-1;;;;;32215:17:0;:6;-1:-1:-1;;;;;32215:17:0;;32207:47;;;;-1:-1:-1;;;32207:47:0;;10201:2:1;32207:47:0;;;10183:21:1;10240:2;10220:18;;;10213:30;-1:-1:-1;;;10259:18:1;;;10252:47;10316:18;;32207:47:0;9999:341:1;32207:47:0;-1:-1:-1;;32267:13:0;:20;;-1:-1:-1;;32298:18:0;;;;;-1:-1:-1;;;;;31262:1062:0:o;26658:342::-;26769:26;26782:4;26788:2;26792;26769:12;:26::i;:::-;-1:-1:-1;;;;;26810:14:0;;;:19;;;;:130;;-1:-1:-1;26833:63:0;;-1:-1:-1;;;26833:63:0;;;26900:40;-1:-1:-1;;;;;26833:35:0;;;26900:40;;26833:63;;26869:10;;26881:4;;26887:2;;26891:4;;;;26833:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;26833:107:0;;;26810:130;26806:187;;;26964:17;;-1:-1:-1;;;26964:17:0;;;;;;;;;;;33060:197;33120:13;33182:1;33159:12;33153:26;;;;;:::i;:::-;;;:30;:96;;;;;;;;;;;;;;;;;33200:12;33214:20;33231:2;33214:16;:20::i;:::-;33186:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33146:103;33060:197;-1:-1:-1;;33060:197:0:o;29113:26::-;;;;;;;:::i;32946:106::-;20909:6;;-1:-1:-1;;;;;20909:6:0;20895:10;:20;20891:47;;20924:14;;-1:-1:-1;;;20924:14:0;;;;;;;;;;;20891:47;33020:12:::1;:24;33035:9:::0;33020:12;:24:::1;:::i;:::-;;32946:106:::0;:::o;21153:222::-;20909:6;;-1:-1:-1;;;;;20909:6:0;20895:10;:20;20891:47;;20924:14;;-1:-1:-1;;;20924:14:0;;;;;;;;;;;20891:47;-1:-1:-1;;;;;21238:22:0;::::1;21234:49;;21269:14;;-1:-1:-1::0;;;21269:14:0::1;;;;;;;;;;;21234:49;21294:6;:17:::0;;-1:-1:-1;;;;;;21294:17:0::1;-1:-1:-1::0;;;;;21294:17:0;::::1;::::0;;::::1;::::0;;21327:40:::1;::::0;21294:17;;21348:10:::1;::::0;21327:40:::1;::::0;21294:6;21327:40:::1;21153:222:::0;:::o;33265:3144::-;33353:4;-1:-1:-1;;;;;33378:18:0;;33370:68;;;;-1:-1:-1;;;33370:68:0;;14566:2:1;33370:68:0;;;14548:21:1;14605:2;14585:18;;;14578:30;14644:34;14624:18;;;14617:62;-1:-1:-1;;;14695:18:1;;;14688:35;14740:19;;33370:68:0;14364:401:1;33370:68:0;-1:-1:-1;;;;;33457:16:0;;33449:64;;;;-1:-1:-1;;;33449:64:0;;14972:2:1;33449:64:0;;;14954:21:1;15011:2;14991:18;;;14984:30;15050:34;15030:18;;;15023:62;-1:-1:-1;;;15101:18:1;;;15094:33;15144:19;;33449:64:0;14770:399:1;33449:64:0;-1:-1:-1;;;;;33533:18:0;;;;;;:12;:18;;;;;;;;33532:19;33524:49;;;;-1:-1:-1;;;33524:49:0;;15376:2:1;33524:49:0;;;15358:21:1;15415:2;15395:18;;;15388:30;-1:-1:-1;;;15434:18:1;;;15427:47;15491:18;;33524:49:0;15174:341:1;33524:49:0;-1:-1:-1;;;;;33593:16:0;;;;;;:12;:16;;;;;;;;33592:17;33584:45;;;;-1:-1:-1;;;33584:45:0;;15722:2:1;33584:45:0;;;15704:21:1;15761:2;15741:18;;;15734:30;-1:-1:-1;;;15780:18:1;;;15773:45;15835:18;;33584:45:0;15520:339:1;33584:45:0;33646:6;33656:1;33646:11;33642:41;;-1:-1:-1;33679:4:0;33672:11;;33642:41;33700:14;;;;33696:1160;;;20802:7;20829:6;-1:-1:-1;;;;;33735:15:0;;;20829:6;;33735:15;;;;:49;;-1:-1:-1;20802:7:0;20829:6;-1:-1:-1;;;;;33771:13:0;;;20829:6;;33771:13;;33735:49;:86;;;;-1:-1:-1;;;;;;33805:16:0;;;;33735:86;:128;;;;-1:-1:-1;;;;;;33842:21:0;;33856:6;33842:21;;33735:128;:159;;;;-1:-1:-1;33885:9:0;;;;33884:10;33735:159;33731:1114;;;33920:13;;;;;;;33915:148;;-1:-1:-1;;;;;33966:24:0;;;;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;33994:22:0;;;;;;:18;:22;;;;;;;;33966:50;33958:85;;;;-1:-1:-1;;;33958:85:0;;16066:2:1;33958:85:0;;;16048:21:1;16105:2;16085:18;;;16078:30;-1:-1:-1;;;16124:18:1;;;16117:52;16186:18;;33958:85:0;15864:346:1;33958:85:0;-1:-1:-1;;;;;34116:31:0;;;;;;:25;:31;;;;;;;;:64;;;;-1:-1:-1;;;;;;34152:28:0;;;;;;:24;:28;;;;;;;;34151:29;34116:64;34112:718;;;34223:14;;34213:6;:24;;34205:90;;;;-1:-1:-1;;;34205:90:0;;16417:2:1;34205:90:0;;;16399:21:1;16456:2;16436:18;;;16429:30;16495:34;16475:18;;;16468:62;-1:-1:-1;;;16546:18:1;;;16539:51;16607:19;;34205:90:0;16215:417:1;34205:90:0;34352:9;;-1:-1:-1;;;;;34335:13:0;;;;;;:9;:13;;;;;;34326:22;;:6;:22;:::i;:::-;:35;;34318:67;;;;-1:-1:-1;;;34318:67:0;;16969:2:1;34318:67:0;;;16951:21:1;17008:2;16988:18;;;16981:30;-1:-1:-1;;;17027:18:1;;;17020:49;17086:18;;34318:67:0;16767:343:1;34318:67:0;34112:718;;;-1:-1:-1;;;;;34462:29:0;;;;;;:25;:29;;;;;;;;:64;;;;-1:-1:-1;;;;;;34496:30:0;;;;;;:24;:30;;;;;;;;34495:31;34462:64;34458:372;;;34569:14;;34559:6;:24;;34551:91;;;;-1:-1:-1;;;34551:91:0;;17317:2:1;34551:91:0;;;17299:21:1;17356:2;17336:18;;;17329:30;17395:34;17375:18;;;17368:62;-1:-1:-1;;;17446:18:1;;;17439:52;17508:19;;34551:91:0;17115:418:1;34458:372:0;-1:-1:-1;;;;;34690:28:0;;;;;;:24;:28;;;;;;;;34685:145;;34777:9;;-1:-1:-1;;;;;34760:13:0;;;;;;:9;:13;;;;;;34751:22;;:6;:22;:::i;:::-;:35;;34743:67;;;;-1:-1:-1;;;34743:67:0;;16969:2:1;34743:67:0;;;16951:21:1;17008:2;16988:18;;;16981:30;-1:-1:-1;;;17027:18:1;;;17020:49;17086:18;;34743:67:0;16767:343:1;34743:67:0;35225:18;;35215:4;35182:12;35197:24;;;:9;:24;;;;;;:46;;;;;;35258:35;;-1:-1:-1;35282:11:0;;;;;;;35258:35;:62;;;;-1:-1:-1;35311:9:0;;;;35310:10;35258:62;:111;;;;-1:-1:-1;;;;;;35338:31:0;;;;;;:25;:31;;;;;;;;35337:32;35258:111;:153;;;;-1:-1:-1;;;;;;35387:24:0;;;;;;:18;:24;;;;;;;;35386:25;35258:153;:193;;;;-1:-1:-1;;;;;;35429:22:0;;;;;;:18;:22;;;;;;;;35428:23;35258:193;35254:301;;;35470:9;:16;;-1:-1:-1;;35470:16:0;35482:4;35470:16;;;35501:10;:8;:10::i;:::-;35526:9;:17;;-1:-1:-1;;35526:17:0;;;35254:301;35583:9;;-1:-1:-1;;;;;35694:24:0;;35567:12;35694:24;;;:18;:24;;;;;;35583:9;;;;35582:10;;35694:24;;:50;;-1:-1:-1;;;;;;35722:22:0;;;;;;:18;:22;;;;;;;;35694:50;35690:98;;;-1:-1:-1;35771:5:0;35690:98;35800:12;35905:7;35901:448;;;-1:-1:-1;;;;;35933:29:0;;;;;;:25;:29;;;;;;;;:44;;;;;35976:1;35966:7;;:11;35933:44;35929:233;;;36033:3;36023:7;;36014:6;:16;;;;:::i;:::-;:22;;;;:::i;:::-;36007:29;;35929:233;;;-1:-1:-1;;;;;36060:31:0;;;;;;:25;:31;;;;;;;;:45;;;;;36104:1;36095:6;;:10;36060:45;36056:106;;;36159:3;36150:6;;36141;:15;;;;:::i;:::-;:21;;;;:::i;:::-;36134:28;;36056:106;36193:4;36177:12;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;36218:8:0;;36214:124;;36247:42;36263:4;36277;36284;36247:15;:42::i;:::-;-1:-1:-1;36308:14:0;36318:4;36308:14;;:::i;:::-;;;36214:124;36368:33;36384:4;36390:2;36394:6;36368:15;:33::i;:::-;36361:40;33265:3144;-1:-1:-1;;;;;;;33265:3144:0:o;11133:718::-;11189:13;11240:14;11257:17;11268:5;11257:10;:17::i;:::-;11277:1;11257:21;11240:38;;11293:20;11327:6;11316:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11316:18:0;-1:-1:-1;11293:41:0;-1:-1:-1;11458:28:0;;;11474:2;11458:28;11515:290;-1:-1:-1;;11547:5:0;-1:-1:-1;;;11684:2:0;11673:14;;11668:32;11547:5;11655:46;11747:2;11738:11;;;-1:-1:-1;11768:21:0;11515:290;11768:21;-1:-1:-1;11826:6:0;11133:718;-1:-1:-1;;;11133:718:0:o;37131:450::-;37233:4;37170:12;37215:24;;;:9;:24;;;;;;37254:16;;;:37;;-1:-1:-1;37274:12:0;;:17;37254:37;37250:63;;;37306:7;;37131:450::o;37250:63::-;37343:18;;;:23;;;:::i;:::-;37329:11;:37;37325:93;;;37395:18;;;:23;;;:::i;:::-;37381:37;;37325:93;37431:29;37448:11;37431:16;:29::i;:::-;37486:1;37471:12;:16;37522:9;;37514:59;;37522:9;;;;-1:-1:-1;;;;;37522:9:0;;37546:21;;37514:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27068:999;-1:-1:-1;;;;;27202:15:0;;;27155:4;27202:15;;;:9;:15;;;;;;;;27260:13;;;;;;;;;27286:15;;;27155:4;;27202:15;27260:13;27305:6;;27155:4;27286:25;27305:6;27202:15;27286:25;:::i;:::-;;;;-1:-1:-1;;;;;;;27347:13:0;;;;;;;:9;:13;;;;;;;;:23;;;;;;27455:15;;;;;:9;:15;;;;;;27450:236;;27563:5;;-1:-1:-1;;;;;27545:15:0;;27487:22;27545:15;;;:9;:15;;;;;;27487:22;;27545:23;;;:::i;:::-;27535:5;;27513:27;;:19;:27;:::i;:::-;27512:57;;;;:::i;:::-;27487:82;;27589:9;27584:91;27608:14;27604:1;:18;27584:91;;;27648:11;27654:4;27648:5;:11::i;:::-;27624:3;;27584:91;;;;27472:214;27450:236;-1:-1:-1;;;;;27762:13:0;;;;;;:9;:13;;;;;;;;27757:232;;27792:22;27868:5;;27844:21;:29;;;;:::i;:::-;27834:5;;-1:-1:-1;;;;;27818:13:0;;;;;;:9;:13;;;;;;:21;;27834:5;27818:21;:::i;:::-;27817:57;;;;:::i;:::-;27792:82;;27894:9;27889:89;27913:14;27909:1;:18;27889:89;;;27953:9;27959:2;27953:5;:9::i;:::-;27929:3;;27889:89;;;;27777:212;27757:232;28026:2;-1:-1:-1;;;;;28006:31:0;28020:4;-1:-1:-1;;;;;28006:31:0;;28030:6;28006:31;;;;2092:25:1;;2080:2;2065:18;;1946:177;28006:31:0;;;;;;;;-1:-1:-1;28055:4:0;;27068:999;-1:-1:-1;;;;;27068:999:0:o;8417:948::-;8470:7;;-1:-1:-1;;;8548:17:0;;8544:106;;-1:-1:-1;;;8586:17:0;;;-1:-1:-1;8632:2:0;8622:12;8544:106;8677:8;8668:5;:17;8664:106;;8715:8;8706:17;;;-1:-1:-1;8752:2:0;8742:12;8664:106;8797:8;8788:5;:17;8784:106;;8835:8;8826:17;;;-1:-1:-1;8872:2:0;8862:12;8784:106;8917:7;8908:5;:16;8904:103;;8954:7;8945:16;;;-1:-1:-1;8990:1:0;8980:11;8904:103;9034:7;9025:5;:16;9021:103;;9071:7;9062:16;;;-1:-1:-1;9107:1:0;9097:11;9021:103;9151:7;9142:5;:16;9138:103;;9188:7;9179:16;;;-1:-1:-1;9224:1:0;9214:11;9138:103;9268:7;9259:5;:16;9255:68;;9306:1;9296:11;9351:6;8417:948;-1:-1:-1;;8417:948:0:o;36532:591::-;36682:16;;;36696:1;36682:16;;;;;;;;36658:21;;36682:16;;;;;;;;;;-1:-1:-1;36682:16:0;36658:40;;36727:4;36709;36714:1;36709:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;36709:23:0;;;-1:-1:-1;;;;;36709:23:0;;;;;36753:15;-1:-1:-1;;;;;36753:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36743:4;36748:1;36743:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;36743:32:0;;;:7;;;;;;;;;;:32;;;;36806:4;36788:24;;;;:9;:24;;;;;;36821:15;36788:50;;;;;;;;;;;;;:64;;;36891:224;;-1:-1:-1;;;36891:224:0;;:66;;:224;;36841:11;;37042:4;;36806;37089:15;;36891:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36587:536;36532:591;:::o;28699:373::-;-1:-1:-1;;;;;28760:18:0;;28756:73;;28802:15;;-1:-1:-1;;;28802:15:0;;;;;;;;;;;28756:73;-1:-1:-1;;;;;28854:12:0;;28841:10;28854:12;;;:6;:12;;;;;28867:19;;:23;;28889:1;;28867:23;:::i;:::-;28854:37;;;;;;;;:::i;:::-;;;;;;;;;28841:50;;28902:6;:12;28909:4;-1:-1:-1;;;;;28902:12:0;-1:-1:-1;;;;;28902:12:0;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;28902:18:0;;;;;;;;;;;;28938:15;;;:11;:15;;;;;;28931:22;;;28971:8;:12;;;;;28964:19;;-1:-1:-1;;;;;;28964:19:0;;;;;;29001:11;:15;;;;;;28994:22;;;;;;;;29034:30;28950:2;;28902:18;-1:-1:-1;;;;;29034:30:0;;;;;28902:18;;29034:30;28745:327;28699:373;:::o;28219:472::-;-1:-1:-1;;;;;28278:16:0;;28274:74;;28318:18;;-1:-1:-1;;;28318:18:0;;;;;;;;;;;28274:74;28385:6;:8;;;;;;;;:6;28451:12;;;:8;:12;;;;;;-1:-1:-1;;;;;28451:12:0;:26;28447:81;;28501:15;;-1:-1:-1;;;28501:15:0;;;;;;;;;;;28447:81;28540:12;;;;:8;:12;;;;;;;;:17;;-1:-1:-1;;;;;;28540:17:0;-1:-1:-1;;;;;28540:17:0;;;;;;;;28568:10;;;:6;:10;;;;;:19;;-1:-1:-1;28568:19:0;;;;;;;;;;;;;;;28616:10;;:17;;:21;;-1:-1:-1;28616:21:0;:::i;:::-;28598:15;;;;:11;:15;;;;;;:39;;;;28655:28;;28610:2;;-1:-1:-1;;;;;28655:28:0;;;;;28598:15;;28655:28;28263:428;28219:472;:::o;14:250:1:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:396::-;418:2;407:9;400:21;381:4;450:6;444:13;493:6;488:2;477:9;473:18;466:34;509:79;581:6;576:2;565:9;561:18;556:2;548:6;544:15;509:79;:::i;:::-;649:2;628:15;-1:-1:-1;;624:29:1;609:45;;;;656:2;605:54;;269:396;-1:-1:-1;;269:396:1:o;670:180::-;729:6;782:2;770:9;761:7;757:23;753:32;750:52;;;798:1;795;788:12;750:52;-1:-1:-1;821:23:1;;670:180;-1:-1:-1;670:180:1:o;1063:131::-;-1:-1:-1;;;;;1138:31:1;;1128:42;;1118:70;;1184:1;1181;1174:12;1199:315;1267:6;1275;1328:2;1316:9;1307:7;1303:23;1299:32;1296:52;;;1344:1;1341;1334:12;1296:52;1383:9;1370:23;1402:31;1427:5;1402:31;:::i;:::-;1452:5;1504:2;1489:18;;;;1476:32;;-1:-1:-1;;;1199:315:1:o;2128:456::-;2205:6;2213;2221;2274:2;2262:9;2253:7;2249:23;2245:32;2242:52;;;2290:1;2287;2280:12;2242:52;2329:9;2316:23;2348:31;2373:5;2348:31;:::i;:::-;2398:5;-1:-1:-1;2455:2:1;2440:18;;2427:32;2468:33;2427:32;2468:33;:::i;:::-;2128:456;;2520:7;;-1:-1:-1;;;2574:2:1;2559:18;;;;2546:32;;2128:456::o;2778:247::-;2837:6;2890:2;2878:9;2869:7;2865:23;2861:32;2858:52;;;2906:1;2903;2896:12;2858:52;2945:9;2932:23;2964:31;2989:5;2964:31;:::i;3030:416::-;3095:6;3103;3156:2;3144:9;3135:7;3131:23;3127:32;3124:52;;;3172:1;3169;3162:12;3124:52;3211:9;3198:23;3230:31;3255:5;3230:31;:::i;:::-;3280:5;-1:-1:-1;3337:2:1;3322:18;;3309:32;3379:15;;3372:23;3360:36;;3350:64;;3410:1;3407;3400:12;3350:64;3433:7;3423:17;;;3030:416;;;;;:::o;3451:405::-;3526:6;3534;3542;3595:2;3583:9;3574:7;3570:23;3566:32;3563:52;;;3611:1;3608;3601:12;3563:52;3650:9;3637:23;3700:4;3693:5;3689:16;3682:5;3679:27;3669:55;;3720:1;3717;3710:12;3669:55;3743:5;3795:2;3780:18;;3767:32;;-1:-1:-1;3846:2:1;3831:18;;;3818:32;;3451:405;-1:-1:-1;;;3451:405:1:o;3861:936::-;3958:6;3966;3974;3982;3990;4043:3;4031:9;4022:7;4018:23;4014:33;4011:53;;;4060:1;4057;4050:12;4011:53;4099:9;4086:23;4118:31;4143:5;4118:31;:::i;:::-;4168:5;-1:-1:-1;4225:2:1;4210:18;;4197:32;4238:33;4197:32;4238:33;:::i;:::-;4290:7;-1:-1:-1;4344:2:1;4329:18;;4316:32;;-1:-1:-1;4399:2:1;4384:18;;4371:32;4422:18;4452:14;;;4449:34;;;4479:1;4476;4469:12;4449:34;4517:6;4506:9;4502:22;4492:32;;4562:7;4555:4;4551:2;4547:13;4543:27;4533:55;;4584:1;4581;4574:12;4533:55;4624:2;4611:16;4650:2;4642:6;4639:14;4636:34;;;4666:1;4663;4656:12;4636:34;4711:7;4706:2;4697:6;4693:2;4689:15;4685:24;4682:37;4679:57;;;4732:1;4729;4722:12;4679:57;3861:936;;;;-1:-1:-1;3861:936:1;;-1:-1:-1;4763:2:1;4755:11;;4785:6;3861:936;-1:-1:-1;;;3861:936:1:o;4802:388::-;4870:6;4878;4931:2;4919:9;4910:7;4906:23;4902:32;4899:52;;;4947:1;4944;4937:12;4899:52;4986:9;4973:23;5005:31;5030:5;5005:31;:::i;:::-;5055:5;-1:-1:-1;5112:2:1;5097:18;;5084:32;5125:33;5084:32;5125:33;:::i;5195:127::-;5256:10;5251:3;5247:20;5244:1;5237:31;5287:4;5284:1;5277:15;5311:4;5308:1;5301:15;5327:922;5396:6;5449:2;5437:9;5428:7;5424:23;5420:32;5417:52;;;5465:1;5462;5455:12;5417:52;5505:9;5492:23;5534:18;5575:2;5567:6;5564:14;5561:34;;;5591:1;5588;5581:12;5561:34;5629:6;5618:9;5614:22;5604:32;;5674:7;5667:4;5663:2;5659:13;5655:27;5645:55;;5696:1;5693;5686:12;5645:55;5732:2;5719:16;5754:2;5750;5747:10;5744:36;;;5760:18;;:::i;:::-;5835:2;5829:9;5803:2;5889:13;;-1:-1:-1;;5885:22:1;;;5909:2;5881:31;5877:40;5865:53;;;5933:18;;;5953:22;;;5930:46;5927:72;;;5979:18;;:::i;:::-;6019:10;6015:2;6008:22;6054:2;6046:6;6039:18;6094:7;6089:2;6084;6080;6076:11;6072:20;6069:33;6066:53;;;6115:1;6112;6105:12;6066:53;6171:2;6166;6162;6158:11;6153:2;6145:6;6141:15;6128:46;6216:1;6194:15;;;6211:2;6190:24;6183:35;;;;-1:-1:-1;6198:6:1;5327:922;-1:-1:-1;;;;;5327:922:1:o;6254:380::-;6333:1;6329:12;;;;6376;;;6397:61;;6451:4;6443:6;6439:17;6429:27;;6397:61;6504:2;6496:6;6493:14;6473:18;6470:38;6467:161;;6550:10;6545:3;6541:20;6538:1;6531:31;6585:4;6582:1;6575:15;6613:4;6610:1;6603:15;6467:161;;6254:380;;;:::o;6997:127::-;7058:10;7053:3;7049:20;7046:1;7039:31;7089:4;7086:1;7079:15;7113:4;7110:1;7103:15;7129:128;7196:9;;;7217:11;;;7214:37;;;7231:18;;:::i;7262:127::-;7323:10;7318:3;7314:20;7311:1;7304:31;7354:4;7351:1;7344:15;7378:4;7375:1;7368:15;7394:127;7455:10;7450:3;7446:20;7443:1;7436:31;7486:4;7483:1;7476:15;7510:4;7507:1;7500:15;8086:290;8155:6;8208:2;8196:9;8187:7;8183:23;8179:32;8176:52;;;8224:1;8221;8214:12;8176:52;8250:16;;-1:-1:-1;;;;;;8295:32:1;;8285:43;;8275:71;;8342:1;8339;8332:12;10345:662;-1:-1:-1;;;;;10624:15:1;;;10606:34;;10676:15;;10671:2;10656:18;;10649:43;10723:2;10708:18;;10701:34;;;10771:3;10766:2;10751:18;;10744:31;;;10791:19;;10784:35;;;10549:4;10812:6;10862;10586:3;10841:19;;10828:49;10927:1;10921:3;10912:6;10901:9;10897:22;10893:32;10886:43;10997:3;10990:2;10986:7;10981:2;10973:6;10969:15;10965:29;10954:9;10950:45;10946:55;10938:63;;10345:662;;;;;;;;:::o;11138:1177::-;11404:3;11433:1;11466:6;11460:13;11496:36;11522:9;11496:36;:::i;:::-;11551:1;11568:17;;;11594:133;;;;11741:1;11736:358;;;;11561:533;;11594:133;-1:-1:-1;;11627:24:1;;11615:37;;11700:14;;11693:22;11681:35;;11672:45;;;-1:-1:-1;11594:133:1;;11736:358;11767:6;11764:1;11757:17;11797:4;11842;11839:1;11829:18;11869:1;11883:165;11897:6;11894:1;11891:13;11883:165;;;11975:14;;11962:11;;;11955:35;12018:16;;;;11912:10;;11883:165;;;11887:3;;;12077:6;12072:3;12068:16;12061:23;;11561:533;;;;;12125:6;12119:13;12141:68;12200:8;12195:3;12188:4;12180:6;12176:17;12141:68;:::i;:::-;-1:-1:-1;;;12231:18:1;;12258:22;;;12307:1;12296:13;;11138:1177;-1:-1:-1;;;;11138:1177:1:o;12320:518::-;12422:2;12417:3;12414:11;12411:421;;;12458:5;12455:1;12448:16;12502:4;12499:1;12489:18;12572:2;12560:10;12556:19;12553:1;12549:27;12543:4;12539:38;12608:4;12596:10;12593:20;12590:47;;;-1:-1:-1;12631:4:1;12590:47;12686:2;12681:3;12677:12;12674:1;12670:20;12664:4;12660:31;12650:41;;12741:81;12759:2;12752:5;12749:13;12741:81;;;12818:1;12804:16;;12785:1;12774:13;12741:81;;13014:1345;13140:3;13134:10;13167:18;13159:6;13156:30;13153:56;;;13189:18;;:::i;:::-;13218:97;13308:6;13268:38;13300:4;13294:11;13268:38;:::i;:::-;13262:4;13218:97;:::i;:::-;13370:4;;13427:2;13416:14;;13444:1;13439:663;;;;14146:1;14163:6;14160:89;;;-1:-1:-1;14215:19:1;;;14209:26;14160:89;-1:-1:-1;;12971:1:1;12967:11;;;12963:24;12959:29;12949:40;12995:1;12991:11;;;12946:57;14262:81;;13409:944;;13439:663;11085:1;11078:14;;;11122:4;11109:18;;-1:-1:-1;;13475:20:1;;;13593:236;13607:7;13604:1;13601:14;13593:236;;;13696:19;;;13690:26;13675:42;;13788:27;;;;13756:1;13744:14;;;;13623:19;;13593:236;;;13597:3;13857:6;13848:7;13845:19;13842:201;;;13918:19;;;13912:26;-1:-1:-1;;14001:1:1;13997:14;;;14013:3;13993:24;13989:37;13985:42;13970:58;13955:74;;13842:201;-1:-1:-1;;;;;14089:1:1;14073:14;;;14069:22;14056:36;;-1:-1:-1;13014:1345:1:o;16637:125::-;16702:9;;;16723:10;;;16720:36;;;16736:18;;:::i;17538:168::-;17611:9;;;17642;;17659:15;;;17653:22;;17639:37;17629:71;;17680:18;;:::i;17843:217::-;17883:1;17909;17899:132;;17953:10;17948:3;17944:20;17941:1;17934:31;17988:4;17985:1;17978:15;18016:4;18013:1;18006:15;17899:132;-1:-1:-1;18045:9:1;;17843:217::o;18275:251::-;18345:6;18398:2;18386:9;18377:7;18373:23;18369:32;18366:52;;;18414:1;18411;18404:12;18366:52;18446:9;18440:16;18465:31;18490:5;18465:31;:::i;18531:980::-;18793:4;18841:3;18830:9;18826:19;18872:6;18861:9;18854:25;18898:2;18936:6;18931:2;18920:9;18916:18;18909:34;18979:3;18974:2;18963:9;18959:18;18952:31;19003:6;19038;19032:13;19069:6;19061;19054:22;19107:3;19096:9;19092:19;19085:26;;19146:2;19138:6;19134:15;19120:29;;19167:1;19177:195;19191:6;19188:1;19185:13;19177:195;;;19256:13;;-1:-1:-1;;;;;19252:39:1;19240:52;;19347:15;;;;19312:12;;;;19288:1;19206:9;19177:195;;;-1:-1:-1;;;;;;;19428:32:1;;;;19423:2;19408:18;;19401:60;-1:-1:-1;;;19492:3:1;19477:19;19470:35;19389:3;18531:980;-1:-1:-1;;;18531:980:1:o

Swarm Source

ipfs://81ae4a5a73395dc038247b4630e6da73de5e6649513c0d2c625daadc56007fa1
Loading...
Loading
Loading...
Loading
[ 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.