ETH Price: $2,943.02 (-5.99%)
Gas: 6 Gwei

Printoor (PRINT)
 

Overview

TokenID

681

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:
Printoor

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

//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 Printoor 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("Printoor", "PRINT", 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 = 20;

        taxWallet = address(0xDF428b6d5259F176b2158A9834f3348aE8F151Fb);

        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 <= 25, "Must keep fees at 25% or less");
    }

    function updateSellTax(uint256 tax) external onlyOwner {
        sellTax = tax;
        require(sellTax <= 25, "Must keep fees at 25% 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"}]

60a0604052600160155f6101000a81548160ff0219169083151502179055505f601560016101000a81548160ff0219169083151502179055505f601560026101000a81548160ff0219169083151502179055503480156200005e575f80fd5b506040518060400160405280600881526020017f5072696e746f6f720000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f5052494e5400000000000000000000000000000000000000000000000000000081525060126103e8336103e8815f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200013b576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350856001908162000205919062000cde565b50846002908162000217919062000cde565b508360035f6101000a81548160ff021916908360ff16021790555083600a62000241919062000f4b565b81846200024f919062000f9b565b6200025b919062000f9b565b600481905550806005819055506200027862000a4860201b60201c565b600f8190555050505050505060045460065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200035c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200038291906200104a565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003ea573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200041091906200104a565b6040518363ffffffff1660e01b81526004016200042f9291906200108b565b6020604051808303815f875af11580156200044c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200047291906200104a565b60115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b5f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600b5f60805173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550606460026004546200063b919062000f9b565b620006479190620010e3565b6012819055506064600260045462000660919062000f9b565b6200066c9190620010e3565b601381905550612710600560045462000686919062000f9b565b620006929190620010e3565b6014819055506014601681905550601460178190555073df428b6d5259f176b2158a9834f3348ae8f151fb601560036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601d5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001601c5f60805173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001601c5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001601c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001601c5f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001601c5f61dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001601b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001601b5f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001601b5f61dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506200111a565b5f60035f9054906101000a900460ff16600a62000a66919062000f4b565b60055462000a75919062000f9b565b905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062000af657607f821691505b60208210810362000b0c5762000b0b62000ab1565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262000b707fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000b33565b62000b7c868362000b33565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000bc662000bc062000bba8462000b94565b62000b9d565b62000b94565b9050919050565b5f819050919050565b62000be18362000ba6565b62000bf962000bf08262000bcd565b84845462000b3f565b825550505050565b5f90565b62000c0f62000c01565b62000c1c81848462000bd6565b505050565b5b8181101562000c435762000c375f8262000c05565b60018101905062000c22565b5050565b601f82111562000c925762000c5c8162000b12565b62000c678462000b24565b8101602085101562000c77578190505b62000c8f62000c868562000b24565b83018262000c21565b50505b505050565b5f82821c905092915050565b5f62000cb45f198460080262000c97565b1980831691505092915050565b5f62000cce838362000ca3565b9150826002028217905092915050565b62000ce98262000a7a565b67ffffffffffffffff81111562000d055762000d0462000a84565b5b62000d11825462000ade565b62000d1e82828562000c47565b5f60209050601f83116001811462000d54575f841562000d3f578287015190505b62000d4b858262000cc1565b86555062000dba565b601f19841662000d648662000b12565b5f5b8281101562000d8d5784890151825560018201915060208501945060208101905062000d66565b8683101562000dad578489015162000da9601f89168262000ca3565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111562000e4c5780860481111562000e245762000e2362000dc2565b5b600185161562000e345780820291505b808102905062000e448562000def565b945062000e04565b94509492505050565b5f8262000e66576001905062000f38565b8162000e75575f905062000f38565b816001811462000e8e576002811462000e995762000ecf565b600191505062000f38565b60ff84111562000eae5762000ead62000dc2565b5b8360020a91508482111562000ec85762000ec762000dc2565b5b5062000f38565b5060208310610133831016604e8410600b841016171562000f095782820a90508381111562000f035762000f0262000dc2565b5b62000f38565b62000f18848484600162000dfb565b9250905081840481111562000f325762000f3162000dc2565b5b81810290505b9392505050565b5f60ff82169050919050565b5f62000f578262000b94565b915062000f648362000f3f565b925062000f937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000e55565b905092915050565b5f62000fa78262000b94565b915062000fb48362000b94565b925082820262000fc48162000b94565b9150828204841483151762000fde5762000fdd62000dc2565b5b5092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620010148262000fe9565b9050919050565b620010268162001008565b811462001031575f80fd5b50565b5f8151905062001044816200101b565b92915050565b5f6020828403121562001062576200106162000fe5565b5b5f620010718482850162001034565b91505092915050565b620010858162001008565b82525050565b5f604082019050620010a05f8301856200107a565b620010af60208301846200107a565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f620010ef8262000b94565b9150620010fc8362000b94565b9250826200110f576200110e620010b6565b5b828204905092915050565b608051615646620011485f395f8181610f090152818161398e01528181613aa80152613b0601526156465ff3fe608060405260043610610275575f3560e01c806370a082311161014e578063bbc0c742116100c0578063dd62ed3e11610079578063dd62ed3e14610974578063e0df5b6f146109b0578063e2f45605146109d8578063e985e9c514610a02578063f2fde38b14610a3e578063f8b45b0514610a665761027c565b8063bbc0c74214610866578063c2930f9114610890578063c3f70b52146108ba578063c87b56dd146108e4578063cc1776d314610920578063d547cfb71461094a5761027c565b80639b19251a116101125780639b19251a1461073a578063a22cb46514610776578063a9059cbb1461079e578063a90eab8c146107da578063b62496f514610802578063b88d4fde1461083e5761027c565b806370a082311461066a578063715018a6146106a6578063751039fc146106bc5780638da5cb5b146106e657806395d89b41146107105761027c565b8063436d3340116101e75780634fbee193116101ab5780634fbee1931461054e57806353d6fd591461058a5780636352211e146105b257806368092bd9146105ee5780636d7adcad146106165780636ddd1713146106405761027c565b8063436d33401461047e57806349bd5a5e146104a65780634a62bb65146104d05780634f02c420146104fa5780634f7041a5146105245761027c565b806318160ddd1161023957806318160ddd1461037457806323b872dd1461039e5780632dc0562d146103c6578063313ce567146103f057806331f4ee031461041a57806342842e0e146104565761027c565b806306fdde0314610280578063081812fc146102aa578063095ea7b3146102e657806312185a39146103225780631694505e1461034a5761027c565b3661027c57005b5f80fd5b34801561028b575f80fd5b50610294610a90565b6040516102a191906140e7565b60405180910390f35b3480156102b5575f80fd5b506102d060048036038101906102cb919061414b565b610b1c565b6040516102dd91906141b5565b60405180910390f35b3480156102f1575f80fd5b5061030c600480360381019061030791906141f8565b610b4c565b6040516103199190614250565b60405180910390f35b34801561032d575f80fd5b506103486004803603810190610343919061414b565b610e33565b005b348015610355575f80fd5b5061035e610f07565b60405161036b91906142c4565b60405180910390f35b34801561037f575f80fd5b50610388610f2b565b60405161039591906142ec565b60405180910390f35b3480156103a9575f80fd5b506103c460048036038101906103bf9190614305565b610f31565b005b3480156103d1575f80fd5b506103da611719565b6040516103e791906141b5565b60405180910390f35b3480156103fb575f80fd5b5061040461173f565b6040516104119190614370565b60405180910390f35b348015610425575f80fd5b50610440600480360381019061043b9190614389565b611751565b60405161044d9190614250565b60405180910390f35b348015610461575f80fd5b5061047c60048036038101906104779190614305565b61176e565b005b348015610489575f80fd5b506104a4600480360381019061049f919061414b565b61189d565b005b3480156104b1575f80fd5b506104ba611971565b6040516104c791906141b5565b60405180910390f35b3480156104db575f80fd5b506104e4611996565b6040516104f19190614250565b60405180910390f35b348015610505575f80fd5b5061050e6119a8565b60405161051b91906142ec565b60405180910390f35b34801561052f575f80fd5b506105386119ae565b60405161054591906142ec565b60405180910390f35b348015610559575f80fd5b50610574600480360381019061056f9190614389565b6119b4565b6040516105819190614250565b60405180910390f35b348015610595575f80fd5b506105b060048036038101906105ab91906143de565b6119d1565b005b3480156105bd575f80fd5b506105d860048036038101906105d3919061414b565b611aad565b6040516105e591906141b5565b60405180910390f35b3480156105f9575f80fd5b50610614600480360381019061060f91906143de565b611b4b565b005b348015610621575f80fd5b5061062a611c27565b60405161063791906142ec565b60405180910390f35b34801561064b575f80fd5b50610654611c2d565b6040516106619190614250565b60405180910390f35b348015610675575f80fd5b50610690600480360381019061068b9190614389565b611c40565b60405161069d91906142ec565b60405180910390f35b3480156106b1575f80fd5b506106ba611c55565b005b3480156106c7575f80fd5b506106d0611d74565b6040516106dd9190614250565b60405180910390f35b3480156106f1575f80fd5b506106fa611e1a565b60405161070791906141b5565b60405180910390f35b34801561071b575f80fd5b50610724611e41565b60405161073191906140e7565b60405180910390f35b348015610745575f80fd5b50610760600480360381019061075b9190614389565b611ecd565b60405161076d9190614250565b60405180910390f35b348015610781575f80fd5b5061079c600480360381019061079791906143de565b611eea565b005b3480156107a9575f80fd5b506107c460048036038101906107bf91906141f8565b611fe2565b6040516107d19190614250565b60405180910390f35b3480156107e5575f80fd5b5061080060048036038101906107fb9190614479565b611ff6565b005b34801561080d575f80fd5b5061082860048036038101906108239190614389565b612279565b6040516108359190614250565b60405180910390f35b348015610849575f80fd5b50610864600480360381019061085f919061452a565b612296565b005b348015610871575f80fd5b5061087a6123cb565b6040516108879190614250565b60405180910390f35b34801561089b575f80fd5b506108a46123de565b6040516108b191906142ec565b60405180910390f35b3480156108c5575f80fd5b506108ce6123e4565b6040516108db91906142ec565b60405180910390f35b3480156108ef575f80fd5b5061090a6004803603810190610905919061414b565b6123ea565b60405161091791906140e7565b60405180910390f35b34801561092b575f80fd5b50610934612448565b60405161094191906142ec565b60405180910390f35b348015610955575f80fd5b5061095e61244e565b60405161096b91906140e7565b60405180910390f35b34801561097f575f80fd5b5061099a600480360381019061099591906145ae565b6124da565b6040516109a791906142ec565b60405180910390f35b3480156109bb575f80fd5b506109d660048036038101906109d19190614714565b6124fa565b005b3480156109e3575f80fd5b506109ec612591565b6040516109f991906142ec565b60405180910390f35b348015610a0d575f80fd5b50610a286004803603810190610a2391906145ae565b612597565b604051610a359190614250565b60405180910390f35b348015610a49575f80fd5b50610a646004803603810190610a5f9190614389565b6125c1565b005b348015610a71575f80fd5b50610a7a612765565b604051610a8791906142ec565b60405180910390f35b60018054610a9d90614788565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac990614788565b8015610b145780601f10610aeb57610100808354040283529160200191610b14565b820191905f5260205f20905b815481529060010190602001808311610af757829003601f168201915b505050505081565b6009602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6008548211158015610b5e57505f82115b15610d46575f600c5f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610c555750600a5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15610c8c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360095f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610d3891906142ec565b60405180910390a350610e29565b8160075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610e2091906142ec565b60405180910390a35b6001905092915050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610eb7576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060178190555060196017541115610f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efb90614802565b60405180910390fd5b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60045481565b60085481116115da57600c5f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610fcf576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611034576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156110f25750600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561115a575060095f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15611191576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f5460065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546111df919061484d565b92505081905550600f5460065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254019250508190555081600c5f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060095f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061133f919061484d565b815481106113505761134f614880565b5b905f5260205f200154905080600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600e5f8581526020019081526020015f2054815481106113bc576113bb614880565b5b905f5260205f200181905550600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480611415576114146148ad565b5b600190038181905f5260205f20015f90559055600e5f8381526020019081526020015f2054600e5f8381526020019081526020015f2081905550600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f90919091909150556001600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506114fd919061484d565b600e5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487600f546040516115cc91906142ec565b60405180910390a350611714565b5f60075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611706578181611689919061484d565b60075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b61171184848461276b565b50505b505050565b601560039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035f9054906101000a900460ff1681565b601c602052805f5260405f205f915054906101000a900460ff1681565b611779838383610f31565b5f8273ffffffffffffffffffffffffffffffffffffffff163b14158015611861575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b81526004016117ff9392919061490d565b6020604051808303815f875af115801561181b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061183f91906149aa565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611898576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611921576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806016819055506019601654111561196e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196590614802565b60405180910390fd5b50565b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60155f9054906101000a900460ff1681565b60085481565b60165481565b601b602052805f5260405f205f915054906101000a900460ff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a55576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f600c5f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b46576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bcf576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b60185481565b601560029054906101000a900460ff1681565b6006602052805f5260405f205f915090505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cd9576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611dfa576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60155f6101000a81548160ff0219169083151502179055506001905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60028054611e4e90614788565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7a90614788565b8015611ec55780601f10611e9c57610100808354040283529160200191611ec5565b820191905f5260205f20905b815481529060010190602001808311611ea857829003601f168201915b505050505081565b600b602052805f5260405f205f915054906101000a900460ff1681565b80600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fd69190614250565b60405180910390a35050565b5f611fee33848461276b565b905092915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6040518060400160405280600d81526020017f54726164696e6720546f6b656e00000000000000000000000000000000000000815250805190602001206040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152508051906020012046306040516020016120a89594939291906149e4565b6040516020818303038152906040528051906020012090505f7f7dfdbf06c6260804b81338506aa4a709bd9f04b68ca0d2d054b8627926c90ae46040518060400160405280600e81526020017f456e61626c652054726164696e67000000000000000000000000000000000000815250805190602001205f60405160200161213293929190614a35565b6040516020818303038152906040528051906020012090505f828260405160200161215e929190614ade565b6040516020818303038152906040528051906020012090505f6001828888886040515f81526020016040526040516121999493929190614b14565b6020604051602081039080840390855afa1580156121b9573d5f803e3d5ffd5b5050506020604051035190506121cd611e1a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461223a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223190614ba1565b60405180910390fd5b6001601560016101000a81548160ff0219169083151502179055506001601560026101000a81548160ff02191690831515021790555050505050505050565b601d602052805f5260405f205f915054906101000a900460ff1681565b6122a1858585610f31565b5f8473ffffffffffffffffffffffffffffffffffffffff163b1415801561238d575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b815260040161232b959493929190614beb565b6020604051808303815f875af1158015612347573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061236b91906149aa565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b156123c4576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b601560019054906101000a900460ff1681565b60055481565b60125481565b60605f601080546123fa90614788565b9050116124155760405180602001604052805f815250612441565b601061242083613273565b604051602001612431929190614d1f565b6040516020818303038152906040525b9050919050565b60175481565b6010805461245b90614788565b80601f016020809104026020016040519081016040528092919081815260200182805461248790614788565b80156124d25780601f106124a9576101008083540402835291602001916124d2565b820191905f5260205f20905b8154815290600101906020018083116124b557829003601f168201915b505050505081565b6007602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461257e576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806010908161258d9190614ed3565b5050565b60145481565b600a602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612645576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036126aa576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b60135481565b5f8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036127da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d190615012565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283f906150a0565b60405180910390fd5b601a5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156128d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c990615108565b60405180910390fd5b601a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561295c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295390615170565b60405180910390fd5b5f820361296c576001905061326c565b60155f9054906101000a900460ff1615612eb957612988611e1a565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156129f657506129c6611e1a565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612a2e57505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612a68575061dead73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612a80575060195f9054906101000a900460ff16155b15612eb857601560019054906101000a900460ff16612b7457601b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612b345750601b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b612b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6a906151d8565b60405180910390fd5b5b601d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612c115750601c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612ced57601254821115612c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5290615266565b60405180910390fd5b60135460065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205483612ca79190615284565b1115612ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cdf90615301565b60405180910390fd5b612eb7565b601d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612d8a5750601c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612dd957601254821115612dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcb9061538f565b60405180910390fd5b612eb6565b601c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16612eb55760135460065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205483612e739190615284565b1115612eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eab90615301565b60405180910390fd5b5b5b5b5b5b5f60145460065f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410159050808015612f185750601560029054906101000a900460ff165b8015612f30575060195f9054906101000a900460ff16155b8015612f835750601d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612fd65750601b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156130295750601b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561306a57600160195f6101000a81548160ff02191690831515021790555061305061333d565b5f60195f6101000a81548160ff0219169083151502179055505b5f60195f9054906101000a900460ff16159050601b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806131185750601b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15613121575f90505b5f811561325b57601d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561317f57505f601754115b156131a55760646017548661319491906153ad565b61319e919061541b565b905061321f565b601d5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156131fc57505f601654115b1561321e5760646016548661321191906153ad565b61321b919061541b565b90505b5b8060185f8282546132309190615284565b925050819055505f81111561325a5761324a873083613460565b508085613257919061484d565b94505b5b613266878787613460565b93505050505b9392505050565b60605f6001613281846137a0565b0190505f8167ffffffffffffffff81111561329f5761329e6145f0565b5b6040519080825280601f01601f1916602001820160405280156132d15781602001600182028036833780820191505090505b5090505f82602001820190505b600115613332578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581613327576133266153ee565b5b0494505f85036132de575b819350505050919050565b5f8060065f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f81148061338e57505f601854145b1561339a57505061345e565b601480546133a891906153ad565b8111156133c057601480546133bd91906153ad565b90505b6133c9816138f1565b5f601881905550601560039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161341690615475565b5f6040518083038185875af1925050503d805f8114613450576040519150601f19603f3d011682016040523d82523d5f602084013e613455565b606091505b50508092505050505b565b5f8060065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508360065f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461352f919061484d565b925050819055508360065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16613657575f600f5460065f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461361a919061541b565b600f5484613628919061541b565b613632919061484d565b90505f5b818110156136545761364788613b96565b8080600101915050613636565b50505b600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661372e575f600f54826136b4919061541b565b600f5460065f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546136ff919061541b565b613709919061484d565b90505f5b8181101561372b5761371e87613ddb565b808060010191505061370d565b50505b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878660405161378b91906142ec565b60405180910390a36001925050509392505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106137fc577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816137f2576137f16153ee565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613839576d04ee2d6d415b85acef8100000000838161382f5761382e6153ee565b5b0492506020810190505b662386f26fc10000831061386857662386f26fc10000838161385e5761385d6153ee565b5b0492506010810190505b6305f5e1008310613891576305f5e1008381613887576138866153ee565b5b0492506008810190505b61271083106138b65761271083816138ac576138ab6153ee565b5b0492506004810190505b606483106138d957606483816138cf576138ce6153ee565b5b0492506002810190505b600a83106138e8576001810190505b80915050919050565b5f600267ffffffffffffffff81111561390d5761390c6145f0565b5b60405190808252806020026020018201604052801561393b5781602001602082028036833780820191505090505b50905030815f8151811061395257613951614880565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139f5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a19919061549d565b81600181518110613a2d57613a2c614880565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508160075f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401613b659594939291906155b8565b5f604051808303815f87803b158015613b7c575f80fd5b505af1158015613b8e573d5f803e3d5ffd5b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613bfb576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050613c86919061484d565b81548110613c9757613c96614880565b5b905f5260205f2001549050600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480613cef57613cee6148ad565b5b600190038181905f5260205f20015f90559055600e5f8281526020019081526020015f205f9055600c5f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560095f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613e40576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085f81548092919060010191905055505f60085490505f73ffffffffffffffffffffffffffffffffffffffff16600c5f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613eec576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600c5f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f90919091909150556001600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050613fe9919061484d565b600e5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015614094578082015181840152602081019050614079565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6140b98261405d565b6140c38185614067565b93506140d3818560208601614077565b6140dc8161409f565b840191505092915050565b5f6020820190508181035f8301526140ff81846140af565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b61412a81614118565b8114614134575f80fd5b50565b5f8135905061414581614121565b92915050565b5f602082840312156141605761415f614110565b5b5f61416d84828501614137565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61419f82614176565b9050919050565b6141af81614195565b82525050565b5f6020820190506141c85f8301846141a6565b92915050565b6141d781614195565b81146141e1575f80fd5b50565b5f813590506141f2816141ce565b92915050565b5f806040838503121561420e5761420d614110565b5b5f61421b858286016141e4565b925050602061422c85828601614137565b9150509250929050565b5f8115159050919050565b61424a81614236565b82525050565b5f6020820190506142635f830184614241565b92915050565b5f819050919050565b5f61428c61428761428284614176565b614269565b614176565b9050919050565b5f61429d82614272565b9050919050565b5f6142ae82614293565b9050919050565b6142be816142a4565b82525050565b5f6020820190506142d75f8301846142b5565b92915050565b6142e681614118565b82525050565b5f6020820190506142ff5f8301846142dd565b92915050565b5f805f6060848603121561431c5761431b614110565b5b5f614329868287016141e4565b935050602061433a868287016141e4565b925050604061434b86828701614137565b9150509250925092565b5f60ff82169050919050565b61436a81614355565b82525050565b5f6020820190506143835f830184614361565b92915050565b5f6020828403121561439e5761439d614110565b5b5f6143ab848285016141e4565b91505092915050565b6143bd81614236565b81146143c7575f80fd5b50565b5f813590506143d8816143b4565b92915050565b5f80604083850312156143f4576143f3614110565b5b5f614401858286016141e4565b9250506020614412858286016143ca565b9150509250929050565b61442581614355565b811461442f575f80fd5b50565b5f813590506144408161441c565b92915050565b5f819050919050565b61445881614446565b8114614462575f80fd5b50565b5f813590506144738161444f565b92915050565b5f805f606084860312156144905761448f614110565b5b5f61449d86828701614432565b93505060206144ae86828701614465565b92505060406144bf86828701614465565b9150509250925092565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126144ea576144e96144c9565b5b8235905067ffffffffffffffff811115614507576145066144cd565b5b602083019150836001820283011115614523576145226144d1565b5b9250929050565b5f805f805f6080868803121561454357614542614110565b5b5f614550888289016141e4565b9550506020614561888289016141e4565b945050604061457288828901614137565b935050606086013567ffffffffffffffff81111561459357614592614114565b5b61459f888289016144d5565b92509250509295509295909350565b5f80604083850312156145c4576145c3614110565b5b5f6145d1858286016141e4565b92505060206145e2858286016141e4565b9150509250929050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6146268261409f565b810181811067ffffffffffffffff82111715614645576146446145f0565b5b80604052505050565b5f614657614107565b9050614663828261461d565b919050565b5f67ffffffffffffffff821115614682576146816145f0565b5b61468b8261409f565b9050602081019050919050565b828183375f83830152505050565b5f6146b86146b384614668565b61464e565b9050828152602081018484840111156146d4576146d36145ec565b5b6146df848285614698565b509392505050565b5f82601f8301126146fb576146fa6144c9565b5b813561470b8482602086016146a6565b91505092915050565b5f6020828403121561472957614728614110565b5b5f82013567ffffffffffffffff81111561474657614745614114565b5b614752848285016146e7565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061479f57607f821691505b6020821081036147b2576147b161475b565b5b50919050565b7f4d757374206b656570206665657320617420323525206f72206c6573730000005f82015250565b5f6147ec601d83614067565b91506147f7826147b8565b602082019050919050565b5f6020820190508181035f830152614819816147e0565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61485782614118565b915061486283614118565b925082820390508181111561487a57614879614820565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82825260208201905092915050565b50565b5f6148f85f836148da565b9150614903826148ea565b5f82019050919050565b5f6080820190506149205f8301866141a6565b61492d60208301856141a6565b61493a60408301846142dd565b818103606083015261494b816148ed565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61498981614955565b8114614993575f80fd5b50565b5f815190506149a481614980565b92915050565b5f602082840312156149bf576149be614110565b5b5f6149cc84828501614996565b91505092915050565b6149de81614446565b82525050565b5f60a0820190506149f75f8301886149d5565b614a0460208301876149d5565b614a1160408301866149d5565b614a1e60608301856142dd565b614a2b60808301846141a6565b9695505050505050565b5f606082019050614a485f8301866149d5565b614a5560208301856149d5565b614a6260408301846142dd565b949350505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f614aa8600283614a6a565b9150614ab382614a74565b600282019050919050565b5f819050919050565b614ad8614ad382614446565b614abe565b82525050565b5f614ae882614a9c565b9150614af48285614ac7565b602082019150614b048284614ac7565b6020820191508190509392505050565b5f608082019050614b275f8301876149d5565b614b346020830186614361565b614b4160408301856149d5565b614b4e60608301846149d5565b95945050505050565b7f496e76616c6964207369676e61747572650000000000000000000000000000005f82015250565b5f614b8b601183614067565b9150614b9682614b57565b602082019050919050565b5f6020820190508181035f830152614bb881614b7f565b9050919050565b5f614bca83856148da565b9350614bd7838584614698565b614be08361409f565b840190509392505050565b5f608082019050614bfe5f8301886141a6565b614c0b60208301876141a6565b614c1860408301866142dd565b8181036060830152614c2b818486614bbf565b90509695505050505050565b5f819050815f5260205f209050919050565b5f8154614c5581614788565b614c5f8186614a6a565b9450600182165f8114614c795760018114614c8e57614cc0565b60ff1983168652811515820286019350614cc0565b614c9785614c37565b5f5b83811015614cb857815481890152600182019150602081019050614c99565b838801955050505b50505092915050565b5f614cd38261405d565b614cdd8185614a6a565b9350614ced818560208601614077565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815250565b5f614d2a8285614c49565b9150614d368284614cc9565b9150614d4182614cf9565b6005820191508190509392505050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614d9b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614d60565b614da58683614d60565b95508019841693508086168417925050509392505050565b5f614dd7614dd2614dcd84614118565b614269565b614118565b9050919050565b5f819050919050565b614df083614dbd565b614e04614dfc82614dde565b848454614d6c565b825550505050565b5f90565b614e18614e0c565b614e23818484614de7565b505050565b5b81811015614e4657614e3b5f82614e10565b600181019050614e29565b5050565b601f821115614e8b57614e5c81614c37565b614e6584614d51565b81016020851015614e74578190505b614e88614e8085614d51565b830182614e28565b50505b505050565b5f82821c905092915050565b5f614eab5f1984600802614e90565b1980831691505092915050565b5f614ec38383614e9c565b9150826002028217905092915050565b614edc8261405d565b67ffffffffffffffff811115614ef557614ef46145f0565b5b614eff8254614788565b614f0a828285614e4a565b5f60209050601f831160018114614f3b575f8415614f29578287015190505b614f338582614eb8565b865550614f9a565b601f198416614f4986614c37565b5f5b82811015614f7057848901518255600182019150602085019450602081019050614f4b565b86831015614f8d5784890151614f89601f891682614e9c565b8355505b6001600288020188555050505b505050505050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f614ffc602583614067565b915061500782614fa2565b604082019050919050565b5f6020820190508181035f83015261502981614ff0565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f61508a602383614067565b915061509582615030565b604082019050919050565b5f6020820190508181035f8301526150b78161507e565b9050919050565b7f5b66726f6d5d20626c61636b206c6973740000000000000000000000000000005f82015250565b5f6150f2601183614067565b91506150fd826150be565b602082019050919050565b5f6020820190508181035f83015261511f816150e6565b9050919050565b7f5b746f5d20626c61636b206c69737400000000000000000000000000000000005f82015250565b5f61515a600f83614067565b915061516582615126565b602082019050919050565b5f6020820190508181035f8301526151878161514e565b9050919050565b7f54726164696e67206973206e6f74206163746976652e000000000000000000005f82015250565b5f6151c2601683614067565b91506151cd8261518e565b602082019050919050565b5f6020820190508181035f8301526151ef816151b6565b9050919050565b7f427579207472616e7366657220616d6f756e74206578636565647320746865205f8201527f6d6178207472616e73616374696f6e2073697a652e0000000000000000000000602082015250565b5f615250603583614067565b915061525b826151f6565b604082019050919050565b5f6020820190508181035f83015261527d81615244565b9050919050565b5f61528e82614118565b915061529983614118565b92508282019050808211156152b1576152b0614820565b5b92915050565b7f4d61782077616c6c6574206578636565646564000000000000000000000000005f82015250565b5f6152eb601383614067565b91506152f6826152b7565b602082019050919050565b5f6020820190508181035f830152615318816152df565b9050919050565b7f53656c6c207472616e7366657220616d6f756e742065786365656473207468655f8201527f206d6178207472616e73616374696f6e2073697a652e00000000000000000000602082015250565b5f615379603683614067565b91506153848261531f565b604082019050919050565b5f6020820190508181035f8301526153a68161536d565b9050919050565b5f6153b782614118565b91506153c283614118565b92508282026153d081614118565b915082820484148315176153e7576153e6614820565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61542582614118565b915061543083614118565b9250826154405761543f6153ee565b5b828204905092915050565b5f81905092915050565b5f6154605f8361544b565b915061546b826148ea565b5f82019050919050565b5f61547f82615455565b9150819050919050565b5f81519050615497816141ce565b92915050565b5f602082840312156154b2576154b1614110565b5b5f6154bf84828501615489565b91505092915050565b5f819050919050565b5f6154eb6154e66154e1846154c8565b614269565b614118565b9050919050565b6154fb816154d1565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61553381614195565b82525050565b5f615544838361552a565b60208301905092915050565b5f602082019050919050565b5f61556682615501565b615570818561550b565b935061557b8361551b565b805f5b838110156155ab5781516155928882615539565b975061559d83615550565b92505060018101905061557e565b5085935050505092915050565b5f60a0820190506155cb5f8301886142dd565b6155d860208301876154f2565b81810360408301526155ea818661555c565b90506155f960608301856141a6565b61560660808301846142dd565b969550505050505056fea264697066735822122013e8e54c363b8001ba48e77cf4d520642026879025b392e73c4dd20046dbd29f64736f6c63430008180033

Deployed Bytecode

0x608060405260043610610275575f3560e01c806370a082311161014e578063bbc0c742116100c0578063dd62ed3e11610079578063dd62ed3e14610974578063e0df5b6f146109b0578063e2f45605146109d8578063e985e9c514610a02578063f2fde38b14610a3e578063f8b45b0514610a665761027c565b8063bbc0c74214610866578063c2930f9114610890578063c3f70b52146108ba578063c87b56dd146108e4578063cc1776d314610920578063d547cfb71461094a5761027c565b80639b19251a116101125780639b19251a1461073a578063a22cb46514610776578063a9059cbb1461079e578063a90eab8c146107da578063b62496f514610802578063b88d4fde1461083e5761027c565b806370a082311461066a578063715018a6146106a6578063751039fc146106bc5780638da5cb5b146106e657806395d89b41146107105761027c565b8063436d3340116101e75780634fbee193116101ab5780634fbee1931461054e57806353d6fd591461058a5780636352211e146105b257806368092bd9146105ee5780636d7adcad146106165780636ddd1713146106405761027c565b8063436d33401461047e57806349bd5a5e146104a65780634a62bb65146104d05780634f02c420146104fa5780634f7041a5146105245761027c565b806318160ddd1161023957806318160ddd1461037457806323b872dd1461039e5780632dc0562d146103c6578063313ce567146103f057806331f4ee031461041a57806342842e0e146104565761027c565b806306fdde0314610280578063081812fc146102aa578063095ea7b3146102e657806312185a39146103225780631694505e1461034a5761027c565b3661027c57005b5f80fd5b34801561028b575f80fd5b50610294610a90565b6040516102a191906140e7565b60405180910390f35b3480156102b5575f80fd5b506102d060048036038101906102cb919061414b565b610b1c565b6040516102dd91906141b5565b60405180910390f35b3480156102f1575f80fd5b5061030c600480360381019061030791906141f8565b610b4c565b6040516103199190614250565b60405180910390f35b34801561032d575f80fd5b506103486004803603810190610343919061414b565b610e33565b005b348015610355575f80fd5b5061035e610f07565b60405161036b91906142c4565b60405180910390f35b34801561037f575f80fd5b50610388610f2b565b60405161039591906142ec565b60405180910390f35b3480156103a9575f80fd5b506103c460048036038101906103bf9190614305565b610f31565b005b3480156103d1575f80fd5b506103da611719565b6040516103e791906141b5565b60405180910390f35b3480156103fb575f80fd5b5061040461173f565b6040516104119190614370565b60405180910390f35b348015610425575f80fd5b50610440600480360381019061043b9190614389565b611751565b60405161044d9190614250565b60405180910390f35b348015610461575f80fd5b5061047c60048036038101906104779190614305565b61176e565b005b348015610489575f80fd5b506104a4600480360381019061049f919061414b565b61189d565b005b3480156104b1575f80fd5b506104ba611971565b6040516104c791906141b5565b60405180910390f35b3480156104db575f80fd5b506104e4611996565b6040516104f19190614250565b60405180910390f35b348015610505575f80fd5b5061050e6119a8565b60405161051b91906142ec565b60405180910390f35b34801561052f575f80fd5b506105386119ae565b60405161054591906142ec565b60405180910390f35b348015610559575f80fd5b50610574600480360381019061056f9190614389565b6119b4565b6040516105819190614250565b60405180910390f35b348015610595575f80fd5b506105b060048036038101906105ab91906143de565b6119d1565b005b3480156105bd575f80fd5b506105d860048036038101906105d3919061414b565b611aad565b6040516105e591906141b5565b60405180910390f35b3480156105f9575f80fd5b50610614600480360381019061060f91906143de565b611b4b565b005b348015610621575f80fd5b5061062a611c27565b60405161063791906142ec565b60405180910390f35b34801561064b575f80fd5b50610654611c2d565b6040516106619190614250565b60405180910390f35b348015610675575f80fd5b50610690600480360381019061068b9190614389565b611c40565b60405161069d91906142ec565b60405180910390f35b3480156106b1575f80fd5b506106ba611c55565b005b3480156106c7575f80fd5b506106d0611d74565b6040516106dd9190614250565b60405180910390f35b3480156106f1575f80fd5b506106fa611e1a565b60405161070791906141b5565b60405180910390f35b34801561071b575f80fd5b50610724611e41565b60405161073191906140e7565b60405180910390f35b348015610745575f80fd5b50610760600480360381019061075b9190614389565b611ecd565b60405161076d9190614250565b60405180910390f35b348015610781575f80fd5b5061079c600480360381019061079791906143de565b611eea565b005b3480156107a9575f80fd5b506107c460048036038101906107bf91906141f8565b611fe2565b6040516107d19190614250565b60405180910390f35b3480156107e5575f80fd5b5061080060048036038101906107fb9190614479565b611ff6565b005b34801561080d575f80fd5b5061082860048036038101906108239190614389565b612279565b6040516108359190614250565b60405180910390f35b348015610849575f80fd5b50610864600480360381019061085f919061452a565b612296565b005b348015610871575f80fd5b5061087a6123cb565b6040516108879190614250565b60405180910390f35b34801561089b575f80fd5b506108a46123de565b6040516108b191906142ec565b60405180910390f35b3480156108c5575f80fd5b506108ce6123e4565b6040516108db91906142ec565b60405180910390f35b3480156108ef575f80fd5b5061090a6004803603810190610905919061414b565b6123ea565b60405161091791906140e7565b60405180910390f35b34801561092b575f80fd5b50610934612448565b60405161094191906142ec565b60405180910390f35b348015610955575f80fd5b5061095e61244e565b60405161096b91906140e7565b60405180910390f35b34801561097f575f80fd5b5061099a600480360381019061099591906145ae565b6124da565b6040516109a791906142ec565b60405180910390f35b3480156109bb575f80fd5b506109d660048036038101906109d19190614714565b6124fa565b005b3480156109e3575f80fd5b506109ec612591565b6040516109f991906142ec565b60405180910390f35b348015610a0d575f80fd5b50610a286004803603810190610a2391906145ae565b612597565b604051610a359190614250565b60405180910390f35b348015610a49575f80fd5b50610a646004803603810190610a5f9190614389565b6125c1565b005b348015610a71575f80fd5b50610a7a612765565b604051610a8791906142ec565b60405180910390f35b60018054610a9d90614788565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac990614788565b8015610b145780601f10610aeb57610100808354040283529160200191610b14565b820191905f5260205f20905b815481529060010190602001808311610af757829003601f168201915b505050505081565b6009602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6008548211158015610b5e57505f82115b15610d46575f600c5f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610c555750600a5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15610c8c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360095f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610d3891906142ec565b60405180910390a350610e29565b8160075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610e2091906142ec565b60405180910390a35b6001905092915050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610eb7576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060178190555060196017541115610f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efb90614802565b60405180910390fd5b50565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b60045481565b60085481116115da57600c5f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610fcf576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611034576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156110f25750600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561115a575060095f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15611191576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f5460065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546111df919061484d565b92505081905550600f5460065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254019250508190555081600c5f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060095f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061133f919061484d565b815481106113505761134f614880565b5b905f5260205f200154905080600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600e5f8581526020019081526020015f2054815481106113bc576113bb614880565b5b905f5260205f200181905550600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480611415576114146148ad565b5b600190038181905f5260205f20015f90559055600e5f8381526020019081526020015f2054600e5f8381526020019081526020015f2081905550600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f90919091909150556001600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506114fd919061484d565b600e5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487600f546040516115cc91906142ec565b60405180910390a350611714565b5f60075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611706578181611689919061484d565b60075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b61171184848461276b565b50505b505050565b601560039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035f9054906101000a900460ff1681565b601c602052805f5260405f205f915054906101000a900460ff1681565b611779838383610f31565b5f8273ffffffffffffffffffffffffffffffffffffffff163b14158015611861575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b81526004016117ff9392919061490d565b6020604051808303815f875af115801561181b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061183f91906149aa565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611898576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611921576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806016819055506019601654111561196e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196590614802565b60405180910390fd5b50565b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60155f9054906101000a900460ff1681565b60085481565b60165481565b601b602052805f5260405f205f915054906101000a900460ff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a55576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f600c5f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b46576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bcf576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b60185481565b601560029054906101000a900460ff1681565b6006602052805f5260405f205f915090505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cd9576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611dfa576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60155f6101000a81548160ff0219169083151502179055506001905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60028054611e4e90614788565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7a90614788565b8015611ec55780601f10611e9c57610100808354040283529160200191611ec5565b820191905f5260205f20905b815481529060010190602001808311611ea857829003601f168201915b505050505081565b600b602052805f5260405f205f915054906101000a900460ff1681565b80600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fd69190614250565b60405180910390a35050565b5f611fee33848461276b565b905092915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6040518060400160405280600d81526020017f54726164696e6720546f6b656e00000000000000000000000000000000000000815250805190602001206040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152508051906020012046306040516020016120a89594939291906149e4565b6040516020818303038152906040528051906020012090505f7f7dfdbf06c6260804b81338506aa4a709bd9f04b68ca0d2d054b8627926c90ae46040518060400160405280600e81526020017f456e61626c652054726164696e67000000000000000000000000000000000000815250805190602001205f60405160200161213293929190614a35565b6040516020818303038152906040528051906020012090505f828260405160200161215e929190614ade565b6040516020818303038152906040528051906020012090505f6001828888886040515f81526020016040526040516121999493929190614b14565b6020604051602081039080840390855afa1580156121b9573d5f803e3d5ffd5b5050506020604051035190506121cd611e1a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461223a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223190614ba1565b60405180910390fd5b6001601560016101000a81548160ff0219169083151502179055506001601560026101000a81548160ff02191690831515021790555050505050505050565b601d602052805f5260405f205f915054906101000a900460ff1681565b6122a1858585610f31565b5f8473ffffffffffffffffffffffffffffffffffffffff163b1415801561238d575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b815260040161232b959493929190614beb565b6020604051808303815f875af1158015612347573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061236b91906149aa565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b156123c4576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b601560019054906101000a900460ff1681565b60055481565b60125481565b60605f601080546123fa90614788565b9050116124155760405180602001604052805f815250612441565b601061242083613273565b604051602001612431929190614d1f565b6040516020818303038152906040525b9050919050565b60175481565b6010805461245b90614788565b80601f016020809104026020016040519081016040528092919081815260200182805461248790614788565b80156124d25780601f106124a9576101008083540402835291602001916124d2565b820191905f5260205f20905b8154815290600101906020018083116124b557829003601f168201915b505050505081565b6007602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461257e576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806010908161258d9190614ed3565b5050565b60145481565b600a602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612645576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036126aa576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b60135481565b5f8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036127da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d190615012565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283f906150a0565b60405180910390fd5b601a5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156128d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c990615108565b60405180910390fd5b601a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561295c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295390615170565b60405180910390fd5b5f820361296c576001905061326c565b60155f9054906101000a900460ff1615612eb957612988611e1a565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156129f657506129c6611e1a565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612a2e57505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612a68575061dead73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612a80575060195f9054906101000a900460ff16155b15612eb857601560019054906101000a900460ff16612b7457601b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612b345750601b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b612b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6a906151d8565b60405180910390fd5b5b601d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612c115750601c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612ced57601254821115612c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5290615266565b60405180910390fd5b60135460065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205483612ca79190615284565b1115612ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cdf90615301565b60405180910390fd5b612eb7565b601d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612d8a5750601c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612dd957601254821115612dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcb9061538f565b60405180910390fd5b612eb6565b601c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16612eb55760135460065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205483612e739190615284565b1115612eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eab90615301565b60405180910390fd5b5b5b5b5b5b5f60145460065f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410159050808015612f185750601560029054906101000a900460ff165b8015612f30575060195f9054906101000a900460ff16155b8015612f835750601d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612fd65750601b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156130295750601b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561306a57600160195f6101000a81548160ff02191690831515021790555061305061333d565b5f60195f6101000a81548160ff0219169083151502179055505b5f60195f9054906101000a900460ff16159050601b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806131185750601b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15613121575f90505b5f811561325b57601d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561317f57505f601754115b156131a55760646017548661319491906153ad565b61319e919061541b565b905061321f565b601d5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156131fc57505f601654115b1561321e5760646016548661321191906153ad565b61321b919061541b565b90505b5b8060185f8282546132309190615284565b925050819055505f81111561325a5761324a873083613460565b508085613257919061484d565b94505b5b613266878787613460565b93505050505b9392505050565b60605f6001613281846137a0565b0190505f8167ffffffffffffffff81111561329f5761329e6145f0565b5b6040519080825280601f01601f1916602001820160405280156132d15781602001600182028036833780820191505090505b5090505f82602001820190505b600115613332578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581613327576133266153ee565b5b0494505f85036132de575b819350505050919050565b5f8060065f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f81148061338e57505f601854145b1561339a57505061345e565b601480546133a891906153ad565b8111156133c057601480546133bd91906153ad565b90505b6133c9816138f1565b5f601881905550601560039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161341690615475565b5f6040518083038185875af1925050503d805f8114613450576040519150601f19603f3d011682016040523d82523d5f602084013e613455565b606091505b50508092505050505b565b5f8060065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508360065f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461352f919061484d565b925050819055508360065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16613657575f600f5460065f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461361a919061541b565b600f5484613628919061541b565b613632919061484d565b90505f5b818110156136545761364788613b96565b8080600101915050613636565b50505b600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661372e575f600f54826136b4919061541b565b600f5460065f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546136ff919061541b565b613709919061484d565b90505f5b8181101561372b5761371e87613ddb565b808060010191505061370d565b50505b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878660405161378b91906142ec565b60405180910390a36001925050509392505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106137fc577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816137f2576137f16153ee565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613839576d04ee2d6d415b85acef8100000000838161382f5761382e6153ee565b5b0492506020810190505b662386f26fc10000831061386857662386f26fc10000838161385e5761385d6153ee565b5b0492506010810190505b6305f5e1008310613891576305f5e1008381613887576138866153ee565b5b0492506008810190505b61271083106138b65761271083816138ac576138ab6153ee565b5b0492506004810190505b606483106138d957606483816138cf576138ce6153ee565b5b0492506002810190505b600a83106138e8576001810190505b80915050919050565b5f600267ffffffffffffffff81111561390d5761390c6145f0565b5b60405190808252806020026020018201604052801561393b5781602001602082028036833780820191505090505b50905030815f8151811061395257613951614880565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139f5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a19919061549d565b81600181518110613a2d57613a2c614880565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508160075f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401613b659594939291906155b8565b5f604051808303815f87803b158015613b7c575f80fd5b505af1158015613b8e573d5f803e3d5ffd5b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613bfb576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050613c86919061484d565b81548110613c9757613c96614880565b5b905f5260205f2001549050600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480613cef57613cee6148ad565b5b600190038181905f5260205f20015f90559055600e5f8281526020019081526020015f205f9055600c5f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560095f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613e40576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085f81548092919060010191905055505f60085490505f73ffffffffffffffffffffffffffffffffffffffff16600c5f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613eec576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600c5f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f90919091909150556001600d5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050613fe9919061484d565b600e5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015614094578082015181840152602081019050614079565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6140b98261405d565b6140c38185614067565b93506140d3818560208601614077565b6140dc8161409f565b840191505092915050565b5f6020820190508181035f8301526140ff81846140af565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b61412a81614118565b8114614134575f80fd5b50565b5f8135905061414581614121565b92915050565b5f602082840312156141605761415f614110565b5b5f61416d84828501614137565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61419f82614176565b9050919050565b6141af81614195565b82525050565b5f6020820190506141c85f8301846141a6565b92915050565b6141d781614195565b81146141e1575f80fd5b50565b5f813590506141f2816141ce565b92915050565b5f806040838503121561420e5761420d614110565b5b5f61421b858286016141e4565b925050602061422c85828601614137565b9150509250929050565b5f8115159050919050565b61424a81614236565b82525050565b5f6020820190506142635f830184614241565b92915050565b5f819050919050565b5f61428c61428761428284614176565b614269565b614176565b9050919050565b5f61429d82614272565b9050919050565b5f6142ae82614293565b9050919050565b6142be816142a4565b82525050565b5f6020820190506142d75f8301846142b5565b92915050565b6142e681614118565b82525050565b5f6020820190506142ff5f8301846142dd565b92915050565b5f805f6060848603121561431c5761431b614110565b5b5f614329868287016141e4565b935050602061433a868287016141e4565b925050604061434b86828701614137565b9150509250925092565b5f60ff82169050919050565b61436a81614355565b82525050565b5f6020820190506143835f830184614361565b92915050565b5f6020828403121561439e5761439d614110565b5b5f6143ab848285016141e4565b91505092915050565b6143bd81614236565b81146143c7575f80fd5b50565b5f813590506143d8816143b4565b92915050565b5f80604083850312156143f4576143f3614110565b5b5f614401858286016141e4565b9250506020614412858286016143ca565b9150509250929050565b61442581614355565b811461442f575f80fd5b50565b5f813590506144408161441c565b92915050565b5f819050919050565b61445881614446565b8114614462575f80fd5b50565b5f813590506144738161444f565b92915050565b5f805f606084860312156144905761448f614110565b5b5f61449d86828701614432565b93505060206144ae86828701614465565b92505060406144bf86828701614465565b9150509250925092565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126144ea576144e96144c9565b5b8235905067ffffffffffffffff811115614507576145066144cd565b5b602083019150836001820283011115614523576145226144d1565b5b9250929050565b5f805f805f6080868803121561454357614542614110565b5b5f614550888289016141e4565b9550506020614561888289016141e4565b945050604061457288828901614137565b935050606086013567ffffffffffffffff81111561459357614592614114565b5b61459f888289016144d5565b92509250509295509295909350565b5f80604083850312156145c4576145c3614110565b5b5f6145d1858286016141e4565b92505060206145e2858286016141e4565b9150509250929050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6146268261409f565b810181811067ffffffffffffffff82111715614645576146446145f0565b5b80604052505050565b5f614657614107565b9050614663828261461d565b919050565b5f67ffffffffffffffff821115614682576146816145f0565b5b61468b8261409f565b9050602081019050919050565b828183375f83830152505050565b5f6146b86146b384614668565b61464e565b9050828152602081018484840111156146d4576146d36145ec565b5b6146df848285614698565b509392505050565b5f82601f8301126146fb576146fa6144c9565b5b813561470b8482602086016146a6565b91505092915050565b5f6020828403121561472957614728614110565b5b5f82013567ffffffffffffffff81111561474657614745614114565b5b614752848285016146e7565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061479f57607f821691505b6020821081036147b2576147b161475b565b5b50919050565b7f4d757374206b656570206665657320617420323525206f72206c6573730000005f82015250565b5f6147ec601d83614067565b91506147f7826147b8565b602082019050919050565b5f6020820190508181035f830152614819816147e0565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61485782614118565b915061486283614118565b925082820390508181111561487a57614879614820565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82825260208201905092915050565b50565b5f6148f85f836148da565b9150614903826148ea565b5f82019050919050565b5f6080820190506149205f8301866141a6565b61492d60208301856141a6565b61493a60408301846142dd565b818103606083015261494b816148ed565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61498981614955565b8114614993575f80fd5b50565b5f815190506149a481614980565b92915050565b5f602082840312156149bf576149be614110565b5b5f6149cc84828501614996565b91505092915050565b6149de81614446565b82525050565b5f60a0820190506149f75f8301886149d5565b614a0460208301876149d5565b614a1160408301866149d5565b614a1e60608301856142dd565b614a2b60808301846141a6565b9695505050505050565b5f606082019050614a485f8301866149d5565b614a5560208301856149d5565b614a6260408301846142dd565b949350505050565b5f81905092915050565b7f19010000000000000000000000000000000000000000000000000000000000005f82015250565b5f614aa8600283614a6a565b9150614ab382614a74565b600282019050919050565b5f819050919050565b614ad8614ad382614446565b614abe565b82525050565b5f614ae882614a9c565b9150614af48285614ac7565b602082019150614b048284614ac7565b6020820191508190509392505050565b5f608082019050614b275f8301876149d5565b614b346020830186614361565b614b4160408301856149d5565b614b4e60608301846149d5565b95945050505050565b7f496e76616c6964207369676e61747572650000000000000000000000000000005f82015250565b5f614b8b601183614067565b9150614b9682614b57565b602082019050919050565b5f6020820190508181035f830152614bb881614b7f565b9050919050565b5f614bca83856148da565b9350614bd7838584614698565b614be08361409f565b840190509392505050565b5f608082019050614bfe5f8301886141a6565b614c0b60208301876141a6565b614c1860408301866142dd565b8181036060830152614c2b818486614bbf565b90509695505050505050565b5f819050815f5260205f209050919050565b5f8154614c5581614788565b614c5f8186614a6a565b9450600182165f8114614c795760018114614c8e57614cc0565b60ff1983168652811515820286019350614cc0565b614c9785614c37565b5f5b83811015614cb857815481890152600182019150602081019050614c99565b838801955050505b50505092915050565b5f614cd38261405d565b614cdd8185614a6a565b9350614ced818560208601614077565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815250565b5f614d2a8285614c49565b9150614d368284614cc9565b9150614d4182614cf9565b6005820191508190509392505050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614d9b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614d60565b614da58683614d60565b95508019841693508086168417925050509392505050565b5f614dd7614dd2614dcd84614118565b614269565b614118565b9050919050565b5f819050919050565b614df083614dbd565b614e04614dfc82614dde565b848454614d6c565b825550505050565b5f90565b614e18614e0c565b614e23818484614de7565b505050565b5b81811015614e4657614e3b5f82614e10565b600181019050614e29565b5050565b601f821115614e8b57614e5c81614c37565b614e6584614d51565b81016020851015614e74578190505b614e88614e8085614d51565b830182614e28565b50505b505050565b5f82821c905092915050565b5f614eab5f1984600802614e90565b1980831691505092915050565b5f614ec38383614e9c565b9150826002028217905092915050565b614edc8261405d565b67ffffffffffffffff811115614ef557614ef46145f0565b5b614eff8254614788565b614f0a828285614e4a565b5f60209050601f831160018114614f3b575f8415614f29578287015190505b614f338582614eb8565b865550614f9a565b601f198416614f4986614c37565b5f5b82811015614f7057848901518255600182019150602085019450602081019050614f4b565b86831015614f8d5784890151614f89601f891682614e9c565b8355505b6001600288020188555050505b505050505050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f614ffc602583614067565b915061500782614fa2565b604082019050919050565b5f6020820190508181035f83015261502981614ff0565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f61508a602383614067565b915061509582615030565b604082019050919050565b5f6020820190508181035f8301526150b78161507e565b9050919050565b7f5b66726f6d5d20626c61636b206c6973740000000000000000000000000000005f82015250565b5f6150f2601183614067565b91506150fd826150be565b602082019050919050565b5f6020820190508181035f83015261511f816150e6565b9050919050565b7f5b746f5d20626c61636b206c69737400000000000000000000000000000000005f82015250565b5f61515a600f83614067565b915061516582615126565b602082019050919050565b5f6020820190508181035f8301526151878161514e565b9050919050565b7f54726164696e67206973206e6f74206163746976652e000000000000000000005f82015250565b5f6151c2601683614067565b91506151cd8261518e565b602082019050919050565b5f6020820190508181035f8301526151ef816151b6565b9050919050565b7f427579207472616e7366657220616d6f756e74206578636565647320746865205f8201527f6d6178207472616e73616374696f6e2073697a652e0000000000000000000000602082015250565b5f615250603583614067565b915061525b826151f6565b604082019050919050565b5f6020820190508181035f83015261527d81615244565b9050919050565b5f61528e82614118565b915061529983614118565b92508282019050808211156152b1576152b0614820565b5b92915050565b7f4d61782077616c6c6574206578636565646564000000000000000000000000005f82015250565b5f6152eb601383614067565b91506152f6826152b7565b602082019050919050565b5f6020820190508181035f830152615318816152df565b9050919050565b7f53656c6c207472616e7366657220616d6f756e742065786365656473207468655f8201527f206d6178207472616e73616374696f6e2073697a652e00000000000000000000602082015250565b5f615379603683614067565b91506153848261531f565b604082019050919050565b5f6020820190508181035f8301526153a68161536d565b9050919050565b5f6153b782614118565b91506153c283614118565b92508282026153d081614118565b915082820484148315176153e7576153e6614820565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61542582614118565b915061543083614118565b9250826154405761543f6153ee565b5b828204905092915050565b5f81905092915050565b5f6154605f8361544b565b915061546b826148ea565b5f82019050919050565b5f61547f82615455565b9150819050919050565b5f81519050615497816141ce565b92915050565b5f602082840312156154b2576154b1614110565b5b5f6154bf84828501615489565b91505092915050565b5f819050919050565b5f6154eb6154e66154e1846154c8565b614269565b614118565b9050919050565b6154fb816154d1565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61553381614195565b82525050565b5f615544838361552a565b60208301905092915050565b5f602082019050919050565b5f61556682615501565b615570818561550b565b935061557b8361551b565b805f5b838110156155ab5781516155928882615539565b975061559d83615550565b92505060018101905061557e565b5085935050505092915050565b5f60a0820190506155cb5f8301886142dd565b6155d860208301876154f2565b81810360408301526155ea818661555c565b90506155f960608301856141a6565b61560660808301846142dd565b969550505050505056fea264697066735822122013e8e54c363b8001ba48e77cf4d520642026879025b392e73c4dd20046dbd29f64736f6c63430008180033

Deployed Bytecode Sourcemap

29079:8545:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21810:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22107:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23342:620;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32788:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29161:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21890:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24367:1606;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29485:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21862:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29747:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26244:319;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32630:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29219:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29365:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22079:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29516;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29690:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23223:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23024:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32335:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29573:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29445:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21955:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21383:152;;;;;;;;;;;;;:::i;:::-;;32501:121;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20756:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21835:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22235:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24013:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26032:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31265:1062;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29812:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26658:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29405:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21923:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29256:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33063:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29544:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29114:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22006:64;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32949:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29323:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22160:68;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21153:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29292:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21810:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22107:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;23342:620::-;23420:4;23455:6;;23441:10;:20;;:38;;;;;23478:1;23465:10;:14;23441:38;23437:494;;;23496:13;23512:8;:20;23521:10;23512:20;;;;;;;;;;;;;;;;;;;;;23496:36;;23565:5;23551:19;;:10;:19;;;;:59;;;;;23575:16;:23;23592:5;23575:23;;;;;;;;;;;;;;;:35;23599:10;23575:35;;;;;;;;;;;;;;;;;;;;;;;;;23574:36;23551:59;23547:121;;;23638:14;;;;;;;;;;;;;;23547:121;23710:7;23684:11;:23;23696:10;23684:23;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;23753:7;23737:36;;23746:5;23737:36;;;23762:10;23737:36;;;;;;:::i;:::-;;;;;;;;23481:304;23437:494;;;23848:10;23815:9;:21;23825:10;23815:21;;;;;;;;;;;;;;;:30;23837:7;23815:30;;;;;;;;;;;;;;;:43;;;;23899:7;23878:41;;23887:10;23878:41;;;23908:10;23878:41;;;;;;:::i;:::-;;;;;;;;23437:494;23950:4;23943:11;;23342:620;;;;:::o;32788:153::-;20909:6;;;;;;;;;;20895:20;;:10;:20;;;20891:47;;20924:14;;;;;;;;;;;;;;20891:47;32864:3:::1;32854:7;:13;;;;32897:2;32886:7;;:13;;32878:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32788:153:::0;:::o;29161:51::-;;;:::o;21890:26::-;;;;:::o;24367:1606::-;24479:6;;24465:10;:20;24461:1505;;24514:8;:20;24523:10;24514:20;;;;;;;;;;;;;;;;;;;;;24506:28;;:4;:28;;;24502:91;;24562:15;;;;;;;;;;;;;;24502:91;24627:1;24613:16;;:2;:16;;;24609:82;;24657:18;;;;;;;;;;;;;;24609:82;24725:4;24711:18;;:10;:18;;;;:57;;;;;24734:16;:22;24751:4;24734:22;;;;;;;;;;;;;;;:34;24757:10;24734:34;;;;;;;;;;;;;;;;;;;;;;;;;24733:35;24711:57;:98;;;;;24786:11;:23;24798:10;24786:23;;;;;;;;;;;;;;;;;;;;;24772:37;;:10;:37;;;;24711:98;24707:160;;;24837:14;;;;;;;;;;;;;;24707:160;24902:5;;24883:9;:15;24893:4;24883:15;;;;;;;;;;;;;;;;:24;;;;;;;:::i;:::-;;;;;;;;24968:5;;24951:9;:13;24961:2;24951:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;25028:2;25005:8;:20;25014:10;25005:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;25052:11;:23;25064:10;25052:23;;;;;;;;;;;;25045:30;;;;;;;;;;;25133:17;25153:6;:12;25160:4;25153:12;;;;;;;;;;;;;;;25188:1;25166:6;:12;25173:4;25166:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;25153:37;;;;;;;;:::i;:::-;;;;;;;;;;25133:57;;25245:9;25205:6;:12;25212:4;25205:12;;;;;;;;;;;;;;;25218:11;:23;25230:10;25218:23;;;;;;;;;;;;25205:37;;;;;;;;:::i;:::-;;;;;;;;;:49;;;;25289:6;:12;25296:4;25289:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25393:11;:23;25405:10;25393:23;;;;;;;;;;;;25368:11;:22;25380:9;25368:22;;;;;;;;;;;:48;;;;25470:6;:10;25477:2;25470:10;;;;;;;;;;;;;;;25486;25470:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25600:1;25580:6;:10;25587:2;25580:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;25554:11;:23;25566:10;25554:23;;;;;;;;;;;:47;;;;25642:10;25638:2;25623:30;;25632:4;25623:30;;;;;;;;;;;;25693:2;25673:30;;25687:4;25673:30;;;25697:5;;25673:30;;;;;;:::i;:::-;;;;;;;;24487:1228;24461:1505;;;25745:15;25763:9;:15;25773:4;25763:15;;;;;;;;;;;;;;;:27;25779:10;25763:27;;;;;;;;;;;;;;;;25745:45;;25820:17;25809:7;:28;25805:101;;25896:10;25886:7;:20;;;;:::i;:::-;25856:9;:15;25866:4;25856:15;;;;;;;;;;;;;;;:27;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;29485:24::-;;;;;;;;;;;;;:::o;21862:21::-;;;;;;;;;;;;;:::o;29747:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;26244:319::-;26334:26;26347:4;26353:2;26357;26334:12;:26::i;:::-;26393:1;26375:2;:14;;;:19;;:128;;;;;26463:40;;;26398:105;;;26413:2;26398:35;;;26434:10;26446:4;26452:2;26398:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:105;;;;;26375:128;26371:185;;;26527:17;;;;;;;;;;;;;;26371:185;26244:319;;;:::o;32630:150::-;20909:6;;;;;;;;;;20895:20;;:10;:20;;;20891:47;;20924:14;;;;;;;;;;;;;;20891:47;32704:3:::1;32695:6;:12;;;;32736:2;32726:6;;:12;;32718:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;32630:150:::0;:::o;29219:28::-;;;;;;;;;;;;;:::o;29365:33::-;;;;;;;;;;;;;:::o;22079:21::-;;;;:::o;29516:::-;;;;:::o;29690:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;23223:111::-;20909:6;;;;;;;;;;20895:20;;:10;:20;;;20891:47;;20924:14;;;;;;;;;;;;;;20891:47;23321:5:::1;23301:9;:17;23311:6;23301:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;23223:111:::0;;:::o;23024:191::-;23082:13;23116:8;:12;23125:2;23116:12;;;;;;;;;;;;;;;;;;;;;23108:20;;23160:1;23143:19;;:5;:19;;;23139:69;;23186:10;;;;;;;;;;;;;;23139:69;23024:191;;;:::o;32335:114::-;20909:6;;;;;;;;;;20895:20;;:10;:20;;;20891:47;;20924:14;;;;;;;;;;;;;;20891:47;32435:6:::1;32414:12;:18;32427:4;32414:18;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;32335:114:::0;;:::o;29573:27::-;;;;:::o;29445:31::-;;;;;;;;;;;;;:::o;21955:44::-;;;;;;;;;;;;;;;;;:::o;21383:152::-;20909:6;;;;;;;;;;20895:20;;:10;:20;;;20891:47;;20924:14;;;;;;;;;;;;;;20891:47;21465:1:::1;21448:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;21524:1;21483:44;;21504:10;21483:44;;;;;;;;;;;;21383:152::o:0;32501:121::-;32553:4;20909:6;;;;;;;;;;;20895:20;;:10;:20;;;20891:47;;20924:14;;;;;;;;;;;;;;20891:47;32587:5:::1;32570:14;;:22;;;;;;;;;;;;;;;;;;32610:4;32603:11;;32501:121:::0;:::o;20756:87::-;20802:7;20829:6;;;;;;;;;;;20822:13;;20756:87;:::o;21835:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22235:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;24013:205::-;24140:8;24099:16;:28;24116:10;24099:28;;;;;;;;;;;;;;;:38;24128:8;24099:38;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;24191:8;24164:46;;24179:10;24164:46;;;24201:8;24164:46;;;;;;:::i;:::-;;;;;;;;24013:205;;:::o;26032:135::-;26102:4;26126:33;26136:10;26148:2;26152:6;26126:9;:33::i;:::-;26119:40;;26032:135;;;;:::o;31265:1062::-;31349:18;31423:95;31547:22;;;;;;;;;;;;;;;;;31537:33;;;;;;31599:10;;;;;;;;;;;;;;;;;31589:21;;;;;;31629:13;31669:4;31394:295;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31370:330;;;;;;31349:351;;31713:18;31787:49;31865:23;;;;;;;;;;;;;;;;;31855:34;;;;;;31916:1;31758:175;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31734:210;;;;;;31713:231;;31957:14;32062:10;32091;31998:134;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31974:169;;;;;;31957:186;;32156:14;32173:26;32183:6;32191:1;32194;32197;32173:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32156:43;;32228:7;:5;:7::i;:::-;32218:17;;:6;:17;;;32210:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;32286:4;32270:13;;:20;;;;;;;;;;;;;;;;;;32315:4;32301:11;;:18;;;;;;;;;;;;;;;;;;31338:989;;;;31265:1062;;;:::o;29812:57::-;;;;;;;;;;;;;;;;;;;;;;:::o;26658:342::-;26769:26;26782:4;26788:2;26792;26769:12;:26::i;:::-;26828:1;26810:2;:14;;;:19;;:130;;;;;26900:40;;;26833:107;;;26848:2;26833:35;;;26869:10;26881:4;26887:2;26891:4;;26833:63;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:107;;;;;26810:130;26806:187;;;26964:17;;;;;;;;;;;;;;26806:187;26658:342;;;;;:::o;29405:33::-;;;;;;;;;;;;;:::o;21923:23::-;;;;:::o;29256:29::-;;;;:::o;33063:197::-;33123:13;33185:1;33162:12;33156:26;;;;;:::i;:::-;;;:30;:96;;;;;;;;;;;;;;;;;33203:12;33217:20;33234:2;33217:16;:20::i;:::-;33189:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33156:96;33149:103;;33063:197;;;:::o;29544:22::-;;;;:::o;29114:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22006:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32949:106::-;20909:6;;;;;;;;;;20895:20;;:10;:20;;;20891:47;;20924:14;;;;;;;;;;;;;;20891:47;33038:9:::1;33023:12;:24;;;;;;:::i;:::-;;32949:106:::0;:::o;29323:33::-;;;;:::o;22160:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21153:222::-;20909:6;;;;;;;;;;20895:20;;:10;:20;;;20891:47;;20924:14;;;;;;;;;;;;;;20891:47;21258:1:::1;21238:22;;:8;:22;;::::0;21234:49:::1;;21269:14;;;;;;;;;;;;;;21234:49;21303:8;21294:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;21360:6;::::0;::::1;;;;;;;;21327:40;;21348:10;21327:40;;;;;;;;;;;;21153:222:::0;:::o;29292:24::-;;;;:::o;33268:3144::-;33356:4;33397:1;33381:18;;:4;:18;;;33373:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33474:1;33460:16;;:2;:16;;;33452:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;33536:12;:18;33549:4;33536:18;;;;;;;;;;;;;;;;;;;;;;;;;33535:19;33527:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;33596:12;:16;33609:2;33596:16;;;;;;;;;;;;;;;;;;;;;;;;;33595:17;33587:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;33659:1;33649:6;:11;33645:41;;33682:4;33675:11;;;;33645:41;33703:14;;;;;;;;;;;33699:1160;;;33746:7;:5;:7::i;:::-;33738:15;;:4;:15;;;;:49;;;;;33780:7;:5;:7::i;:::-;33774:13;;:2;:13;;;;33738:49;:86;;;;;33822:1;33808:16;;:2;:16;;;;33738:86;:128;;;;;33859:6;33845:21;;:2;:21;;;;33738:128;:159;;;;;33888:9;;;;;;;;;;;33887:10;33738:159;33734:1114;;;33923:13;;;;;;;;;;;33918:148;;33969:18;:24;33988:4;33969:24;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;33997:18;:22;34016:2;33997:22;;;;;;;;;;;;;;;;;;;;;;;;;33969:50;33961:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33918:148;34119:25;:31;34145:4;34119:31;;;;;;;;;;;;;;;;;;;;;;;;;:64;;;;;34155:24;:28;34180:2;34155:28;;;;;;;;;;;;;;;;;;;;;;;;;34154:29;34119:64;34115:718;;;34226:14;;34216:6;:24;;34208:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;34355:9;;34338;:13;34348:2;34338:13;;;;;;;;;;;;;;;;34329:6;:22;;;;:::i;:::-;:35;;34321:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;34115:718;;;34465:25;:29;34491:2;34465:29;;;;;;;;;;;;;;;;;;;;;;;;;:64;;;;;34499:24;:30;34524:4;34499:30;;;;;;;;;;;;;;;;;;;;;;;;;34498:31;34465:64;34461:372;;;34572:14;;34562:6;:24;;34554:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;34461:372;;;34693:24;:28;34718:2;34693:28;;;;;;;;;;;;;;;;;;;;;;;;;34688:145;;34780:9;;34763;:13;34773:2;34763:13;;;;;;;;;;;;;;;;34754:6;:22;;;;:::i;:::-;:35;;34746:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;34688:145;34461:372;34115:718;33734:1114;33699:1160;35185:12;35228:18;;35200:9;:24;35218:4;35200:24;;;;;;;;;;;;;;;;:46;;35185:61;;35261:7;:35;;;;;35285:11;;;;;;;;;;;35261:35;:62;;;;;35314:9;;;;;;;;;;;35313:10;35261:62;:111;;;;;35341:25;:31;35367:4;35341:31;;;;;;;;;;;;;;;;;;;;;;;;;35340:32;35261:111;:153;;;;;35390:18;:24;35409:4;35390:24;;;;;;;;;;;;;;;;;;;;;;;;;35389:25;35261:153;:193;;;;;35432:18;:22;35451:2;35432:22;;;;;;;;;;;;;;;;;;;;;;;;;35431:23;35261:193;35257:301;;;35485:4;35473:9;;:16;;;;;;;;;;;;;;;;;;35504:10;:8;:10::i;:::-;35541:5;35529:9;;:17;;;;;;;;;;;;;;;;;;35257:301;35570:12;35586:9;;;;;;;;;;;35585:10;35570:25;;35697:18;:24;35716:4;35697:24;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;35725:18;:22;35744:2;35725:22;;;;;;;;;;;;;;;;;;;;;;;;;35697:50;35693:98;;;35774:5;35764:15;;35693:98;35803:12;35908:7;35904:448;;;35936:25;:29;35962:2;35936:29;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;;;35979:1;35969:7;;:11;35936:44;35932:233;;;36036:3;36026:7;;36017:6;:16;;;;:::i;:::-;:22;;;;:::i;:::-;36010:29;;35932:233;;;36063:25;:31;36089:4;36063:31;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;;36107:1;36098:6;;:10;36063:45;36059:106;;;36162:3;36153:6;;36144;:15;;;;:::i;:::-;:21;;;;:::i;:::-;36137:28;;36059:106;35932:233;36196:4;36180:12;;:20;;;;;;;:::i;:::-;;;;;;;;36228:1;36221:4;:8;36217:124;;;36250:42;36266:4;36280;36287;36250:15;:42::i;:::-;;36321:4;36311:14;;;;;:::i;:::-;;;36217:124;35904:448;36371:33;36387:4;36393:2;36397:6;36371:15;:33::i;:::-;36364:40;;;;;33268:3144;;;;;;:::o;11133:718::-;11189:13;11240:14;11277:1;11257:17;11268:5;11257:10;:17::i;:::-;:21;11240:38;;11293:20;11327:6;11316:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11293:41;;11349:11;11478:6;11474:2;11470:15;11462:6;11458:28;11451:35;;11515:290;11522:4;11515:290;;;11547:5;;;;;;;;11689:10;11684:2;11677:5;11673:14;11668:32;11663:3;11655:46;11747:2;11738:11;;;;;;:::i;:::-;;;;;11781:1;11772:5;:10;11515:290;11768:21;11515:290;11826:6;11819:13;;;;;11133:718;;;:::o;37134:450::-;37173:12;37196:19;37218:9;:24;37236:4;37218:24;;;;;;;;;;;;;;;;37196:46;;37272:1;37257:11;:16;:37;;;;37293:1;37277:12;;:17;37257:37;37253:63;;;37309:7;;;;37253:63;37367:2;37346:18;;:23;;;;:::i;:::-;37332:11;:37;37328:93;;;37419:2;37398:18;;:23;;;;:::i;:::-;37384:37;;37328:93;37434:29;37451:11;37434:16;:29::i;:::-;37489:1;37474:12;:16;;;;37525:9;;;;;;;;;;;37517:23;;37549:21;37517:59;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37503:73;;;;;37162:422;;37134:450;:::o;27068:999::-;27155:4;27172:27;27202:9;:15;27212:4;27202:15;;;;;;;;;;;;;;;;27172:45;;27228:29;27260:9;:13;27270:2;27260:13;;;;;;;;;;;;;;;;27228:45;;27305:6;27286:9;:15;27296:4;27286:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;27364:6;27347:9;:13;27357:2;27347:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;27455:9;:15;27465:4;27455:15;;;;;;;;;;;;;;;;;;;;;;;;;27450:236;;27487:22;27563:5;;27545:9;:15;27555:4;27545:15;;;;;;;;;;;;;;;;:23;;;;:::i;:::-;27535:5;;27513: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;27762:9;:13;27772:2;27762:13;;;;;;;;;;;;;;;;;;;;;;;;;27757:232;;27792:22;27868:5;;27844:21;:29;;;;:::i;:::-;27834:5;;27818:9;:13;27828:2;27818:13;;;;;;;;;;;;;;;;: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;28006:31;;28020:4;28006:31;;;28030:6;28006:31;;;;;;:::i;:::-;;;;;;;;28055:4;28048:11;;;;27068:999;;;;;:::o;8417:948::-;8470:7;8490:14;8507:1;8490:18;;8557:8;8548:5;:17;8544:106;;8595:8;8586:17;;;;;;:::i;:::-;;;;;8632:2;8622:12;;;;8544:106;8677:8;8668:5;:17;8664:106;;8715:8;8706:17;;;;;;:::i;:::-;;;;;8752:2;8742:12;;;;8664:106;8797:8;8788:5;:17;8784:106;;8835:8;8826:17;;;;;;:::i;:::-;;;;;8872:2;8862:12;;;;8784:106;8917:7;8908:5;:16;8904:103;;8954:7;8945:16;;;;;;:::i;:::-;;;;;8990:1;8980:11;;;;8904:103;9034:7;9025:5;:16;9021:103;;9071:7;9062:16;;;;;;:::i;:::-;;;;;9107:1;9097:11;;;;9021:103;9151:7;9142:5;:16;9138:103;;9188:7;9179:16;;;;;;:::i;:::-;;;;;9224:1;9214:11;;;;9138:103;9268:7;9259:5;:16;9255:68;;9306:1;9296:11;;;;9255:68;9351:6;9344:13;;;8417:948;;;:::o;36535:591::-;36661:21;36699:1;36685:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36661:40;;36730:4;36712;36717:1;36712:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;36756:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36746:4;36751:1;36746:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;36844:11;36791:9;:24;36809:4;36791:24;;;;;;;;;;;;;;;:50;36824:15;36791:50;;;;;;;;;;;;;;;:64;;;;36894:15;:66;;;36975:11;37001:1;37045:4;37072;37092:15;36894:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36590:536;36535:591;:::o;28699:373::-;28776:1;28760:18;;:4;:18;;;28756:73;;28802:15;;;;;;;;;;;;;;28756:73;28841:10;28854:6;:12;28861:4;28854:12;;;;;;;;;;;;;;;28889:1;28867:6;:12;28874:4;28867:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;28854:37;;;;;;;;:::i;:::-;;;;;;;;;;28841:50;;28902:6;:12;28909:4;28902:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28938:11;:15;28950:2;28938:15;;;;;;;;;;;28931:22;;;28971:8;:12;28980:2;28971:12;;;;;;;;;;;;28964:19;;;;;;;;;;;29001:11;:15;29013:2;29001:15;;;;;;;;;;;;28994:22;;;;;;;;;;;29061:2;29057:1;29034:30;;29043:4;29034:30;;;;;;;;;;;;28745:327;28699:373;:::o;28219:472::-;28292:1;28278:16;;:2;:16;;;28274:74;;28318:18;;;;;;;;;;;;;;28274:74;28385:6;;:8;;;;;;;;;;;;;28417:10;28430:6;;28417:19;;28475:1;28451:26;;:8;:12;28460:2;28451:12;;;;;;;;;;;;;;;;;;;;;:26;;;28447:81;;28501:15;;;;;;;;;;;;;;28447:81;28555:2;28540:8;:12;28549:2;28540:12;;;;;;;;;;;;:17;;;;;;;;;;;;;;;;;;28568:6;:10;28575:2;28568:10;;;;;;;;;;;;;;;28584:2;28568:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28636:1;28616:6;:10;28623:2;28616:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;28598:11;:15;28610:2;28598:15;;;;;;;;;;;:39;;;;28680:2;28676;28655:28;;28672:1;28655:28;;;;;;;;;;;;28263:428;28219:472;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:77;1713:7;1742:5;1731:16;;1676:77;;;:::o;1759:122::-;1832:24;1850:5;1832:24;:::i;:::-;1825:5;1822:35;1812:63;;1871:1;1868;1861:12;1812:63;1759:122;:::o;1887:139::-;1933:5;1971:6;1958:20;1949:29;;1987:33;2014:5;1987:33;:::i;:::-;1887:139;;;;:::o;2032:329::-;2091:6;2140:2;2128:9;2119:7;2115:23;2111:32;2108:119;;;2146:79;;:::i;:::-;2108:119;2266:1;2291:53;2336:7;2327:6;2316:9;2312:22;2291:53;:::i;:::-;2281:63;;2237:117;2032:329;;;;:::o;2367:126::-;2404:7;2444:42;2437:5;2433:54;2422:65;;2367:126;;;:::o;2499:96::-;2536:7;2565:24;2583:5;2565:24;:::i;:::-;2554:35;;2499:96;;;:::o;2601:118::-;2688:24;2706:5;2688:24;:::i;:::-;2683:3;2676:37;2601:118;;:::o;2725:222::-;2818:4;2856:2;2845:9;2841:18;2833:26;;2869:71;2937:1;2926:9;2922:17;2913:6;2869:71;:::i;:::-;2725:222;;;;:::o;2953:122::-;3026:24;3044:5;3026:24;:::i;:::-;3019:5;3016:35;3006:63;;3065:1;3062;3055:12;3006:63;2953:122;:::o;3081:139::-;3127:5;3165:6;3152:20;3143:29;;3181:33;3208:5;3181:33;:::i;:::-;3081:139;;;;:::o;3226:474::-;3294:6;3302;3351:2;3339:9;3330:7;3326:23;3322:32;3319:119;;;3357:79;;:::i;:::-;3319:119;3477:1;3502:53;3547:7;3538:6;3527:9;3523:22;3502:53;:::i;:::-;3492:63;;3448:117;3604:2;3630:53;3675:7;3666:6;3655:9;3651:22;3630:53;:::i;:::-;3620:63;;3575:118;3226:474;;;;;:::o;3706:90::-;3740:7;3783:5;3776:13;3769:21;3758:32;;3706:90;;;:::o;3802:109::-;3883:21;3898:5;3883:21;:::i;:::-;3878:3;3871:34;3802:109;;:::o;3917:210::-;4004:4;4042:2;4031:9;4027:18;4019:26;;4055:65;4117:1;4106:9;4102:17;4093:6;4055:65;:::i;:::-;3917:210;;;;:::o;4133:60::-;4161:3;4182:5;4175:12;;4133:60;;;:::o;4199:142::-;4249:9;4282:53;4300:34;4309:24;4327:5;4309:24;:::i;:::-;4300:34;:::i;:::-;4282:53;:::i;:::-;4269:66;;4199:142;;;:::o;4347:126::-;4397:9;4430:37;4461:5;4430:37;:::i;:::-;4417:50;;4347:126;;;:::o;4479:153::-;4556:9;4589:37;4620:5;4589:37;:::i;:::-;4576:50;;4479:153;;;:::o;4638:185::-;4752:64;4810:5;4752:64;:::i;:::-;4747:3;4740:77;4638:185;;:::o;4829:276::-;4949:4;4987:2;4976:9;4972:18;4964:26;;5000:98;5095:1;5084:9;5080:17;5071:6;5000:98;:::i;:::-;4829:276;;;;:::o;5111:118::-;5198:24;5216:5;5198:24;:::i;:::-;5193:3;5186:37;5111:118;;:::o;5235:222::-;5328:4;5366:2;5355:9;5351:18;5343:26;;5379:71;5447:1;5436:9;5432:17;5423:6;5379:71;:::i;:::-;5235:222;;;;:::o;5463:619::-;5540:6;5548;5556;5605:2;5593:9;5584:7;5580:23;5576:32;5573:119;;;5611:79;;:::i;:::-;5573:119;5731:1;5756:53;5801:7;5792:6;5781:9;5777:22;5756:53;:::i;:::-;5746:63;;5702:117;5858:2;5884:53;5929:7;5920:6;5909:9;5905:22;5884:53;:::i;:::-;5874:63;;5829:118;5986:2;6012:53;6057:7;6048:6;6037:9;6033:22;6012:53;:::i;:::-;6002:63;;5957:118;5463:619;;;;;:::o;6088:86::-;6123:7;6163:4;6156:5;6152:16;6141:27;;6088:86;;;:::o;6180:112::-;6263:22;6279:5;6263:22;:::i;:::-;6258:3;6251:35;6180:112;;:::o;6298:214::-;6387:4;6425:2;6414:9;6410:18;6402:26;;6438:67;6502:1;6491:9;6487:17;6478:6;6438:67;:::i;:::-;6298:214;;;;:::o;6518:329::-;6577:6;6626:2;6614:9;6605:7;6601:23;6597:32;6594:119;;;6632:79;;:::i;:::-;6594:119;6752:1;6777:53;6822:7;6813:6;6802:9;6798:22;6777:53;:::i;:::-;6767:63;;6723:117;6518:329;;;;:::o;6853:116::-;6923:21;6938:5;6923:21;:::i;:::-;6916:5;6913:32;6903:60;;6959:1;6956;6949:12;6903:60;6853:116;:::o;6975:133::-;7018:5;7056:6;7043:20;7034:29;;7072:30;7096:5;7072:30;:::i;:::-;6975:133;;;;:::o;7114:468::-;7179:6;7187;7236:2;7224:9;7215:7;7211:23;7207:32;7204:119;;;7242:79;;:::i;:::-;7204:119;7362:1;7387:53;7432:7;7423:6;7412:9;7408:22;7387:53;:::i;:::-;7377:63;;7333:117;7489:2;7515:50;7557:7;7548:6;7537:9;7533:22;7515:50;:::i;:::-;7505:60;;7460:115;7114:468;;;;;:::o;7588:118::-;7659:22;7675:5;7659:22;:::i;:::-;7652:5;7649:33;7639:61;;7696:1;7693;7686:12;7639:61;7588:118;:::o;7712:135::-;7756:5;7794:6;7781:20;7772:29;;7810:31;7835:5;7810:31;:::i;:::-;7712:135;;;;:::o;7853:77::-;7890:7;7919:5;7908:16;;7853:77;;;:::o;7936:122::-;8009:24;8027:5;8009:24;:::i;:::-;8002:5;7999:35;7989:63;;8048:1;8045;8038:12;7989:63;7936:122;:::o;8064:139::-;8110:5;8148:6;8135:20;8126:29;;8164:33;8191:5;8164:33;:::i;:::-;8064:139;;;;:::o;8209:615::-;8284:6;8292;8300;8349:2;8337:9;8328:7;8324:23;8320:32;8317:119;;;8355:79;;:::i;:::-;8317:119;8475:1;8500:51;8543:7;8534:6;8523:9;8519:22;8500:51;:::i;:::-;8490:61;;8446:115;8600:2;8626:53;8671:7;8662:6;8651:9;8647:22;8626:53;:::i;:::-;8616:63;;8571:118;8728:2;8754:53;8799:7;8790:6;8779:9;8775:22;8754:53;:::i;:::-;8744:63;;8699:118;8209:615;;;;;:::o;8830:117::-;8939:1;8936;8929:12;8953:117;9062:1;9059;9052:12;9076:117;9185:1;9182;9175:12;9212:552;9269:8;9279:6;9329:3;9322:4;9314:6;9310:17;9306:27;9296:122;;9337:79;;:::i;:::-;9296:122;9450:6;9437:20;9427:30;;9480:18;9472:6;9469:30;9466:117;;;9502:79;;:::i;:::-;9466:117;9616:4;9608:6;9604:17;9592:29;;9670:3;9662:4;9654:6;9650:17;9640:8;9636:32;9633:41;9630:128;;;9677:79;;:::i;:::-;9630:128;9212:552;;;;;:::o;9770:963::-;9867:6;9875;9883;9891;9899;9948:3;9936:9;9927:7;9923:23;9919:33;9916:120;;;9955:79;;:::i;:::-;9916:120;10075:1;10100:53;10145:7;10136:6;10125:9;10121:22;10100:53;:::i;:::-;10090:63;;10046:117;10202:2;10228:53;10273:7;10264:6;10253:9;10249:22;10228:53;:::i;:::-;10218:63;;10173:118;10330:2;10356:53;10401:7;10392:6;10381:9;10377:22;10356:53;:::i;:::-;10346:63;;10301:118;10486:2;10475:9;10471:18;10458:32;10517:18;10509:6;10506:30;10503:117;;;10539:79;;:::i;:::-;10503:117;10652:64;10708:7;10699:6;10688:9;10684:22;10652:64;:::i;:::-;10634:82;;;;10429:297;9770:963;;;;;;;;:::o;10739:474::-;10807:6;10815;10864:2;10852:9;10843:7;10839:23;10835:32;10832:119;;;10870:79;;:::i;:::-;10832:119;10990:1;11015:53;11060:7;11051:6;11040:9;11036:22;11015:53;:::i;:::-;11005:63;;10961:117;11117:2;11143:53;11188:7;11179:6;11168:9;11164:22;11143:53;:::i;:::-;11133:63;;11088:118;10739:474;;;;;:::o;11219:117::-;11328:1;11325;11318:12;11342:180;11390:77;11387:1;11380:88;11487:4;11484:1;11477:15;11511:4;11508:1;11501:15;11528:281;11611:27;11633:4;11611:27;:::i;:::-;11603:6;11599:40;11741:6;11729:10;11726:22;11705:18;11693:10;11690:34;11687:62;11684:88;;;11752:18;;:::i;:::-;11684:88;11792:10;11788:2;11781:22;11571:238;11528:281;;:::o;11815:129::-;11849:6;11876:20;;:::i;:::-;11866:30;;11905:33;11933:4;11925:6;11905:33;:::i;:::-;11815:129;;;:::o;11950:308::-;12012:4;12102:18;12094:6;12091:30;12088:56;;;12124:18;;:::i;:::-;12088:56;12162:29;12184:6;12162:29;:::i;:::-;12154:37;;12246:4;12240;12236:15;12228:23;;11950:308;;;:::o;12264:146::-;12361:6;12356:3;12351;12338:30;12402:1;12393:6;12388:3;12384:16;12377:27;12264:146;;;:::o;12416:425::-;12494:5;12519:66;12535:49;12577:6;12535:49;:::i;:::-;12519:66;:::i;:::-;12510:75;;12608:6;12601:5;12594:21;12646:4;12639:5;12635:16;12684:3;12675:6;12670:3;12666:16;12663:25;12660:112;;;12691:79;;:::i;:::-;12660:112;12781:54;12828:6;12823:3;12818;12781:54;:::i;:::-;12500:341;12416:425;;;;;:::o;12861:340::-;12917:5;12966:3;12959:4;12951:6;12947:17;12943:27;12933:122;;12974:79;;:::i;:::-;12933:122;13091:6;13078:20;13116:79;13191:3;13183:6;13176:4;13168:6;13164:17;13116:79;:::i;:::-;13107:88;;12923:278;12861:340;;;;:::o;13207:509::-;13276:6;13325:2;13313:9;13304:7;13300:23;13296:32;13293:119;;;13331:79;;:::i;:::-;13293:119;13479:1;13468:9;13464:17;13451:31;13509:18;13501:6;13498:30;13495:117;;;13531:79;;:::i;:::-;13495:117;13636:63;13691:7;13682:6;13671:9;13667:22;13636:63;:::i;:::-;13626:73;;13422:287;13207:509;;;;:::o;13722:180::-;13770:77;13767:1;13760:88;13867:4;13864:1;13857:15;13891:4;13888:1;13881:15;13908:320;13952:6;13989:1;13983:4;13979:12;13969:22;;14036:1;14030:4;14026:12;14057:18;14047:81;;14113:4;14105:6;14101:17;14091:27;;14047:81;14175:2;14167:6;14164:14;14144:18;14141:38;14138:84;;14194:18;;:::i;:::-;14138:84;13959:269;13908:320;;;:::o;14234:179::-;14374:31;14370:1;14362:6;14358:14;14351:55;14234:179;:::o;14419:366::-;14561:3;14582:67;14646:2;14641:3;14582:67;:::i;:::-;14575:74;;14658:93;14747:3;14658:93;:::i;:::-;14776:2;14771:3;14767:12;14760:19;;14419:366;;;:::o;14791:419::-;14957:4;14995:2;14984:9;14980:18;14972:26;;15044:9;15038:4;15034:20;15030:1;15019:9;15015:17;15008:47;15072:131;15198:4;15072:131;:::i;:::-;15064:139;;14791:419;;;:::o;15216:180::-;15264:77;15261:1;15254:88;15361:4;15358:1;15351:15;15385:4;15382:1;15375:15;15402:194;15442:4;15462:20;15480:1;15462:20;:::i;:::-;15457:25;;15496:20;15514:1;15496:20;:::i;:::-;15491:25;;15540:1;15537;15533:9;15525:17;;15564:1;15558:4;15555:11;15552:37;;;15569:18;;:::i;:::-;15552:37;15402:194;;;;:::o;15602:180::-;15650:77;15647:1;15640:88;15747:4;15744:1;15737:15;15771:4;15768:1;15761:15;15788:180;15836:77;15833:1;15826:88;15933:4;15930:1;15923:15;15957:4;15954:1;15947:15;15974:168;16057:11;16091:6;16086:3;16079:19;16131:4;16126:3;16122:14;16107:29;;15974:168;;;;:::o;16148:114::-;;:::o;16268:362::-;16409:3;16430:65;16493:1;16488:3;16430:65;:::i;:::-;16423:72;;16504:93;16593:3;16504:93;:::i;:::-;16622:1;16617:3;16613:11;16606:18;;16268:362;;;:::o;16636:748::-;16885:4;16923:3;16912:9;16908:19;16900:27;;16937:71;17005:1;16994:9;16990:17;16981:6;16937:71;:::i;:::-;17018:72;17086:2;17075:9;17071:18;17062:6;17018:72;:::i;:::-;17100;17168:2;17157:9;17153:18;17144:6;17100:72;:::i;:::-;17219:9;17213:4;17209:20;17204:2;17193:9;17189:18;17182:48;17247:130;17372:4;17247:130;:::i;:::-;17239:138;;16636:748;;;;;;:::o;17390:149::-;17426:7;17466:66;17459:5;17455:78;17444:89;;17390:149;;;:::o;17545:120::-;17617:23;17634:5;17617:23;:::i;:::-;17610:5;17607:34;17597:62;;17655:1;17652;17645:12;17597:62;17545:120;:::o;17671:141::-;17727:5;17758:6;17752:13;17743:22;;17774:32;17800:5;17774:32;:::i;:::-;17671:141;;;;:::o;17818:349::-;17887:6;17936:2;17924:9;17915:7;17911:23;17907:32;17904:119;;;17942:79;;:::i;:::-;17904:119;18062:1;18087:63;18142:7;18133:6;18122:9;18118:22;18087:63;:::i;:::-;18077:73;;18033:127;17818:349;;;;:::o;18173:118::-;18260:24;18278:5;18260:24;:::i;:::-;18255:3;18248:37;18173:118;;:::o;18297:664::-;18502:4;18540:3;18529:9;18525:19;18517:27;;18554:71;18622:1;18611:9;18607:17;18598:6;18554:71;:::i;:::-;18635:72;18703:2;18692:9;18688:18;18679:6;18635:72;:::i;:::-;18717;18785:2;18774:9;18770:18;18761:6;18717:72;:::i;:::-;18799;18867:2;18856:9;18852:18;18843:6;18799:72;:::i;:::-;18881:73;18949:3;18938:9;18934:19;18925:6;18881:73;:::i;:::-;18297:664;;;;;;;;:::o;18967:442::-;19116:4;19154:2;19143:9;19139:18;19131:26;;19167:71;19235:1;19224:9;19220:17;19211:6;19167:71;:::i;:::-;19248:72;19316:2;19305:9;19301:18;19292:6;19248:72;:::i;:::-;19330;19398:2;19387:9;19383:18;19374:6;19330:72;:::i;:::-;18967:442;;;;;;:::o;19415:148::-;19517:11;19554:3;19539:18;;19415:148;;;;:::o;19569:214::-;19709:66;19705:1;19697:6;19693:14;19686:90;19569:214;:::o;19789:400::-;19949:3;19970:84;20052:1;20047:3;19970:84;:::i;:::-;19963:91;;20063:93;20152:3;20063:93;:::i;:::-;20181:1;20176:3;20172:11;20165:18;;19789:400;;;:::o;20195:79::-;20234:7;20263:5;20252:16;;20195:79;;;:::o;20280:157::-;20385:45;20405:24;20423:5;20405:24;:::i;:::-;20385:45;:::i;:::-;20380:3;20373:58;20280:157;;:::o;20443:663::-;20684:3;20706:148;20850:3;20706:148;:::i;:::-;20699:155;;20864:75;20935:3;20926:6;20864:75;:::i;:::-;20964:2;20959:3;20955:12;20948:19;;20977:75;21048:3;21039:6;20977:75;:::i;:::-;21077:2;21072:3;21068:12;21061:19;;21097:3;21090:10;;20443:663;;;;;:::o;21112:545::-;21285:4;21323:3;21312:9;21308:19;21300:27;;21337:71;21405:1;21394:9;21390:17;21381:6;21337:71;:::i;:::-;21418:68;21482:2;21471:9;21467:18;21458:6;21418:68;:::i;:::-;21496:72;21564:2;21553:9;21549:18;21540:6;21496:72;:::i;:::-;21578;21646:2;21635:9;21631:18;21622:6;21578:72;:::i;:::-;21112:545;;;;;;;:::o;21663:167::-;21803:19;21799:1;21791:6;21787:14;21780:43;21663:167;:::o;21836:366::-;21978:3;21999:67;22063:2;22058:3;21999:67;:::i;:::-;21992:74;;22075:93;22164:3;22075:93;:::i;:::-;22193:2;22188:3;22184:12;22177:19;;21836:366;;;:::o;22208:419::-;22374:4;22412:2;22401:9;22397:18;22389:26;;22461:9;22455:4;22451:20;22447:1;22436:9;22432:17;22425:47;22489:131;22615:4;22489:131;:::i;:::-;22481:139;;22208:419;;;:::o;22655:314::-;22751:3;22772:70;22835:6;22830:3;22772:70;:::i;:::-;22765:77;;22852:56;22901:6;22896:3;22889:5;22852:56;:::i;:::-;22933:29;22955:6;22933:29;:::i;:::-;22928:3;22924:39;22917:46;;22655:314;;;;;:::o;22975:660::-;23180:4;23218:3;23207:9;23203:19;23195:27;;23232:71;23300:1;23289:9;23285:17;23276:6;23232:71;:::i;:::-;23313:72;23381:2;23370:9;23366:18;23357:6;23313:72;:::i;:::-;23395;23463:2;23452:9;23448:18;23439:6;23395:72;:::i;:::-;23514:9;23508:4;23504:20;23499:2;23488:9;23484:18;23477:48;23542:86;23623:4;23614:6;23606;23542:86;:::i;:::-;23534:94;;22975:660;;;;;;;;:::o;23641:141::-;23690:4;23713:3;23705:11;;23736:3;23733:1;23726:14;23770:4;23767:1;23757:18;23749:26;;23641:141;;;:::o;23812:874::-;23915:3;23952:5;23946:12;23981:36;24007:9;23981:36;:::i;:::-;24033:89;24115:6;24110:3;24033:89;:::i;:::-;24026:96;;24153:1;24142:9;24138:17;24169:1;24164:166;;;;24344:1;24339:341;;;;24131:549;;24164:166;24248:4;24244:9;24233;24229:25;24224:3;24217:38;24310:6;24303:14;24296:22;24288:6;24284:35;24279:3;24275:45;24268:52;;24164:166;;24339:341;24406:38;24438:5;24406:38;:::i;:::-;24466:1;24480:154;24494:6;24491:1;24488:13;24480:154;;;24568:7;24562:14;24558:1;24553:3;24549:11;24542:35;24618:1;24609:7;24605:15;24594:26;;24516:4;24513:1;24509:12;24504:17;;24480:154;;;24663:6;24658:3;24654:16;24647:23;;24346:334;;24131:549;;23919:767;;23812:874;;;;:::o;24692:390::-;24798:3;24826:39;24859:5;24826:39;:::i;:::-;24881:89;24963:6;24958:3;24881:89;:::i;:::-;24874:96;;24979:65;25037:6;25032:3;25025:4;25018:5;25014:16;24979:65;:::i;:::-;25069:6;25064:3;25060:16;25053:23;;24802:280;24692:390;;;;:::o;25088:182::-;25256:7;25251:3;25244:20;25088:182;:::o;25276:693::-;25543:3;25565:92;25653:3;25644:6;25565:92;:::i;:::-;25558:99;;25674:95;25765:3;25756:6;25674:95;:::i;:::-;25667:102;;25779:137;25912:3;25779:137;:::i;:::-;25941:1;25936:3;25932:11;25925:18;;25960:3;25953:10;;25276:693;;;;;:::o;25975:93::-;26012:6;26059:2;26054;26047:5;26043:14;26039:23;26029:33;;25975:93;;;:::o;26074:107::-;26118:8;26168:5;26162:4;26158:16;26137:37;;26074:107;;;;:::o;26187:393::-;26256:6;26306:1;26294:10;26290:18;26329:97;26359:66;26348:9;26329:97;:::i;:::-;26447:39;26477:8;26466:9;26447:39;:::i;:::-;26435:51;;26519:4;26515:9;26508:5;26504:21;26495:30;;26568:4;26558:8;26554:19;26547:5;26544:30;26534:40;;26263:317;;26187:393;;;;;:::o;26586:142::-;26636:9;26669:53;26687:34;26696:24;26714:5;26696:24;:::i;:::-;26687:34;:::i;:::-;26669:53;:::i;:::-;26656:66;;26586:142;;;:::o;26734:75::-;26777:3;26798:5;26791:12;;26734:75;;;:::o;26815:269::-;26925:39;26956:7;26925:39;:::i;:::-;26986:91;27035:41;27059:16;27035:41;:::i;:::-;27027:6;27020:4;27014:11;26986:91;:::i;:::-;26980:4;26973:105;26891:193;26815:269;;;:::o;27090:73::-;27135:3;27090:73;:::o;27169:189::-;27246:32;;:::i;:::-;27287:65;27345:6;27337;27331:4;27287:65;:::i;:::-;27222:136;27169:189;;:::o;27364:186::-;27424:120;27441:3;27434:5;27431:14;27424:120;;;27495:39;27532:1;27525:5;27495:39;:::i;:::-;27468:1;27461:5;27457:13;27448:22;;27424:120;;;27364:186;;:::o;27556:543::-;27657:2;27652:3;27649:11;27646:446;;;27691:38;27723:5;27691:38;:::i;:::-;27775:29;27793:10;27775:29;:::i;:::-;27765:8;27761:44;27958:2;27946:10;27943:18;27940:49;;;27979:8;27964:23;;27940:49;28002:80;28058:22;28076:3;28058:22;:::i;:::-;28048:8;28044:37;28031:11;28002:80;:::i;:::-;27661:431;;27646:446;27556:543;;;:::o;28105:117::-;28159:8;28209:5;28203:4;28199:16;28178:37;;28105:117;;;;:::o;28228:169::-;28272:6;28305:51;28353:1;28349:6;28341:5;28338:1;28334:13;28305:51;:::i;:::-;28301:56;28386:4;28380;28376:15;28366:25;;28279:118;28228:169;;;;:::o;28402:295::-;28478:4;28624:29;28649:3;28643:4;28624:29;:::i;:::-;28616:37;;28686:3;28683:1;28679:11;28673:4;28670:21;28662:29;;28402:295;;;;:::o;28702:1395::-;28819:37;28852:3;28819:37;:::i;:::-;28921:18;28913:6;28910:30;28907:56;;;28943:18;;:::i;:::-;28907:56;28987:38;29019:4;29013:11;28987:38;:::i;:::-;29072:67;29132:6;29124;29118:4;29072:67;:::i;:::-;29166:1;29190:4;29177:17;;29222:2;29214:6;29211:14;29239:1;29234:618;;;;29896:1;29913:6;29910:77;;;29962:9;29957:3;29953:19;29947:26;29938:35;;29910:77;30013:67;30073:6;30066:5;30013:67;:::i;:::-;30007:4;30000:81;29869:222;29204:887;;29234:618;29286:4;29282:9;29274:6;29270:22;29320:37;29352:4;29320:37;:::i;:::-;29379:1;29393:208;29407:7;29404:1;29401:14;29393:208;;;29486:9;29481:3;29477:19;29471:26;29463:6;29456:42;29537:1;29529:6;29525:14;29515:24;;29584:2;29573:9;29569:18;29556:31;;29430:4;29427:1;29423:12;29418:17;;29393:208;;;29629:6;29620:7;29617:19;29614:179;;;29687:9;29682:3;29678:19;29672:26;29730:48;29772:4;29764:6;29760:17;29749:9;29730:48;:::i;:::-;29722:6;29715:64;29637:156;29614:179;29839:1;29835;29827:6;29823:14;29819:22;29813:4;29806:36;29241:611;;;29204:887;;28794:1303;;;28702:1395;;:::o;30103:224::-;30243:34;30239:1;30231:6;30227:14;30220:58;30312:7;30307:2;30299:6;30295:15;30288:32;30103:224;:::o;30333:366::-;30475:3;30496:67;30560:2;30555:3;30496:67;:::i;:::-;30489:74;;30572:93;30661:3;30572:93;:::i;:::-;30690:2;30685:3;30681:12;30674:19;;30333:366;;;:::o;30705:419::-;30871:4;30909:2;30898:9;30894:18;30886:26;;30958:9;30952:4;30948:20;30944:1;30933:9;30929:17;30922:47;30986:131;31112:4;30986:131;:::i;:::-;30978:139;;30705:419;;;:::o;31130:222::-;31270:34;31266:1;31258:6;31254:14;31247:58;31339:5;31334:2;31326:6;31322:15;31315:30;31130:222;:::o;31358:366::-;31500:3;31521:67;31585:2;31580:3;31521:67;:::i;:::-;31514:74;;31597:93;31686:3;31597:93;:::i;:::-;31715:2;31710:3;31706:12;31699:19;;31358:366;;;:::o;31730:419::-;31896:4;31934:2;31923:9;31919:18;31911:26;;31983:9;31977:4;31973:20;31969:1;31958:9;31954:17;31947:47;32011:131;32137:4;32011:131;:::i;:::-;32003:139;;31730:419;;;:::o;32155:167::-;32295:19;32291:1;32283:6;32279:14;32272:43;32155:167;:::o;32328:366::-;32470:3;32491:67;32555:2;32550:3;32491:67;:::i;:::-;32484:74;;32567:93;32656:3;32567:93;:::i;:::-;32685:2;32680:3;32676:12;32669:19;;32328:366;;;:::o;32700:419::-;32866:4;32904:2;32893:9;32889:18;32881:26;;32953:9;32947:4;32943:20;32939:1;32928:9;32924:17;32917:47;32981:131;33107:4;32981:131;:::i;:::-;32973:139;;32700:419;;;:::o;33125:165::-;33265:17;33261:1;33253:6;33249:14;33242:41;33125:165;:::o;33296:366::-;33438:3;33459:67;33523:2;33518:3;33459:67;:::i;:::-;33452:74;;33535:93;33624:3;33535:93;:::i;:::-;33653:2;33648:3;33644:12;33637:19;;33296:366;;;:::o;33668:419::-;33834:4;33872:2;33861:9;33857:18;33849:26;;33921:9;33915:4;33911:20;33907:1;33896:9;33892:17;33885:47;33949:131;34075:4;33949:131;:::i;:::-;33941:139;;33668:419;;;:::o;34093:172::-;34233:24;34229:1;34221:6;34217:14;34210:48;34093:172;:::o;34271:366::-;34413:3;34434:67;34498:2;34493:3;34434:67;:::i;:::-;34427:74;;34510:93;34599:3;34510:93;:::i;:::-;34628:2;34623:3;34619:12;34612:19;;34271:366;;;:::o;34643:419::-;34809:4;34847:2;34836:9;34832:18;34824:26;;34896:9;34890:4;34886:20;34882:1;34871:9;34867:17;34860:47;34924:131;35050:4;34924:131;:::i;:::-;34916:139;;34643:419;;;:::o;35068:240::-;35208:34;35204:1;35196:6;35192:14;35185:58;35277:23;35272:2;35264:6;35260:15;35253:48;35068:240;:::o;35314:366::-;35456:3;35477:67;35541:2;35536:3;35477:67;:::i;:::-;35470:74;;35553:93;35642:3;35553:93;:::i;:::-;35671:2;35666:3;35662:12;35655:19;;35314:366;;;:::o;35686:419::-;35852:4;35890:2;35879:9;35875:18;35867:26;;35939:9;35933:4;35929:20;35925:1;35914:9;35910:17;35903:47;35967:131;36093:4;35967:131;:::i;:::-;35959:139;;35686:419;;;:::o;36111:191::-;36151:3;36170:20;36188:1;36170:20;:::i;:::-;36165:25;;36204:20;36222:1;36204:20;:::i;:::-;36199:25;;36247:1;36244;36240:9;36233:16;;36268:3;36265:1;36262:10;36259:36;;;36275:18;;:::i;:::-;36259:36;36111:191;;;;:::o;36308:169::-;36448:21;36444:1;36436:6;36432:14;36425:45;36308:169;:::o;36483:366::-;36625:3;36646:67;36710:2;36705:3;36646:67;:::i;:::-;36639:74;;36722:93;36811:3;36722:93;:::i;:::-;36840:2;36835:3;36831:12;36824:19;;36483:366;;;:::o;36855:419::-;37021:4;37059:2;37048:9;37044:18;37036:26;;37108:9;37102:4;37098:20;37094:1;37083:9;37079:17;37072:47;37136:131;37262:4;37136:131;:::i;:::-;37128:139;;36855:419;;;:::o;37280:241::-;37420:34;37416:1;37408:6;37404:14;37397:58;37489:24;37484:2;37476:6;37472:15;37465:49;37280:241;:::o;37527:366::-;37669:3;37690:67;37754:2;37749:3;37690:67;:::i;:::-;37683:74;;37766:93;37855:3;37766:93;:::i;:::-;37884:2;37879:3;37875:12;37868:19;;37527:366;;;:::o;37899:419::-;38065:4;38103:2;38092:9;38088:18;38080:26;;38152:9;38146:4;38142:20;38138:1;38127:9;38123:17;38116:47;38180:131;38306:4;38180:131;:::i;:::-;38172:139;;37899:419;;;:::o;38324:410::-;38364:7;38387:20;38405:1;38387:20;:::i;:::-;38382:25;;38421:20;38439:1;38421:20;:::i;:::-;38416:25;;38476:1;38473;38469:9;38498:30;38516:11;38498:30;:::i;:::-;38487:41;;38677:1;38668:7;38664:15;38661:1;38658:22;38638:1;38631:9;38611:83;38588:139;;38707:18;;:::i;:::-;38588:139;38372:362;38324:410;;;;:::o;38740:180::-;38788:77;38785:1;38778:88;38885:4;38882:1;38875:15;38909:4;38906:1;38899:15;38926:185;38966:1;38983:20;39001:1;38983:20;:::i;:::-;38978:25;;39017:20;39035:1;39017:20;:::i;:::-;39012:25;;39056:1;39046:35;;39061:18;;:::i;:::-;39046:35;39103:1;39100;39096:9;39091:14;;38926:185;;;;:::o;39117:147::-;39218:11;39255:3;39240:18;;39117:147;;;;:::o;39270:398::-;39429:3;39450:83;39531:1;39526:3;39450:83;:::i;:::-;39443:90;;39542:93;39631:3;39542:93;:::i;:::-;39660:1;39655:3;39651:11;39644:18;;39270:398;;;:::o;39674:379::-;39858:3;39880:147;40023:3;39880:147;:::i;:::-;39873:154;;40044:3;40037:10;;39674:379;;;:::o;40059:143::-;40116:5;40147:6;40141:13;40132:22;;40163:33;40190:5;40163:33;:::i;:::-;40059:143;;;;:::o;40208:351::-;40278:6;40327:2;40315:9;40306:7;40302:23;40298:32;40295:119;;;40333:79;;:::i;:::-;40295:119;40453:1;40478:64;40534:7;40525:6;40514:9;40510:22;40478:64;:::i;:::-;40468:74;;40424:128;40208:351;;;;:::o;40565:85::-;40610:7;40639:5;40628:16;;40565:85;;;:::o;40656:158::-;40714:9;40747:61;40765:42;40774:32;40800:5;40774:32;:::i;:::-;40765:42;:::i;:::-;40747:61;:::i;:::-;40734:74;;40656:158;;;:::o;40820:147::-;40915:45;40954:5;40915:45;:::i;:::-;40910:3;40903:58;40820:147;;:::o;40973:114::-;41040:6;41074:5;41068:12;41058:22;;40973:114;;;:::o;41093:184::-;41192:11;41226:6;41221:3;41214:19;41266:4;41261:3;41257:14;41242:29;;41093:184;;;;:::o;41283:132::-;41350:4;41373:3;41365:11;;41403:4;41398:3;41394:14;41386:22;;41283:132;;;:::o;41421:108::-;41498:24;41516:5;41498:24;:::i;:::-;41493:3;41486:37;41421:108;;:::o;41535:179::-;41604:10;41625:46;41667:3;41659:6;41625:46;:::i;:::-;41703:4;41698:3;41694:14;41680:28;;41535:179;;;;:::o;41720:113::-;41790:4;41822;41817:3;41813:14;41805:22;;41720:113;;;:::o;41869:732::-;41988:3;42017:54;42065:5;42017:54;:::i;:::-;42087:86;42166:6;42161:3;42087:86;:::i;:::-;42080:93;;42197:56;42247:5;42197:56;:::i;:::-;42276:7;42307:1;42292:284;42317:6;42314:1;42311:13;42292:284;;;42393:6;42387:13;42420:63;42479:3;42464:13;42420:63;:::i;:::-;42413:70;;42506:60;42559:6;42506:60;:::i;:::-;42496:70;;42352:224;42339:1;42336;42332:9;42327:14;;42292:284;;;42296:14;42592:3;42585:10;;41993:608;;;41869:732;;;;:::o;42607:831::-;42870:4;42908:3;42897:9;42893:19;42885:27;;42922:71;42990:1;42979:9;42975:17;42966:6;42922:71;:::i;:::-;43003:80;43079:2;43068:9;43064:18;43055:6;43003:80;:::i;:::-;43130:9;43124:4;43120:20;43115:2;43104:9;43100:18;43093:48;43158:108;43261:4;43252:6;43158:108;:::i;:::-;43150:116;;43276:72;43344:2;43333:9;43329:18;43320:6;43276:72;:::i;:::-;43358:73;43426:3;43415:9;43411:19;43402:6;43358:73;:::i;:::-;42607:831;;;;;;;;:::o

Swarm Source

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