ETH Price: $2,439.44 (+1.56%)

Token

Anon (ANON)
 

Overview

Max Total Supply

352 ANON

Holders

0

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
hangome.eth
Balance
0 ANON

Value
$0.00
0x96be275ea2714b72b06e621e48c4bcb967478d59
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:
Anon

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-05
*/

// SPDX-License-Identifier: MIT

/* 

This is experimental software. 

https://anonethereum.com/
https://x.com/anon_ethereum
https://t.me/anonethereum

*/

pragma solidity ^0.8.24;

interface Callable {
	function tokenCallback(address _from, uint256 _tokens, bytes calldata _data) external returns (bool);
}

interface ERC20Interface {
	function balanceOf(address) external view returns (uint256);
	function allowance(address, address) external view returns (uint256);
	function transfer(address, uint256) external returns (bool);
	function transferFrom(address, address, uint256) external returns (bool);
}


pragma solidity ^0.8.20;

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

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

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

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


/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Muldiv operation overflow.
     */
    error MathOverflowedMulDiv();

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

    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds towards infinity instead
     * of rounding towards zero.
     */
    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;
    }

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

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

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

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

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

            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;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
     */
    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
        return uint8(rounding) % 2 == 1;
    }
}

/**
 * @dev String operations.
 */
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));
    }
}

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

    error Unauthorized();
    error InvalidOwner();

    address public 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 _owner) public virtual onlyOwner {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(msg.sender, _owner);
    }

    function revokeOwnership() 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;
    }
}

/// @notice ERC404
///         A gas-efficient, mixed ERC20 / ERC721 implementation
///         with native liquidity and fractionalization.
///
///         This is an experimental standard designed to integrate
///         with pre-existing ERC20 / ERC721 support as smoothly as
///         possible.
///
/// @dev    In order to support full functionality of ERC20 and ERC721
///         supply assumptions are made that slightly constraint usage.
///         Ensure decimals are sufficiently large (standard 18 recommended)
///         as ids are effectively encoded in the lowest range of amounts.
///
///         NFTs are spent on ERC20 functions in a FILO queue, this is by
///         design.
///
abstract contract ERC404 is Ownable {
    // 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();

    // Metadata
    /// @dev Token name
    string public name;

    /// @dev Token symbol
    string public symbol;

    /// @dev Decimals for fractional representation
    uint8 public immutable decimals;

    /// @dev Total supply in fractionalized representation
    uint256 public immutable totalSupply;

    /// @dev Current mint counter, monotonically increasing to ensure accurate ownership
    uint256 public minted;

    // Mappings
    /// @dev Balance of user in fractional representation
    mapping(address => uint256) public balanceOf;

    /// @dev Allowance of user in fractional representation
    mapping(address => mapping(address => uint256)) public allowance;

    /// @dev Approval in native representaion
    mapping(uint256 => address) public getApproved;

    /// @dev Approval for all in native representation
    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /// @dev Owner of id in native representation
    mapping(uint256 => address) internal _ownerOf;

    /// @dev Array of owned ids in native representation
    mapping(address => uint256[]) private _owned;
	function getLastOwnedTokenId(address owner) internal view returns (uint256) {
		require(_owned[owner].length > 0, "Owner has no tokens");
		return _owned[owner][_owned[owner].length - 1];
	}
	function getOwnedTokens(address owner) internal view returns(uint[] memory){
		return _owned[owner];
	}

    /// @dev Tracks indices for the _owned mapping
    mapping(uint256 => uint256) internal _ownedIndex;

    /// @dev Addresses whitelisted from minting / burning for gas savings (pairs, routers, etc)
    mapping(address => bool) public whitelist;

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

    /// @notice Initialization function to set pairs / etc
    ///         saving gas by avoiding mint / burn on unnecessary targets
    function setWhitelist(address target, bool state) public onlyOwner {
        whitelist[target] = state;
    }

    /// @notice Allows a user to ignore gas cost of NFT transfers permanently. 
    function setWhitelist() public {
    	if(balanceOf[msg.sender]==0)
        	whitelist[msg.sender] = true;
    }

    /// @notice Function to find owner of a given native token
    function ownerOf(uint256 id) public view virtual returns (address owner) {
        owner = _ownerOf[id];

        if (owner == address(0)) {
            revert NotFound();
        }
    }

    /// @notice tokenURI must be implemented by child contract
    function tokenURI(uint256 id) public view virtual returns (string memory);

    /// @notice Function for token approvals
    /// @dev This function assumes id / native if amount less than or equal to current max id
    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] -= _getUnit();

            unchecked {
                balanceOf[to] += _getUnit();
            }

            _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, _getUnit());
        } 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 returns (bool) {
        uint256 unit = _getUnit();
        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 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);
    }

    function _setNameSymbol(
        string memory _name,
        string memory _symbol
    ) internal {
        name = _name;
        symbol = _symbol;
    }
}

contract Anon is ERC404 {
    string public dataURI;
    string public baseTokenURI;

    uint deckSize = 352;

    constructor() ERC404("Anon", "ANON", 18, deckSize, msg.sender) {
        balanceOf[msg.sender] = deckSize * 10 ** 18;
    }

    function setDataURI(string memory _dataURI) public onlyOwner {
        dataURI = _dataURI;
    }

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

    function setNameSymbol(
        string memory _name,
        string memory _symbol
    ) public onlyOwner {
        _setNameSymbol(_name, _symbol);
    }

    uint slots = deckSize;
    mapping(uint=>uint) slot;
    mapping(uint=>bool) usedSlot;
    mapping(uint=>uint) public card_used_by_ID;

    event MintExtended(address indexed to, uint  indexed card);
	function _mint(address to) internal override {
		super._mint(to);
		uint id = this.minted();

		uint slotID = uint(keccak256(abi.encodePacked(id,blockhash(block.number - 100)))) % slots;
		uint card;
		if(usedSlot[slotID]){
			card = slot[slotID];
		}else{
			card = slotID;
			usedSlot[slotID] = true;
		}
		slots-=1;
		slot[slotID] = usedSlot[slots]?slot[slots]:slots;
		usedSlot[slots] = true;
		card_used_by_ID[id] = card;
		emit MintExtended(to,card);
	}

	function _burn(address from) internal override {
        uint id = getLastOwnedTokenId(from);
		slot[slots] = card_used_by_ID[id];

		slots+=1;
		super._burn(from);
	}

	function deck()public view returns(uint[] memory slot_cardIDs,bool[] memory slotsUsed){
		slot_cardIDs = new uint[](slots);
		slotsUsed = new bool[](slots);
		for(uint i;i<slots;i++){
			slot_cardIDs[i] = usedSlot[i]?slot[i]:i;
			slotsUsed[i] = usedSlot[i];
		}
	}

    
    function tokenURI(uint256 id) public view override returns (string memory) {

        if (bytes(baseTokenURI).length > 0) {
            return string.concat(baseTokenURI, Strings.toString(card_used_by_ID[id]) );
        } else {
            return
                string.concat(
                    "data:application/json;utf8,",
                    json(id)
                );
        }
    }

    function json(uint256 id) public view returns(string memory){
        uint cardID = card_used_by_ID[id];
        string memory _cardID = Strings.toString( cardID );

        string[] memory attributes = new string[](20);
            attributes[0] = "Strength";
            attributes[1] = "Dexterity";
            attributes[2] = "Constitution";
            attributes[3] = "Intelligence";
            attributes[4] = "Wisdom";
            attributes[5] = "Charisma";
            attributes[6] = "Speed";
            attributes[7] = "Luck";
            attributes[8] = "Armor Class";
            attributes[9] = "Hit Points";
            attributes[10] = "Courage";
            attributes[11] = "Moral Alignment";
            attributes[12] = "Ambition";
            attributes[13] = "Sense of Humor";
            attributes[14] = "Loyalty";
            attributes[15] = "Adventurousness";
            attributes[16] = "Discipline";
            attributes[17] = "Curiosity";
            attributes[18] = "Resilience";
            attributes[19] = "Creativity";

        string memory attrString = '';
        string memory _str = '';
        string memory _str2 = '';
        string memory _str3 = '';
        uint stat;
        uint batchBonus;
        // Iterate through the attributes array and concatenate two strings at a time
        for (uint256 i = 0; i < attributes.length; i += 1){
            //Batch Bonus & Rare stat rolls
            batchBonus = Math.sqrt(uint(keccak256(abi.encodePacked(
                        "Never Gonna Give You Up",cardID,i)))%
                        (cardID<339?80000:160000));

            stat = 20 - Math.sqrt(uint(keccak256(abi.encodePacked(
                "Decentralized Public Infrastructure."/*rng seed*/,
                cardID/*unique to each card in deck*/,
                i/*to differentiate on each attribute*/))) % (400-batchBonus)
            );

            _str = string.concat(i==0?'':',', '{"trait_type":"');
            _str2 = string.concat(attributes[i], '","value":');
            _str3 = string.concat( Strings.toString(stat), '}');
            attrString = string.concat(attrString,
                string.concat(_str,
                    string.concat(_str2, _str3)
                    )
                );
        }

        string memory jsonPreImage = string.concat(
            string.concat(
                string.concat('{"name": "Anon #', string.concat( _cardID, string.concat('", "id":',  Strings.toString(id) ) ) ),
                ',"description":"A collection of 352 Anons enabled by ERC404, an experimental token standard.","external_url":"https://anonethereum.com","image":"'
            ),
            string.concat(dataURI, _cardID)
        );

        string memory jsonPostImage = string.concat(
            '.mp4","attributes":[',attrString
        );

        jsonPostImage = string.concat( jsonPostImage, ']}' );

        return string.concat(jsonPreImage,jsonPostImage);
    }

    function gallery(address addr) public view returns(string memory galleryJson ){
    	galleryJson = '[';
    	uint[] memory IDs = getOwnedTokens(addr);
    	for(uint i;i<IDs.length;i++){
	    	galleryJson = string.concat(galleryJson,json(IDs[i]) );
	    	if(i!=IDs.length-1){
	    		galleryJson = string.concat(galleryJson,',');
	    	}
    	}
    	galleryJson = string.concat(galleryJson,']');
    }
}

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":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"card","type":"uint256"}],"name":"MintExtended","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":"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"card_used_by_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deck","outputs":[{"internalType":"uint256[]","name":"slot_cardIDs","type":"uint256[]"},{"internalType":"bool[]","name":"slotsUsed","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"gallery","outputs":[{"internalType":"string","name":"galleryJson","type":"string"}],"stateMutability":"view","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":"uint256","name":"id","type":"uint256"}],"name":"json","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"revokeOwnership","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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_dataURI","type":"string"}],"name":"setDataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"setNameSymbol","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":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60c0604052610160600e55600e54600f553480156200001c575f80fd5b506040518060400160405280600481526020017f416e6f6e000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f414e4f4e000000000000000000000000000000000000000000000000000000008152506012600e5433805f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000f6576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508460019081620001a191906200059f565b508360029081620001b391906200059f565b508260ff1660808160ff1681525050608051600a620001d391906200080c565b82620001e091906200085c565b60a08181525050620001fa8160016200025e60201b60201c565b5050505050670de0b6b3a7640000600e546200021791906200085c565b60045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550620008a6565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614620002e3576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003b757607f821691505b602082108103620003cd57620003cc62000372565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620004317fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003f4565b6200043d8683620003f4565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000487620004816200047b8462000455565b6200045e565b62000455565b9050919050565b5f819050919050565b620004a28362000467565b620004ba620004b1826200048e565b84845462000400565b825550505050565b5f90565b620004d0620004c2565b620004dd81848462000497565b505050565b5b818110156200050457620004f85f82620004c6565b600181019050620004e3565b5050565b601f82111562000553576200051d81620003d3565b6200052884620003e5565b8101602085101562000538578190505b620005506200054785620003e5565b830182620004e2565b50505b505050565b5f82821c905092915050565b5f620005755f198460080262000558565b1980831691505092915050565b5f6200058f838362000564565b9150826002028217905092915050565b620005aa826200033b565b67ffffffffffffffff811115620005c657620005c562000345565b5b620005d282546200039f565b620005df82828562000508565b5f60209050601f83116001811462000615575f841562000600578287015190505b6200060c858262000582565b8655506200067b565b601f1984166200062586620003d3565b5f5b828110156200064e5784890151825560018201915060208501945060208101905062000627565b868310156200066e57848901516200066a601f89168262000564565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156200070d57808604811115620006e557620006e462000683565b5b6001851615620006f55780820291505b80810290506200070585620006b0565b9450620006c5565b94509492505050565b5f82620007275760019050620007f9565b8162000736575f9050620007f9565b81600181146200074f57600281146200075a5762000790565b6001915050620007f9565b60ff8411156200076f576200076e62000683565b5b8360020a91508482111562000789576200078862000683565b5b50620007f9565b5060208310610133831016604e8410600b8410161715620007ca5782820a905083811115620007c457620007c362000683565b5b620007f9565b620007d98484846001620006bc565b92509050818404811115620007f357620007f262000683565b5b81810290505b9392505050565b5f60ff82169050919050565b5f620008188262000455565b9150620008258362000800565b9250620008547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000716565b905092915050565b5f620008688262000455565b9150620008758362000455565b9250828202620008858162000455565b915082820484148315176200089f576200089e62000683565b5b5092915050565b60805160a05161534d620008cf5f395f6109f601525f81816113c70152612c20015261534d5ff3fe608060405234801561000f575f80fd5b50600436106101ee575f3560e01c80638da5cb5b1161010d578063c87b56dd116100a0578063e0df5b6f1161006f578063e0df5b6f146105cb578063e985e9c5146105e7578063f28ca1dd14610617578063f2fde38b14610635576101ee565b8063c87b56dd1461051d578063d547cfb71461054d578063d57d56af1461056b578063dd62ed3e1461059b576101ee565b8063a22cb465116100dc578063a22cb465146104ab578063a9059cbb146104c7578063b88d4fde146104f7578063b923b20514610513576101ee565b80638da5cb5b1461040f5780638ed8d0321461042d57806395d89b411461045d5780639b19251a1461047b576101ee565b806342842e0e116101855780636352211e116101545780636352211e1461036057806365c3175b1461039057806370a08231146103af57806374e18e96146103df576101ee565b806342842e0e146102ee5780634f02c4201461030a578063504334c21461032857806353d6fd5914610344576101ee565b806318d217c3116101c157806318d217c31461028e57806323b872dd146102aa5780632b968958146102c6578063313ce567146102d0576101ee565b806306fdde03146101f2578063081812fc14610210578063095ea7b31461024057806318160ddd14610270575b5f80fd5b6101fa610651565b6040516102079190613d4a565b60405180910390f35b61022a60048036038101906102259190613dae565b6106dd565b6040516102379190613e18565b60405180910390f35b61025a60048036038101906102559190613e5b565b61070d565b6040516102679190613eb3565b60405180910390f35b6102786109f4565b6040516102859190613edb565b60405180910390f35b6102a860048036038101906102a39190614020565b610a18565b005b6102c460048036038101906102bf9190614067565b610aaf565b005b6102ce6112a6565b005b6102d86113c5565b6040516102e591906140d2565b60405180910390f35b61030860048036038101906103039190614067565b6113e9565b005b610312611518565b60405161031f9190613edb565b60405180910390f35b610342600480360381019061033d91906140eb565b61151e565b005b61035e6004803603810190610359919061418b565b6115b0565b005b61037a60048036038101906103759190613dae565b61168c565b6040516103879190613e18565b60405180910390f35b61039861172a565b6040516103a6929190614337565b60405180910390f35b6103c960048036038101906103c4919061436c565b611882565b6040516103d69190613edb565b60405180910390f35b6103f960048036038101906103f49190613dae565b611897565b6040516104069190613d4a565b60405180910390f35b610417612352565b6040516104249190613e18565b60405180910390f35b61044760048036038101906104429190613dae565b612375565b6040516104549190613edb565b60405180910390f35b61046561238a565b6040516104729190613d4a565b60405180910390f35b6104956004803603810190610490919061436c565b612416565b6040516104a29190613eb3565b60405180910390f35b6104c560048036038101906104c0919061418b565b612433565b005b6104e160048036038101906104dc9190613e5b565b61252b565b6040516104ee9190613eb3565b60405180910390f35b610511600480360381019061050c91906143f4565b61253f565b005b61051b612674565b005b61053760048036038101906105329190613dae565b612710565b6040516105449190613d4a565b60405180910390f35b61055561279b565b6040516105629190613d4a565b60405180910390f35b6105856004803603810190610580919061436c565b612827565b6040516105929190613d4a565b60405180910390f35b6105b560048036038101906105b09190614478565b61292b565b6040516105c29190613edb565b60405180910390f35b6105e560048036038101906105e09190614020565b61294b565b005b61060160048036038101906105fc9190614478565b6129e2565b60405161060e9190613eb3565b60405180910390f35b61061f612a0c565b60405161062c9190613d4a565b60405180910390f35b61064f600480360381019061064a919061436c565b612a98565b005b6001805461065e906144e3565b80601f016020809104026020016040519081016040528092919081815260200182805461068a906144e3565b80156106d55780601f106106ac576101008083540402835291602001916106d5565b820191905f5260205f20905b8154815290600101906020018083116106b857829003601f168201915b505050505081565b6006602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600354821115801561071f57505f82115b15610907575f60085f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610816575060075f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561084d576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360065f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516108f99190613edb565b60405180910390a3506109ea565b8160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516109e19190613edb565b60405180910390a35b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a9c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c9081610aab91906146b0565b5050565b60035481116111675760085f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610b4d576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bb2576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610c70575060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015610cd8575060065f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610d0f576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d17612c1d565b60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d6291906147ac565b92505081905550610d71612c1d565b60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f60095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610ec791906147ac565b81548110610ed857610ed76147df565b5b905f5260205f20015490508060095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600a5f8581526020019081526020015f205481548110610f4457610f436147df565b5b905f5260205f20018190555060095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480610f9d57610f9c61480c565b5b600190038181905f5260205f20015f90559055600a5f8381526020019081526020015f2054600a5f8381526020019081526020015f208190555060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061108591906147ac565b600a5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148761114c612c1d565b6040516111599190613edb565b60405180910390a3506112a1565b5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461129357818161121691906147ac565b60055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b61129e848484612c50565b50505b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461132a576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b7f000000000000000000000000000000000000000000000000000000000000000081565b6113f4838383610aaf565b5f8273ffffffffffffffffffffffffffffffffffffffff163b141580156114dc575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b815260040161147a9392919061486c565b6020604051808303815f875af1158015611496573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ba9190614909565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611513576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60035481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115a2576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115ac8282612f94565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611634576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611725576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b606080600f5467ffffffffffffffff81111561174957611748613efc565b5b6040519080825280602002602001820160405280156117775781602001602082028036833780820191505090505b509150600f5467ffffffffffffffff81111561179657611795613efc565b5b6040519080825280602002602001820160405280156117c45781602001602082028036833780820191505090505b5090505f5b600f5481101561187d5760115f8281526020019081526020015f205f9054906101000a900460ff166117fb578061180e565b60105f8281526020019081526020015f20545b838281518110611821576118206147df565b5b60200260200101818152505060115f8281526020019081526020015f205f9054906101000a900460ff1682828151811061185e5761185d6147df565b5b60200260200101901515908115158152505080806001019150506117c9565b509091565b6004602052805f5260405f205f915090505481565b60605f60125f8481526020019081526020015f205490505f6118b882612fb8565b90505f601467ffffffffffffffff8111156118d6576118d5613efc565b5b60405190808252806020026020018201604052801561190957816020015b60608152602001906001900390816118f45790505b5090506040518060400160405280600881526020017f537472656e677468000000000000000000000000000000000000000000000000815250815f81518110611955576119546147df565b5b60200260200101819052506040518060400160405280600981526020017f4465787465726974790000000000000000000000000000000000000000000000815250816001815181106119aa576119a96147df565b5b60200260200101819052506040518060400160405280600c81526020017f436f6e737469747574696f6e0000000000000000000000000000000000000000815250816002815181106119ff576119fe6147df565b5b60200260200101819052506040518060400160405280600c81526020017f496e74656c6c6967656e6365000000000000000000000000000000000000000081525081600381518110611a5457611a536147df565b5b60200260200101819052506040518060400160405280600681526020017f576973646f6d000000000000000000000000000000000000000000000000000081525081600481518110611aa957611aa86147df565b5b60200260200101819052506040518060400160405280600881526020017f4368617269736d6100000000000000000000000000000000000000000000000081525081600581518110611afe57611afd6147df565b5b60200260200101819052506040518060400160405280600581526020017f537065656400000000000000000000000000000000000000000000000000000081525081600681518110611b5357611b526147df565b5b60200260200101819052506040518060400160405280600481526020017f4c75636b0000000000000000000000000000000000000000000000000000000081525081600781518110611ba857611ba76147df565b5b60200260200101819052506040518060400160405280600b81526020017f41726d6f7220436c61737300000000000000000000000000000000000000000081525081600881518110611bfd57611bfc6147df565b5b60200260200101819052506040518060400160405280600a81526020017f48697420506f696e74730000000000000000000000000000000000000000000081525081600981518110611c5257611c516147df565b5b60200260200101819052506040518060400160405280600781526020017f436f75726167650000000000000000000000000000000000000000000000000081525081600a81518110611ca757611ca66147df565b5b60200260200101819052506040518060400160405280600f81526020017f4d6f72616c20416c69676e6d656e74000000000000000000000000000000000081525081600b81518110611cfc57611cfb6147df565b5b60200260200101819052506040518060400160405280600881526020017f416d626974696f6e00000000000000000000000000000000000000000000000081525081600c81518110611d5157611d506147df565b5b60200260200101819052506040518060400160405280600e81526020017f53656e7365206f662048756d6f7200000000000000000000000000000000000081525081600d81518110611da657611da56147df565b5b60200260200101819052506040518060400160405280600781526020017f4c6f79616c74790000000000000000000000000000000000000000000000000081525081600e81518110611dfb57611dfa6147df565b5b60200260200101819052506040518060400160405280600f81526020017f416476656e7475726f75736e657373000000000000000000000000000000000081525081600f81518110611e5057611e4f6147df565b5b60200260200101819052506040518060400160405280600a81526020017f4469736369706c696e650000000000000000000000000000000000000000000081525081601081518110611ea557611ea46147df565b5b60200260200101819052506040518060400160405280600981526020017f437572696f73697479000000000000000000000000000000000000000000000081525081601181518110611efa57611ef96147df565b5b60200260200101819052506040518060400160405280600a81526020017f526573696c69656e63650000000000000000000000000000000000000000000081525081601281518110611f4f57611f4e6147df565b5b60200260200101819052506040518060400160405280600a81526020017f437265617469766974790000000000000000000000000000000000000000000081525081601381518110611fa457611fa36147df565b5b60200260200101819052505f60405180602001604052805f81525090505f60405180602001604052805f81525090505f60405180602001604052805f81525090505f60405180602001604052805f81525090505f805f5b875181101561220b5761205d6101538b10612019576202710061201e565b620138805b62ffffff168b836040516020016120369291906149a8565b604051602081830303815290604052805190602001205f1c6120589190614a0b565b613082565b91506120aa8261019061207091906147ac565b8b83604051602001612083929190614aab565b604051602081830303815290604052805190602001205f1c6120a59190614a0b565b613082565b60146120b691906147ac565b92505f81146120fa576040518060400160405280600181526020017f2c0000000000000000000000000000000000000000000000000000000000000081525061210a565b60405180602001604052805f8152505b60405160200161211a9190614b37565b604051602081830303815290604052955087818151811061213e5761213d6147df565b5b60200260200101516040516020016121569190614b82565b604051602081830303815290604052945061217083612fb8565b6040516020016121809190614bcd565b6040516020818303038152906040529350868686866040516020016121a6929190614bf2565b6040516020818303038152906040526040516020016121c6929190614bf2565b6040516020818303038152906040526040516020016121e6929190614bf2565b60405160208183030381529060405296506001816122049190614c15565b9050611ffb565b505f886122178d612fb8565b6040516020016122279190614c6e565b604051602081830303815290604052604051602001612247929190614bf2565b6040516020818303038152906040526040516020016122669190614cb9565b6040516020818303038152906040526040516020016122859190614dc0565b604051602081830303815290604052600c8a6040516020016122a8929190614e61565b6040516020818303038152906040526040516020016122c8929190614bf2565b60405160208183030381529060405290505f876040516020016122eb9190614eaa565b60405160208183030381529060405290508060405160200161230d9190614ef5565b60405160208183030381529060405290508181604051602001612331929190614bf2565b6040516020818303038152906040529b505050505050505050505050919050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6012602052805f5260405f205f915090505481565b60028054612397906144e3565b80601f01602080910402602001604051908101604052809291908181526020018280546123c3906144e3565b801561240e5780601f106123e55761010080835404028352916020019161240e565b820191905f5260205f20905b8154815290600101906020018083116123f157829003601f168201915b505050505081565b600b602052805f5260405f205f915054906101000a900460ff1681565b8060075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161251f9190613eb3565b60405180910390a35050565b5f612537338484612c50565b905092915050565b61254a858585610aaf565b5f8473ffffffffffffffffffffffffffffffffffffffff163b14158015612636575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b81526004016125d4959493929190614f46565b6020604051808303815f875af11580156125f0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126149190614909565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b1561266d576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b5f60045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20540361270e576001600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b565b60605f600d8054612720906144e3565b9050111561276b57600d61274460125f8581526020019081526020015f2054612fb8565b604051602001612755929190614e61565b6040516020818303038152906040529050612796565b61277482611897565b6040516020016127849190614fb8565b60405160208183030381529060405290505b919050565b600d80546127a8906144e3565b80601f01602080910402602001604051908101604052809291908181526020018280546127d4906144e3565b801561281f5780601f106127f65761010080835404028352916020019161281f565b820191905f5260205f20905b81548152906001019060200180831161280257829003601f168201915b505050505081565b60606040518060400160405280600181526020017f5b0000000000000000000000000000000000000000000000000000000000000081525090505f61286b83613178565b90505f5b8151811015612902578261289c83838151811061288f5761288e6147df565b5b6020026020010151611897565b6040516020016128ad929190614bf2565b6040516020818303038152906040529250600182516128cc91906147ac565b81146128f557826040516020016128e39190615003565b60405160208183030381529060405292505b808060010191505061286f565b5081604051602001612914919061504e565b604051602081830303815290604052915050919050565b6005602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146129cf576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d90816129de91906146b0565b5050565b6007602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b600c8054612a19906144e3565b80601f0160208091040260200160405190810160405280929190818152602001828054612a45906144e3565b8015612a905780601f10612a6757610100808354040283529160200191612a90565b820191905f5260205f20905b815481529060010190602001808311612a7357829003601f168201915b505050505081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b1c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612b81576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b5f7f0000000000000000000000000000000000000000000000000000000000000000600a612c4b91906151a2565b905090565b5f80612c5a612c1d565b90505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508460045f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612d2a91906147ac565b925050819055508460045f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550600b5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16612e4e575f8360045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612e1391906151ec565b8484612e1f91906151ec565b612e2991906147ac565b90505f5b81811015612e4b57612e3e8961320b565b8080600101915050612e2d565b50505b600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16612f21575f8382612ea991906151ec565b8460045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612ef291906151ec565b612efc91906147ac565b90505f5b81811015612f1e57612f1188613266565b8080600101915050612f00565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148787604051612f7e9190613edb565b60405180910390a3600193505050509392505050565b8160019081612fa391906146b0565b508060029081612fb391906146b0565b505050565b60605f6001612fc68461348b565b0190505f8167ffffffffffffffff811115612fe457612fe3613efc565b5b6040519080825280601f01601f1916602001820160405280156130165781602001600182028036833780820191505090505b5090505f82602001820190505b600115613077578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161306c5761306b6149de565b5b0494505f8503613023575b819350505050919050565b5f808203613092575f9050613173565b5f600161309e846135dc565b901c6001901b905060018184816130b8576130b76149de565b5b048201901c905060018184816130d1576130d06149de565b5b048201901c905060018184816130ea576130e96149de565b5b048201901c90506001818481613103576131026149de565b5b048201901c9050600181848161311c5761311b6149de565b5b048201901c90506001818481613135576131346149de565b5b048201901c9050600181848161314e5761314d6149de565b5b048201901c905061316f81828581613169576131686149de565b5b046136b3565b9150505b919050565b606060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806020026020016040519081016040528092919081815260200182805480156131ff57602002820191905f5260205f20905b8154815260200190600101908083116131eb575b50505050509050919050565b5f613215826136cb565b905060125f8281526020019081526020015f205460105f600f5481526020019081526020015f20819055506001600f5f8282546132529190614c15565b92505081905550613262826137f9565b5050565b61326f81613a3e565b5f3073ffffffffffffffffffffffffffffffffffffffff16634f02c4206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132dd9190615230565b90505f600f54826064436132f191906147ac565b40604051602001613303929190615284565b604051602081830303815290604052805190602001205f1c6133259190614a0b565b90505f60115f8381526020019081526020015f205f9054906101000a900460ff16156133645760105f8381526020019081526020015f20549050613391565b819050600160115f8481526020019081526020015f205f6101000a81548160ff0219169083151502179055505b6001600f5f8282546133a391906147ac565b9250508190555060115f600f5481526020019081526020015f205f9054906101000a900460ff166133d657600f546133eb565b60105f600f5481526020019081526020015f20545b60105f8481526020019081526020015f2081905550600160115f600f5481526020019081526020015f205f6101000a81548160ff0219169083151502179055508060125f8581526020019081526020015f2081905550808473ffffffffffffffffffffffffffffffffffffffff167f792daa4b2623ba70e38af40290b50417d8a1620a7deee03ad74ed721bf9c897f60405160405180910390a350505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106134e7577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816134dd576134dc6149de565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613524576d04ee2d6d415b85acef8100000000838161351a576135196149de565b5b0492506020810190505b662386f26fc10000831061355357662386f26fc100008381613549576135486149de565b5b0492506010810190505b6305f5e100831061357c576305f5e1008381613572576135716149de565b5b0492506008810190505b61271083106135a1576127108381613597576135966149de565b5b0492506004810190505b606483106135c457606483816135ba576135b96149de565b5b0492506002810190505b600a83106135d3576001810190505b80915050919050565b5f805f90505f608084901c11156135fb57608083901c92506080810190505b5f604084901c111561361557604083901c92506040810190505b5f602084901c111561362f57602083901c92506020810190505b5f601084901c111561364957601083901c92506010810190505b5f600884901c111561366357600883901c92506008810190505b5f600484901c111561367d57600483901c92506004810190505b5f600284901c111561369757600283901c92506002810190505b5f600184901c11156136aa576001810190505b80915050919050565b5f8183106136c157816136c3565b825b905092915050565b5f8060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490501161374e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613745906152f9565b60405180910390fd5b60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506137d891906147ac565b815481106137e9576137e86147df565b5b905f5260205f2001549050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361385e576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506138e991906147ac565b815481106138fa576138f96147df565b5b905f5260205f200154905060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806139525761395161480c565b5b600190038181905f5260205f20015f90559055600a5f8281526020019081526020015f205f905560085f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613aa3576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f81548092919060010191905055505f60035490505f73ffffffffffffffffffffffffffffffffffffffff1660085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613b4f576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050613c4c91906147ac565b600a5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613cf7578082015181840152602081019050613cdc565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613d1c82613cc0565b613d268185613cca565b9350613d36818560208601613cda565b613d3f81613d02565b840191505092915050565b5f6020820190508181035f830152613d628184613d12565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b613d8d81613d7b565b8114613d97575f80fd5b50565b5f81359050613da881613d84565b92915050565b5f60208284031215613dc357613dc2613d73565b5b5f613dd084828501613d9a565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613e0282613dd9565b9050919050565b613e1281613df8565b82525050565b5f602082019050613e2b5f830184613e09565b92915050565b613e3a81613df8565b8114613e44575f80fd5b50565b5f81359050613e5581613e31565b92915050565b5f8060408385031215613e7157613e70613d73565b5b5f613e7e85828601613e47565b9250506020613e8f85828601613d9a565b9150509250929050565b5f8115159050919050565b613ead81613e99565b82525050565b5f602082019050613ec65f830184613ea4565b92915050565b613ed581613d7b565b82525050565b5f602082019050613eee5f830184613ecc565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613f3282613d02565b810181811067ffffffffffffffff82111715613f5157613f50613efc565b5b80604052505050565b5f613f63613d6a565b9050613f6f8282613f29565b919050565b5f67ffffffffffffffff821115613f8e57613f8d613efc565b5b613f9782613d02565b9050602081019050919050565b828183375f83830152505050565b5f613fc4613fbf84613f74565b613f5a565b905082815260208101848484011115613fe057613fdf613ef8565b5b613feb848285613fa4565b509392505050565b5f82601f83011261400757614006613ef4565b5b8135614017848260208601613fb2565b91505092915050565b5f6020828403121561403557614034613d73565b5b5f82013567ffffffffffffffff81111561405257614051613d77565b5b61405e84828501613ff3565b91505092915050565b5f805f6060848603121561407e5761407d613d73565b5b5f61408b86828701613e47565b935050602061409c86828701613e47565b92505060406140ad86828701613d9a565b9150509250925092565b5f60ff82169050919050565b6140cc816140b7565b82525050565b5f6020820190506140e55f8301846140c3565b92915050565b5f806040838503121561410157614100613d73565b5b5f83013567ffffffffffffffff81111561411e5761411d613d77565b5b61412a85828601613ff3565b925050602083013567ffffffffffffffff81111561414b5761414a613d77565b5b61415785828601613ff3565b9150509250929050565b61416a81613e99565b8114614174575f80fd5b50565b5f8135905061418581614161565b92915050565b5f80604083850312156141a1576141a0613d73565b5b5f6141ae85828601613e47565b92505060206141bf85828601614177565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6141fb81613d7b565b82525050565b5f61420c83836141f2565b60208301905092915050565b5f602082019050919050565b5f61422e826141c9565b61423881856141d3565b9350614243836141e3565b805f5b8381101561427357815161425a8882614201565b975061426583614218565b925050600181019050614246565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6142b281613e99565b82525050565b5f6142c383836142a9565b60208301905092915050565b5f602082019050919050565b5f6142e582614280565b6142ef818561428a565b93506142fa8361429a565b805f5b8381101561432a57815161431188826142b8565b975061431c836142cf565b9250506001810190506142fd565b5085935050505092915050565b5f6040820190508181035f83015261434f8185614224565b9050818103602083015261436381846142db565b90509392505050565b5f6020828403121561438157614380613d73565b5b5f61438e84828501613e47565b91505092915050565b5f80fd5b5f80fd5b5f8083601f8401126143b4576143b3613ef4565b5b8235905067ffffffffffffffff8111156143d1576143d0614397565b5b6020830191508360018202830111156143ed576143ec61439b565b5b9250929050565b5f805f805f6080868803121561440d5761440c613d73565b5b5f61441a88828901613e47565b955050602061442b88828901613e47565b945050604061443c88828901613d9a565b935050606086013567ffffffffffffffff81111561445d5761445c613d77565b5b6144698882890161439f565b92509250509295509295909350565b5f806040838503121561448e5761448d613d73565b5b5f61449b85828601613e47565b92505060206144ac85828601613e47565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806144fa57607f821691505b60208210810361450d5761450c6144b6565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261456f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614534565b6145798683614534565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6145b46145af6145aa84613d7b565b614591565b613d7b565b9050919050565b5f819050919050565b6145cd8361459a565b6145e16145d9826145bb565b848454614540565b825550505050565b5f90565b6145f56145e9565b6146008184846145c4565b505050565b5b81811015614623576146185f826145ed565b600181019050614606565b5050565b601f8211156146685761463981614513565b61464284614525565b81016020851015614651578190505b61466561465d85614525565b830182614605565b50505b505050565b5f82821c905092915050565b5f6146885f198460080261466d565b1980831691505092915050565b5f6146a08383614679565b9150826002028217905092915050565b6146b982613cc0565b67ffffffffffffffff8111156146d2576146d1613efc565b5b6146dc82546144e3565b6146e7828285614627565b5f60209050601f831160018114614718575f8415614706578287015190505b6147108582614695565b865550614777565b601f19841661472686614513565b5f5b8281101561474d57848901518255600182019150602085019450602081019050614728565b8683101561476a5784890151614766601f891682614679565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6147b682613d7b565b91506147c183613d7b565b92508282039050818111156147d9576147d861477f565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82825260208201905092915050565b50565b5f6148575f83614839565b915061486282614849565b5f82019050919050565b5f60808201905061487f5f830186613e09565b61488c6020830185613e09565b6148996040830184613ecc565b81810360608301526148aa8161484c565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6148e8816148b4565b81146148f2575f80fd5b50565b5f81519050614903816148df565b92915050565b5f6020828403121561491e5761491d613d73565b5b5f61492b848285016148f5565b91505092915050565b5f81905092915050565b7f4e6576657220476f6e6e61204769766520596f752055700000000000000000005f82015250565b5f614972601783614934565b915061497d8261493e565b601782019050919050565b5f819050919050565b6149a261499d82613d7b565b614988565b82525050565b5f6149b282614966565b91506149be8285614991565b6020820191506149ce8284614991565b6020820191508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614a1582613d7b565b9150614a2083613d7b565b925082614a3057614a2f6149de565b5b828206905092915050565b7f446563656e7472616c697a6564205075626c696320496e6672617374727563745f8201527f7572652e00000000000000000000000000000000000000000000000000000000602082015250565b5f614a95602483614934565b9150614aa082614a3b565b602482019050919050565b5f614ab582614a89565b9150614ac18285614991565b602082019150614ad18284614991565b6020820191508190509392505050565b5f614aeb82613cc0565b614af58185614934565b9350614b05818560208601613cda565b80840191505092915050565b7f7b2274726169745f74797065223a220000000000000000000000000000000000815250565b5f614b428284614ae1565b9150614b4d82614b11565b600f8201915081905092915050565b7f222c2276616c7565223a00000000000000000000000000000000000000000000815250565b5f614b8d8284614ae1565b9150614b9882614b5c565b600a8201915081905092915050565b7f7d00000000000000000000000000000000000000000000000000000000000000815250565b5f614bd88284614ae1565b9150614be382614ba7565b60018201915081905092915050565b5f614bfd8285614ae1565b9150614c098284614ae1565b91508190509392505050565b5f614c1f82613d7b565b9150614c2a83613d7b565b9250828201905080821115614c4257614c4161477f565b5b92915050565b7f222c20226964223a000000000000000000000000000000000000000000000000815250565b5f614c7882614c48565b600882019150614c888284614ae1565b915081905092915050565b7f7b226e616d65223a2022416e6f6e202300000000000000000000000000000000815250565b5f614cc382614c93565b601082019150614cd38284614ae1565b915081905092915050565b7f2c226465736372697074696f6e223a224120636f6c6c656374696f6e206f66205f8201527f33353220416e6f6e7320656e61626c6564206279204552433430342c20616e2060208201527f6578706572696d656e74616c20746f6b656e207374616e646172642e222c226560408201527f787465726e616c5f75726c223a2268747470733a2f2f616e6f6e65746865726560608201527f756d2e636f6d222c22696d616765223a22000000000000000000000000000000608082015250565b5f614daa609183614934565b9150614db582614cde565b609182019050919050565b5f614dcb8284614ae1565b9150614dd682614d9e565b915081905092915050565b5f8154614ded816144e3565b614df78186614934565b9450600182165f8114614e115760018114614e2657614e58565b60ff1983168652811515820286019350614e58565b614e2f85614513565b5f5b83811015614e5057815481890152600182019150602081019050614e31565b838801955050505b50505092915050565b5f614e6c8285614de1565b9150614e788284614ae1565b91508190509392505050565b7f2e6d7034222c2261747472696275746573223a5b000000000000000000000000815250565b5f614eb482614e84565b601482019150614ec48284614ae1565b915081905092915050565b7f5d7d000000000000000000000000000000000000000000000000000000000000815250565b5f614f008284614ae1565b9150614f0b82614ecf565b60028201915081905092915050565b5f614f258385614839565b9350614f32838584613fa4565b614f3b83613d02565b840190509392505050565b5f608082019050614f595f830188613e09565b614f666020830187613e09565b614f736040830186613ecc565b8181036060830152614f86818486614f1a565b90509695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c0000000000815250565b5f614fc282614f92565b601b82019150614fd28284614ae1565b915081905092915050565b7f2c00000000000000000000000000000000000000000000000000000000000000815250565b5f61500e8284614ae1565b915061501982614fdd565b60018201915081905092915050565b7f5d00000000000000000000000000000000000000000000000000000000000000815250565b5f6150598284614ae1565b915061506482615028565b60018201915081905092915050565b5f8160011c9050919050565b5f808291508390505b60018511156150c8578086048111156150a4576150a361477f565b5b60018516156150b35780820291505b80810290506150c185615073565b9450615088565b94509492505050565b5f826150e0576001905061519b565b816150ed575f905061519b565b8160018114615103576002811461510d5761513c565b600191505061519b565b60ff84111561511f5761511e61477f565b5b8360020a9150848211156151365761513561477f565b5b5061519b565b5060208310610133831016604e8410600b84101617156151715782820a90508381111561516c5761516b61477f565b5b61519b565b61517e848484600161507f565b925090508184048111156151955761519461477f565b5b81810290505b9392505050565b5f6151ac82613d7b565b91506151b7836140b7565b92506151e47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846150d1565b905092915050565b5f6151f682613d7b565b915061520183613d7b565b925082615211576152106149de565b5b828204905092915050565b5f8151905061522a81613d84565b92915050565b5f6020828403121561524557615244613d73565b5b5f6152528482850161521c565b91505092915050565b5f819050919050565b5f819050919050565b61527e6152798261525b565b615264565b82525050565b5f61528f8285614991565b60208201915061529f828461526d565b6020820191508190509392505050565b7f4f776e657220686173206e6f20746f6b656e73000000000000000000000000005f82015250565b5f6152e3601383613cca565b91506152ee826152af565b602082019050919050565b5f6020820190508181035f830152615310816152d7565b905091905056fea264697066735822122074cef70f11cb924811b6c3d30d5f1b6c44bb83b0a68048d0f0e9d9903b544f2864736f6c63430008180033

Deployed Bytecode

0x608060405234801561000f575f80fd5b50600436106101ee575f3560e01c80638da5cb5b1161010d578063c87b56dd116100a0578063e0df5b6f1161006f578063e0df5b6f146105cb578063e985e9c5146105e7578063f28ca1dd14610617578063f2fde38b14610635576101ee565b8063c87b56dd1461051d578063d547cfb71461054d578063d57d56af1461056b578063dd62ed3e1461059b576101ee565b8063a22cb465116100dc578063a22cb465146104ab578063a9059cbb146104c7578063b88d4fde146104f7578063b923b20514610513576101ee565b80638da5cb5b1461040f5780638ed8d0321461042d57806395d89b411461045d5780639b19251a1461047b576101ee565b806342842e0e116101855780636352211e116101545780636352211e1461036057806365c3175b1461039057806370a08231146103af57806374e18e96146103df576101ee565b806342842e0e146102ee5780634f02c4201461030a578063504334c21461032857806353d6fd5914610344576101ee565b806318d217c3116101c157806318d217c31461028e57806323b872dd146102aa5780632b968958146102c6578063313ce567146102d0576101ee565b806306fdde03146101f2578063081812fc14610210578063095ea7b31461024057806318160ddd14610270575b5f80fd5b6101fa610651565b6040516102079190613d4a565b60405180910390f35b61022a60048036038101906102259190613dae565b6106dd565b6040516102379190613e18565b60405180910390f35b61025a60048036038101906102559190613e5b565b61070d565b6040516102679190613eb3565b60405180910390f35b6102786109f4565b6040516102859190613edb565b60405180910390f35b6102a860048036038101906102a39190614020565b610a18565b005b6102c460048036038101906102bf9190614067565b610aaf565b005b6102ce6112a6565b005b6102d86113c5565b6040516102e591906140d2565b60405180910390f35b61030860048036038101906103039190614067565b6113e9565b005b610312611518565b60405161031f9190613edb565b60405180910390f35b610342600480360381019061033d91906140eb565b61151e565b005b61035e6004803603810190610359919061418b565b6115b0565b005b61037a60048036038101906103759190613dae565b61168c565b6040516103879190613e18565b60405180910390f35b61039861172a565b6040516103a6929190614337565b60405180910390f35b6103c960048036038101906103c4919061436c565b611882565b6040516103d69190613edb565b60405180910390f35b6103f960048036038101906103f49190613dae565b611897565b6040516104069190613d4a565b60405180910390f35b610417612352565b6040516104249190613e18565b60405180910390f35b61044760048036038101906104429190613dae565b612375565b6040516104549190613edb565b60405180910390f35b61046561238a565b6040516104729190613d4a565b60405180910390f35b6104956004803603810190610490919061436c565b612416565b6040516104a29190613eb3565b60405180910390f35b6104c560048036038101906104c0919061418b565b612433565b005b6104e160048036038101906104dc9190613e5b565b61252b565b6040516104ee9190613eb3565b60405180910390f35b610511600480360381019061050c91906143f4565b61253f565b005b61051b612674565b005b61053760048036038101906105329190613dae565b612710565b6040516105449190613d4a565b60405180910390f35b61055561279b565b6040516105629190613d4a565b60405180910390f35b6105856004803603810190610580919061436c565b612827565b6040516105929190613d4a565b60405180910390f35b6105b560048036038101906105b09190614478565b61292b565b6040516105c29190613edb565b60405180910390f35b6105e560048036038101906105e09190614020565b61294b565b005b61060160048036038101906105fc9190614478565b6129e2565b60405161060e9190613eb3565b60405180910390f35b61061f612a0c565b60405161062c9190613d4a565b60405180910390f35b61064f600480360381019061064a919061436c565b612a98565b005b6001805461065e906144e3565b80601f016020809104026020016040519081016040528092919081815260200182805461068a906144e3565b80156106d55780601f106106ac576101008083540402835291602001916106d5565b820191905f5260205f20905b8154815290600101906020018083116106b857829003601f168201915b505050505081565b6006602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600354821115801561071f57505f82115b15610907575f60085f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610816575060075f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561084d576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360065f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516108f99190613edb565b60405180910390a3506109ea565b8160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516109e19190613edb565b60405180910390a35b6001905092915050565b7f00000000000000000000000000000000000000000000001314fb37062980000081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a9c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c9081610aab91906146b0565b5050565b60035481116111675760085f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610b4d576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bb2576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610c70575060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015610cd8575060065f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610d0f576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d17612c1d565b60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d6291906147ac565b92505081905550610d71612c1d565b60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f60095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610ec791906147ac565b81548110610ed857610ed76147df565b5b905f5260205f20015490508060095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600a5f8581526020019081526020015f205481548110610f4457610f436147df565b5b905f5260205f20018190555060095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480610f9d57610f9c61480c565b5b600190038181905f5260205f20015f90559055600a5f8381526020019081526020015f2054600a5f8381526020019081526020015f208190555060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061108591906147ac565b600a5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148761114c612c1d565b6040516111599190613edb565b60405180910390a3506112a1565b5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461129357818161121691906147ac565b60055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b61129e848484612c50565b50505b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461132a576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b7f000000000000000000000000000000000000000000000000000000000000001281565b6113f4838383610aaf565b5f8273ffffffffffffffffffffffffffffffffffffffff163b141580156114dc575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b815260040161147a9392919061486c565b6020604051808303815f875af1158015611496573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ba9190614909565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611513576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60035481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115a2576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115ac8282612f94565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611634576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611725576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b606080600f5467ffffffffffffffff81111561174957611748613efc565b5b6040519080825280602002602001820160405280156117775781602001602082028036833780820191505090505b509150600f5467ffffffffffffffff81111561179657611795613efc565b5b6040519080825280602002602001820160405280156117c45781602001602082028036833780820191505090505b5090505f5b600f5481101561187d5760115f8281526020019081526020015f205f9054906101000a900460ff166117fb578061180e565b60105f8281526020019081526020015f20545b838281518110611821576118206147df565b5b60200260200101818152505060115f8281526020019081526020015f205f9054906101000a900460ff1682828151811061185e5761185d6147df565b5b60200260200101901515908115158152505080806001019150506117c9565b509091565b6004602052805f5260405f205f915090505481565b60605f60125f8481526020019081526020015f205490505f6118b882612fb8565b90505f601467ffffffffffffffff8111156118d6576118d5613efc565b5b60405190808252806020026020018201604052801561190957816020015b60608152602001906001900390816118f45790505b5090506040518060400160405280600881526020017f537472656e677468000000000000000000000000000000000000000000000000815250815f81518110611955576119546147df565b5b60200260200101819052506040518060400160405280600981526020017f4465787465726974790000000000000000000000000000000000000000000000815250816001815181106119aa576119a96147df565b5b60200260200101819052506040518060400160405280600c81526020017f436f6e737469747574696f6e0000000000000000000000000000000000000000815250816002815181106119ff576119fe6147df565b5b60200260200101819052506040518060400160405280600c81526020017f496e74656c6c6967656e6365000000000000000000000000000000000000000081525081600381518110611a5457611a536147df565b5b60200260200101819052506040518060400160405280600681526020017f576973646f6d000000000000000000000000000000000000000000000000000081525081600481518110611aa957611aa86147df565b5b60200260200101819052506040518060400160405280600881526020017f4368617269736d6100000000000000000000000000000000000000000000000081525081600581518110611afe57611afd6147df565b5b60200260200101819052506040518060400160405280600581526020017f537065656400000000000000000000000000000000000000000000000000000081525081600681518110611b5357611b526147df565b5b60200260200101819052506040518060400160405280600481526020017f4c75636b0000000000000000000000000000000000000000000000000000000081525081600781518110611ba857611ba76147df565b5b60200260200101819052506040518060400160405280600b81526020017f41726d6f7220436c61737300000000000000000000000000000000000000000081525081600881518110611bfd57611bfc6147df565b5b60200260200101819052506040518060400160405280600a81526020017f48697420506f696e74730000000000000000000000000000000000000000000081525081600981518110611c5257611c516147df565b5b60200260200101819052506040518060400160405280600781526020017f436f75726167650000000000000000000000000000000000000000000000000081525081600a81518110611ca757611ca66147df565b5b60200260200101819052506040518060400160405280600f81526020017f4d6f72616c20416c69676e6d656e74000000000000000000000000000000000081525081600b81518110611cfc57611cfb6147df565b5b60200260200101819052506040518060400160405280600881526020017f416d626974696f6e00000000000000000000000000000000000000000000000081525081600c81518110611d5157611d506147df565b5b60200260200101819052506040518060400160405280600e81526020017f53656e7365206f662048756d6f7200000000000000000000000000000000000081525081600d81518110611da657611da56147df565b5b60200260200101819052506040518060400160405280600781526020017f4c6f79616c74790000000000000000000000000000000000000000000000000081525081600e81518110611dfb57611dfa6147df565b5b60200260200101819052506040518060400160405280600f81526020017f416476656e7475726f75736e657373000000000000000000000000000000000081525081600f81518110611e5057611e4f6147df565b5b60200260200101819052506040518060400160405280600a81526020017f4469736369706c696e650000000000000000000000000000000000000000000081525081601081518110611ea557611ea46147df565b5b60200260200101819052506040518060400160405280600981526020017f437572696f73697479000000000000000000000000000000000000000000000081525081601181518110611efa57611ef96147df565b5b60200260200101819052506040518060400160405280600a81526020017f526573696c69656e63650000000000000000000000000000000000000000000081525081601281518110611f4f57611f4e6147df565b5b60200260200101819052506040518060400160405280600a81526020017f437265617469766974790000000000000000000000000000000000000000000081525081601381518110611fa457611fa36147df565b5b60200260200101819052505f60405180602001604052805f81525090505f60405180602001604052805f81525090505f60405180602001604052805f81525090505f60405180602001604052805f81525090505f805f5b875181101561220b5761205d6101538b10612019576202710061201e565b620138805b62ffffff168b836040516020016120369291906149a8565b604051602081830303815290604052805190602001205f1c6120589190614a0b565b613082565b91506120aa8261019061207091906147ac565b8b83604051602001612083929190614aab565b604051602081830303815290604052805190602001205f1c6120a59190614a0b565b613082565b60146120b691906147ac565b92505f81146120fa576040518060400160405280600181526020017f2c0000000000000000000000000000000000000000000000000000000000000081525061210a565b60405180602001604052805f8152505b60405160200161211a9190614b37565b604051602081830303815290604052955087818151811061213e5761213d6147df565b5b60200260200101516040516020016121569190614b82565b604051602081830303815290604052945061217083612fb8565b6040516020016121809190614bcd565b6040516020818303038152906040529350868686866040516020016121a6929190614bf2565b6040516020818303038152906040526040516020016121c6929190614bf2565b6040516020818303038152906040526040516020016121e6929190614bf2565b60405160208183030381529060405296506001816122049190614c15565b9050611ffb565b505f886122178d612fb8565b6040516020016122279190614c6e565b604051602081830303815290604052604051602001612247929190614bf2565b6040516020818303038152906040526040516020016122669190614cb9565b6040516020818303038152906040526040516020016122859190614dc0565b604051602081830303815290604052600c8a6040516020016122a8929190614e61565b6040516020818303038152906040526040516020016122c8929190614bf2565b60405160208183030381529060405290505f876040516020016122eb9190614eaa565b60405160208183030381529060405290508060405160200161230d9190614ef5565b60405160208183030381529060405290508181604051602001612331929190614bf2565b6040516020818303038152906040529b505050505050505050505050919050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6012602052805f5260405f205f915090505481565b60028054612397906144e3565b80601f01602080910402602001604051908101604052809291908181526020018280546123c3906144e3565b801561240e5780601f106123e55761010080835404028352916020019161240e565b820191905f5260205f20905b8154815290600101906020018083116123f157829003601f168201915b505050505081565b600b602052805f5260405f205f915054906101000a900460ff1681565b8060075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161251f9190613eb3565b60405180910390a35050565b5f612537338484612c50565b905092915050565b61254a858585610aaf565b5f8473ffffffffffffffffffffffffffffffffffffffff163b14158015612636575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b81526004016125d4959493929190614f46565b6020604051808303815f875af11580156125f0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126149190614909565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b1561266d576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b5f60045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20540361270e576001600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b565b60605f600d8054612720906144e3565b9050111561276b57600d61274460125f8581526020019081526020015f2054612fb8565b604051602001612755929190614e61565b6040516020818303038152906040529050612796565b61277482611897565b6040516020016127849190614fb8565b60405160208183030381529060405290505b919050565b600d80546127a8906144e3565b80601f01602080910402602001604051908101604052809291908181526020018280546127d4906144e3565b801561281f5780601f106127f65761010080835404028352916020019161281f565b820191905f5260205f20905b81548152906001019060200180831161280257829003601f168201915b505050505081565b60606040518060400160405280600181526020017f5b0000000000000000000000000000000000000000000000000000000000000081525090505f61286b83613178565b90505f5b8151811015612902578261289c83838151811061288f5761288e6147df565b5b6020026020010151611897565b6040516020016128ad929190614bf2565b6040516020818303038152906040529250600182516128cc91906147ac565b81146128f557826040516020016128e39190615003565b60405160208183030381529060405292505b808060010191505061286f565b5081604051602001612914919061504e565b604051602081830303815290604052915050919050565b6005602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146129cf576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d90816129de91906146b0565b5050565b6007602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b600c8054612a19906144e3565b80601f0160208091040260200160405190810160405280929190818152602001828054612a45906144e3565b8015612a905780601f10612a6757610100808354040283529160200191612a90565b820191905f5260205f20905b815481529060010190602001808311612a7357829003601f168201915b505050505081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b1c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612b81576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b5f7f0000000000000000000000000000000000000000000000000000000000000012600a612c4b91906151a2565b905090565b5f80612c5a612c1d565b90505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508460045f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612d2a91906147ac565b925050819055508460045f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550600b5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16612e4e575f8360045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612e1391906151ec565b8484612e1f91906151ec565b612e2991906147ac565b90505f5b81811015612e4b57612e3e8961320b565b8080600101915050612e2d565b50505b600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16612f21575f8382612ea991906151ec565b8460045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612ef291906151ec565b612efc91906147ac565b90505f5b81811015612f1e57612f1188613266565b8080600101915050612f00565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148787604051612f7e9190613edb565b60405180910390a3600193505050509392505050565b8160019081612fa391906146b0565b508060029081612fb391906146b0565b505050565b60605f6001612fc68461348b565b0190505f8167ffffffffffffffff811115612fe457612fe3613efc565b5b6040519080825280601f01601f1916602001820160405280156130165781602001600182028036833780820191505090505b5090505f82602001820190505b600115613077578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161306c5761306b6149de565b5b0494505f8503613023575b819350505050919050565b5f808203613092575f9050613173565b5f600161309e846135dc565b901c6001901b905060018184816130b8576130b76149de565b5b048201901c905060018184816130d1576130d06149de565b5b048201901c905060018184816130ea576130e96149de565b5b048201901c90506001818481613103576131026149de565b5b048201901c9050600181848161311c5761311b6149de565b5b048201901c90506001818481613135576131346149de565b5b048201901c9050600181848161314e5761314d6149de565b5b048201901c905061316f81828581613169576131686149de565b5b046136b3565b9150505b919050565b606060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806020026020016040519081016040528092919081815260200182805480156131ff57602002820191905f5260205f20905b8154815260200190600101908083116131eb575b50505050509050919050565b5f613215826136cb565b905060125f8281526020019081526020015f205460105f600f5481526020019081526020015f20819055506001600f5f8282546132529190614c15565b92505081905550613262826137f9565b5050565b61326f81613a3e565b5f3073ffffffffffffffffffffffffffffffffffffffff16634f02c4206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132dd9190615230565b90505f600f54826064436132f191906147ac565b40604051602001613303929190615284565b604051602081830303815290604052805190602001205f1c6133259190614a0b565b90505f60115f8381526020019081526020015f205f9054906101000a900460ff16156133645760105f8381526020019081526020015f20549050613391565b819050600160115f8481526020019081526020015f205f6101000a81548160ff0219169083151502179055505b6001600f5f8282546133a391906147ac565b9250508190555060115f600f5481526020019081526020015f205f9054906101000a900460ff166133d657600f546133eb565b60105f600f5481526020019081526020015f20545b60105f8481526020019081526020015f2081905550600160115f600f5481526020019081526020015f205f6101000a81548160ff0219169083151502179055508060125f8581526020019081526020015f2081905550808473ffffffffffffffffffffffffffffffffffffffff167f792daa4b2623ba70e38af40290b50417d8a1620a7deee03ad74ed721bf9c897f60405160405180910390a350505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106134e7577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816134dd576134dc6149de565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613524576d04ee2d6d415b85acef8100000000838161351a576135196149de565b5b0492506020810190505b662386f26fc10000831061355357662386f26fc100008381613549576135486149de565b5b0492506010810190505b6305f5e100831061357c576305f5e1008381613572576135716149de565b5b0492506008810190505b61271083106135a1576127108381613597576135966149de565b5b0492506004810190505b606483106135c457606483816135ba576135b96149de565b5b0492506002810190505b600a83106135d3576001810190505b80915050919050565b5f805f90505f608084901c11156135fb57608083901c92506080810190505b5f604084901c111561361557604083901c92506040810190505b5f602084901c111561362f57602083901c92506020810190505b5f601084901c111561364957601083901c92506010810190505b5f600884901c111561366357600883901c92506008810190505b5f600484901c111561367d57600483901c92506004810190505b5f600284901c111561369757600283901c92506002810190505b5f600184901c11156136aa576001810190505b80915050919050565b5f8183106136c157816136c3565b825b905092915050565b5f8060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490501161374e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613745906152f9565b60405180910390fd5b60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506137d891906147ac565b815481106137e9576137e86147df565b5b905f5260205f2001549050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361385e576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506138e991906147ac565b815481106138fa576138f96147df565b5b905f5260205f200154905060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806139525761395161480c565b5b600190038181905f5260205f20015f90559055600a5f8281526020019081526020015f205f905560085f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613aa3576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f81548092919060010191905055505f60035490505f73ffffffffffffffffffffffffffffffffffffffff1660085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613b4f576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050613c4c91906147ac565b600a5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613cf7578082015181840152602081019050613cdc565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613d1c82613cc0565b613d268185613cca565b9350613d36818560208601613cda565b613d3f81613d02565b840191505092915050565b5f6020820190508181035f830152613d628184613d12565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b613d8d81613d7b565b8114613d97575f80fd5b50565b5f81359050613da881613d84565b92915050565b5f60208284031215613dc357613dc2613d73565b5b5f613dd084828501613d9a565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613e0282613dd9565b9050919050565b613e1281613df8565b82525050565b5f602082019050613e2b5f830184613e09565b92915050565b613e3a81613df8565b8114613e44575f80fd5b50565b5f81359050613e5581613e31565b92915050565b5f8060408385031215613e7157613e70613d73565b5b5f613e7e85828601613e47565b9250506020613e8f85828601613d9a565b9150509250929050565b5f8115159050919050565b613ead81613e99565b82525050565b5f602082019050613ec65f830184613ea4565b92915050565b613ed581613d7b565b82525050565b5f602082019050613eee5f830184613ecc565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613f3282613d02565b810181811067ffffffffffffffff82111715613f5157613f50613efc565b5b80604052505050565b5f613f63613d6a565b9050613f6f8282613f29565b919050565b5f67ffffffffffffffff821115613f8e57613f8d613efc565b5b613f9782613d02565b9050602081019050919050565b828183375f83830152505050565b5f613fc4613fbf84613f74565b613f5a565b905082815260208101848484011115613fe057613fdf613ef8565b5b613feb848285613fa4565b509392505050565b5f82601f83011261400757614006613ef4565b5b8135614017848260208601613fb2565b91505092915050565b5f6020828403121561403557614034613d73565b5b5f82013567ffffffffffffffff81111561405257614051613d77565b5b61405e84828501613ff3565b91505092915050565b5f805f6060848603121561407e5761407d613d73565b5b5f61408b86828701613e47565b935050602061409c86828701613e47565b92505060406140ad86828701613d9a565b9150509250925092565b5f60ff82169050919050565b6140cc816140b7565b82525050565b5f6020820190506140e55f8301846140c3565b92915050565b5f806040838503121561410157614100613d73565b5b5f83013567ffffffffffffffff81111561411e5761411d613d77565b5b61412a85828601613ff3565b925050602083013567ffffffffffffffff81111561414b5761414a613d77565b5b61415785828601613ff3565b9150509250929050565b61416a81613e99565b8114614174575f80fd5b50565b5f8135905061418581614161565b92915050565b5f80604083850312156141a1576141a0613d73565b5b5f6141ae85828601613e47565b92505060206141bf85828601614177565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6141fb81613d7b565b82525050565b5f61420c83836141f2565b60208301905092915050565b5f602082019050919050565b5f61422e826141c9565b61423881856141d3565b9350614243836141e3565b805f5b8381101561427357815161425a8882614201565b975061426583614218565b925050600181019050614246565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6142b281613e99565b82525050565b5f6142c383836142a9565b60208301905092915050565b5f602082019050919050565b5f6142e582614280565b6142ef818561428a565b93506142fa8361429a565b805f5b8381101561432a57815161431188826142b8565b975061431c836142cf565b9250506001810190506142fd565b5085935050505092915050565b5f6040820190508181035f83015261434f8185614224565b9050818103602083015261436381846142db565b90509392505050565b5f6020828403121561438157614380613d73565b5b5f61438e84828501613e47565b91505092915050565b5f80fd5b5f80fd5b5f8083601f8401126143b4576143b3613ef4565b5b8235905067ffffffffffffffff8111156143d1576143d0614397565b5b6020830191508360018202830111156143ed576143ec61439b565b5b9250929050565b5f805f805f6080868803121561440d5761440c613d73565b5b5f61441a88828901613e47565b955050602061442b88828901613e47565b945050604061443c88828901613d9a565b935050606086013567ffffffffffffffff81111561445d5761445c613d77565b5b6144698882890161439f565b92509250509295509295909350565b5f806040838503121561448e5761448d613d73565b5b5f61449b85828601613e47565b92505060206144ac85828601613e47565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806144fa57607f821691505b60208210810361450d5761450c6144b6565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261456f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614534565b6145798683614534565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6145b46145af6145aa84613d7b565b614591565b613d7b565b9050919050565b5f819050919050565b6145cd8361459a565b6145e16145d9826145bb565b848454614540565b825550505050565b5f90565b6145f56145e9565b6146008184846145c4565b505050565b5b81811015614623576146185f826145ed565b600181019050614606565b5050565b601f8211156146685761463981614513565b61464284614525565b81016020851015614651578190505b61466561465d85614525565b830182614605565b50505b505050565b5f82821c905092915050565b5f6146885f198460080261466d565b1980831691505092915050565b5f6146a08383614679565b9150826002028217905092915050565b6146b982613cc0565b67ffffffffffffffff8111156146d2576146d1613efc565b5b6146dc82546144e3565b6146e7828285614627565b5f60209050601f831160018114614718575f8415614706578287015190505b6147108582614695565b865550614777565b601f19841661472686614513565b5f5b8281101561474d57848901518255600182019150602085019450602081019050614728565b8683101561476a5784890151614766601f891682614679565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6147b682613d7b565b91506147c183613d7b565b92508282039050818111156147d9576147d861477f565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82825260208201905092915050565b50565b5f6148575f83614839565b915061486282614849565b5f82019050919050565b5f60808201905061487f5f830186613e09565b61488c6020830185613e09565b6148996040830184613ecc565b81810360608301526148aa8161484c565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6148e8816148b4565b81146148f2575f80fd5b50565b5f81519050614903816148df565b92915050565b5f6020828403121561491e5761491d613d73565b5b5f61492b848285016148f5565b91505092915050565b5f81905092915050565b7f4e6576657220476f6e6e61204769766520596f752055700000000000000000005f82015250565b5f614972601783614934565b915061497d8261493e565b601782019050919050565b5f819050919050565b6149a261499d82613d7b565b614988565b82525050565b5f6149b282614966565b91506149be8285614991565b6020820191506149ce8284614991565b6020820191508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614a1582613d7b565b9150614a2083613d7b565b925082614a3057614a2f6149de565b5b828206905092915050565b7f446563656e7472616c697a6564205075626c696320496e6672617374727563745f8201527f7572652e00000000000000000000000000000000000000000000000000000000602082015250565b5f614a95602483614934565b9150614aa082614a3b565b602482019050919050565b5f614ab582614a89565b9150614ac18285614991565b602082019150614ad18284614991565b6020820191508190509392505050565b5f614aeb82613cc0565b614af58185614934565b9350614b05818560208601613cda565b80840191505092915050565b7f7b2274726169745f74797065223a220000000000000000000000000000000000815250565b5f614b428284614ae1565b9150614b4d82614b11565b600f8201915081905092915050565b7f222c2276616c7565223a00000000000000000000000000000000000000000000815250565b5f614b8d8284614ae1565b9150614b9882614b5c565b600a8201915081905092915050565b7f7d00000000000000000000000000000000000000000000000000000000000000815250565b5f614bd88284614ae1565b9150614be382614ba7565b60018201915081905092915050565b5f614bfd8285614ae1565b9150614c098284614ae1565b91508190509392505050565b5f614c1f82613d7b565b9150614c2a83613d7b565b9250828201905080821115614c4257614c4161477f565b5b92915050565b7f222c20226964223a000000000000000000000000000000000000000000000000815250565b5f614c7882614c48565b600882019150614c888284614ae1565b915081905092915050565b7f7b226e616d65223a2022416e6f6e202300000000000000000000000000000000815250565b5f614cc382614c93565b601082019150614cd38284614ae1565b915081905092915050565b7f2c226465736372697074696f6e223a224120636f6c6c656374696f6e206f66205f8201527f33353220416e6f6e7320656e61626c6564206279204552433430342c20616e2060208201527f6578706572696d656e74616c20746f6b656e207374616e646172642e222c226560408201527f787465726e616c5f75726c223a2268747470733a2f2f616e6f6e65746865726560608201527f756d2e636f6d222c22696d616765223a22000000000000000000000000000000608082015250565b5f614daa609183614934565b9150614db582614cde565b609182019050919050565b5f614dcb8284614ae1565b9150614dd682614d9e565b915081905092915050565b5f8154614ded816144e3565b614df78186614934565b9450600182165f8114614e115760018114614e2657614e58565b60ff1983168652811515820286019350614e58565b614e2f85614513565b5f5b83811015614e5057815481890152600182019150602081019050614e31565b838801955050505b50505092915050565b5f614e6c8285614de1565b9150614e788284614ae1565b91508190509392505050565b7f2e6d7034222c2261747472696275746573223a5b000000000000000000000000815250565b5f614eb482614e84565b601482019150614ec48284614ae1565b915081905092915050565b7f5d7d000000000000000000000000000000000000000000000000000000000000815250565b5f614f008284614ae1565b9150614f0b82614ecf565b60028201915081905092915050565b5f614f258385614839565b9350614f32838584613fa4565b614f3b83613d02565b840190509392505050565b5f608082019050614f595f830188613e09565b614f666020830187613e09565b614f736040830186613ecc565b8181036060830152614f86818486614f1a565b90509695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c0000000000815250565b5f614fc282614f92565b601b82019150614fd28284614ae1565b915081905092915050565b7f2c00000000000000000000000000000000000000000000000000000000000000815250565b5f61500e8284614ae1565b915061501982614fdd565b60018201915081905092915050565b7f5d00000000000000000000000000000000000000000000000000000000000000815250565b5f6150598284614ae1565b915061506482615028565b60018201915081905092915050565b5f8160011c9050919050565b5f808291508390505b60018511156150c8578086048111156150a4576150a361477f565b5b60018516156150b35780820291505b80810290506150c185615073565b9450615088565b94509492505050565b5f826150e0576001905061519b565b816150ed575f905061519b565b8160018114615103576002811461510d5761513c565b600191505061519b565b60ff84111561511f5761511e61477f565b5b8360020a9150848211156151365761513561477f565b5b5061519b565b5060208310610133831016604e8410600b84101617156151715782820a90508381111561516c5761516b61477f565b5b61519b565b61517e848484600161507f565b925090508184048111156151955761519461477f565b5b81810290505b9392505050565b5f6151ac82613d7b565b91506151b7836140b7565b92506151e47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846150d1565b905092915050565b5f6151f682613d7b565b915061520183613d7b565b925082615211576152106149de565b5b828204905092915050565b5f8151905061522a81613d84565b92915050565b5f6020828403121561524557615244613d73565b5b5f6152528482850161521c565b91505092915050565b5f819050919050565b5f819050919050565b61527e6152798261525b565b615264565b82525050565b5f61528f8285614991565b60208201915061529f828461526d565b6020820191508190509392505050565b7f4f776e657220686173206e6f20746f6b656e73000000000000000000000000005f82015250565b5f6152e3601383613cca565b91506152ee826152af565b602082019050919050565b5f6020820190508181035f830152615310816152d7565b905091905056fea264697066735822122074cef70f11cb924811b6c3d30d5f1b6c44bb83b0a68048d0f0e9d9903b544f2864736f6c63430008180033

Deployed Bytecode Sourcemap

32319:5661:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22941:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23652:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26025:642;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23177:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32574:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27074:1716;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20938:151;;;:::i;:::-;;23077:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29086:405;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23312:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32794:158;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25151:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25537:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33826:272;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;23418:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34524:3036;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20379:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33054:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22995:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24566:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26718:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28849:160;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29586:437;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25351:114;;;:::i;:::-;;34112:404;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32378:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37568:409;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23532:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32680:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23763:68;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32350:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20711:219;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22941:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23652:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;26025:642::-;26128:4;26163:6;;26149:10;:20;;:38;;;;;26186:1;26173:10;:14;26149:38;26145:491;;;26204:13;26220:8;:20;26229:10;26220:20;;;;;;;;;;;;;;;;;;;;;26204:36;;26275:5;26261:19;;:10;:19;;;;:59;;;;;26285:16;:23;26302:5;26285:23;;;;;;;;;;;;;;;:35;26309:10;26285:35;;;;;;;;;;;;;;;;;;;;;;;;;26284:36;26261:59;26257:121;;;26348:14;;;;;;;;;;;;;;26257:121;26420:7;26394:11;:23;26406:10;26394:23;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;26465:7;26449:36;;26458:5;26449:36;;;26474:10;26449:36;;;;;;:::i;:::-;;;;;;;;26189:308;26145:491;;;26551:10;26518:9;:21;26528:10;26518:21;;;;;;;;;;;;;;;:30;26540:7;26518:30;;;;;;;;;;;;;;;:43;;;;26604:7;26583:41;;26592:10;26583:41;;;26613:10;26583:41;;;;;;:::i;:::-;;;;;;;;26145:491;26655:4;26648:11;;26025:642;;;;:::o;23177:36::-;;;:::o;32574:98::-;20466:5;;;;;;;;;;20452:19;;:10;:19;;;20448:46;;20480:14;;;;;;;;;;;;;;20448:46;32656:8:::1;32646:7;:18;;;;;;:::i;:::-;;32574:98:::0;:::o;27074:1716::-;27220:6;;27206:10;:20;27202:1581;;27255:8;:20;27264:10;27255:20;;;;;;;;;;;;;;;;;;;;;27247:28;;:4;:28;;;27243:91;;27303:15;;;;;;;;;;;;;;27243:91;27368:1;27354:16;;:2;:16;;;27350:82;;27398:18;;;;;;;;;;;;;;27350:82;27484:4;27470:18;;:10;:18;;;;:74;;;;;27510:16;:22;27527:4;27510:22;;;;;;;;;;;;;;;:34;27533:10;27510:34;;;;;;;;;;;;;;;;;;;;;;;;;27509:35;27470:74;:132;;;;;27579:11;:23;27591:10;27579:23;;;;;;;;;;;;;;;;;;;;;27565:37;;:10;:37;;;;27470:132;27448:226;;;27644:14;;;;;;;;;;;;;;27448:226;27709:10;:8;:10::i;:::-;27690:9;:15;27700:4;27690:15;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;27782:10;:8;:10::i;:::-;27765:9;:13;27775:2;27765:13;;;;;;;;;;;;;;;;:27;;;;;;;;;;;27847:2;27824:8;:20;27833:10;27824:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;27871:11;:23;27883:10;27871:23;;;;;;;;;;;;27864:30;;;;;;;;;;;27952:17;27972:6;:12;27979:4;27972:12;;;;;;;;;;;;;;;28007:1;27985:6;:12;27992:4;27985:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;27972:37;;;;;;;;:::i;:::-;;;;;;;;;;27952:57;;28064:9;28024:6;:12;28031:4;28024:12;;;;;;;;;;;;;;;28037:11;:23;28049:10;28037:23;;;;;;;;;;;;28024:37;;;;;;;;:::i;:::-;;;;;;;;;:49;;;;28108:6;:12;28115:4;28108:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28212:11;:23;28224:10;28212:23;;;;;;;;;;;;28187:11;:22;28199:9;28187:22;;;;;;;;;;;:48;;;;28289:6;:10;28296:2;28289:10;;;;;;;;;;;;;;;28305;28289:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28419:1;28399:6;:10;28406:2;28399:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;28373:11;:23;28385:10;28373:23;;;;;;;;;;;:47;;;;28461:10;28457:2;28442:30;;28451:4;28442:30;;;;;;;;;;;;28512:2;28492:35;;28506:4;28492:35;;;28516:10;:8;:10::i;:::-;28492:35;;;;;;:::i;:::-;;;;;;;;27228:1311;27202:1581;;;28560:15;28578:9;:15;28588:4;28578:15;;;;;;;;;;;;;;;:27;28594:10;28578:27;;;;;;;;;;;;;;;;28560:45;;28637:17;28626:7;:28;28622:101;;28713:10;28703:7;:20;;;;:::i;:::-;28673:9;:15;28683:4;28673:15;;;;;;;;;;;;;;;:27;28689:10;28673:27;;;;;;;;;;;;;;;:50;;;;28622:101;28740:31;28750:4;28756:2;28760:10;28740:9;:31::i;:::-;;28545:238;27202:1581;27074:1716;;;:::o;20938:151::-;20466:5;;;;;;;;;;20452:19;;:10;:19;;;20448:46;;20480:14;;;;;;;;;;;;;;20448:46;21017:1:::1;21001:5:::0;::::1;:18;;;;;;;;;;;;;;;;;;21078:1;21037:44;;21058:10;21037:44;;;;;;;;;;;;20938:151::o:0;23077:31::-;;;:::o;29086:405::-;29210:26;29223:4;29229:2;29233;29210:12;:26::i;:::-;29285:1;29267:2;:14;;;:19;;:154;;;;;29381:40;;;29303:118;;;29318:2;29303:35;;;29339:10;29351:4;29357:2;29303:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:118;;;;;29267:154;29249:235;;;29455:17;;;;;;;;;;;;;;29249:235;29086:405;;;:::o;23312:21::-;;;;:::o;32794:158::-;20466:5;;;;;;;;;;20452:19;;:10;:19;;;20448:46;;20480:14;;;;;;;;;;;;;;20448:46;32914:30:::1;32929:5;32936:7;32914:14;:30::i;:::-;32794:158:::0;;:::o;25151:111::-;20466:5;;;;;;;;;;20452:19;;:10;:19;;;20448:46;;20480:14;;;;;;;;;;;;;;20448:46;25249:5:::1;25229:9;:17;25239:6;25229:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;25151:111:::0;;:::o;25537:193::-;25595:13;25629:8;:12;25638:2;25629:12;;;;;;;;;;;;;;;;;;;;;25621:20;;25675:1;25658:19;;:5;:19;;;25654:69;;25701:10;;;;;;;;;;;;;;25654:69;25537:193;;;:::o;33826:272::-;33861:26;33888:23;33943:5;;33932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33917:32;;33977:5;;33966:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33954:29;;33992:6;33988:106;34001:5;;33999:1;:7;33988:106;;;34035:8;:11;34044:1;34035:11;;;;;;;;;;;;;;;;;;;;;:21;;34055:1;34035:21;;;34047:4;:7;34052:1;34047:7;;;;;;;;;;;;34035:21;34017:12;34030:1;34017:15;;;;;;;;:::i;:::-;;;;;;;:39;;;;;34077:8;:11;34086:1;34077:11;;;;;;;;;;;;;;;;;;;;;34062:9;34072:1;34062:12;;;;;;;;:::i;:::-;;;;;;;:26;;;;;;;;;;;34007:3;;;;;;;33988:106;;;;33826:272;;:::o;23418:44::-;;;;;;;;;;;;;;;;;:::o;34524:3036::-;34570:13;34595:11;34609:15;:19;34625:2;34609:19;;;;;;;;;;;;34595:33;;34639:21;34663:26;34681:6;34663:16;:26::i;:::-;34639:50;;34702:26;34744:2;34731:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34702:45;;34762:26;;;;;;;;;;;;;;;;;:10;34773:1;34762:13;;;;;;;;:::i;:::-;;;;;;;:26;;;;34803:27;;;;;;;;;;;;;;;;;:10;34814:1;34803:13;;;;;;;;:::i;:::-;;;;;;;:27;;;;34845:30;;;;;;;;;;;;;;;;;:10;34856:1;34845:13;;;;;;;;:::i;:::-;;;;;;;:30;;;;34890;;;;;;;;;;;;;;;;;:10;34901:1;34890:13;;;;;;;;:::i;:::-;;;;;;;:30;;;;34935:24;;;;;;;;;;;;;;;;;:10;34946:1;34935:13;;;;;;;;:::i;:::-;;;;;;;:24;;;;34974:26;;;;;;;;;;;;;;;;;:10;34985:1;34974:13;;;;;;;;:::i;:::-;;;;;;;:26;;;;35015:23;;;;;;;;;;;;;;;;;:10;35026:1;35015:13;;;;;;;;:::i;:::-;;;;;;;:23;;;;35053:22;;;;;;;;;;;;;;;;;:10;35064:1;35053:13;;;;;;;;:::i;:::-;;;;;;;:22;;;;35090:29;;;;;;;;;;;;;;;;;:10;35101:1;35090:13;;;;;;;;:::i;:::-;;;;;;;:29;;;;35134:28;;;;;;;;;;;;;;;;;:10;35145:1;35134:13;;;;;;;;:::i;:::-;;;;;;;:28;;;;35177:26;;;;;;;;;;;;;;;;;:10;35188:2;35177:14;;;;;;;;:::i;:::-;;;;;;;:26;;;;35218:34;;;;;;;;;;;;;;;;;:10;35229:2;35218:14;;;;;;;;:::i;:::-;;;;;;;:34;;;;35267:27;;;;;;;;;;;;;;;;;:10;35278:2;35267:14;;;;;;;;:::i;:::-;;;;;;;:27;;;;35309:33;;;;;;;;;;;;;;;;;:10;35320:2;35309:14;;;;;;;;:::i;:::-;;;;;;;:33;;;;35357:26;;;;;;;;;;;;;;;;;:10;35368:2;35357:14;;;;;;;;:::i;:::-;;;;;;;:26;;;;35398:34;;;;;;;;;;;;;;;;;:10;35409:2;35398:14;;;;;;;;:::i;:::-;;;;;;;:34;;;;35447:29;;;;;;;;;;;;;;;;;:10;35458:2;35447:14;;;;;;;;:::i;:::-;;;;;;;:29;;;;35491:28;;;;;;;;;;;;;;;;;:10;35502:2;35491:14;;;;;;;;:::i;:::-;;;;;;;:28;;;;35534:29;;;;;;;;;;;;;;;;;:10;35545:2;35534:14;;;;;;;;:::i;:::-;;;;;;;:29;;;;35578;;;;;;;;;;;;;;;;;:10;35589:2;35578:14;;;;;;;;:::i;:::-;;;;;;;:29;;;;35620:24;:29;;;;;;;;;;;;;;35660:18;:23;;;;;;;;;;;;;;35694:19;:24;;;;;;;;;;;;;;35729:19;:24;;;;;;;;;;;;;;35764:9;35784:15;35902:9;35897:964;35921:10;:17;35917:1;:21;35897:964;;;36020:158;36160:3;36153:6;:10;:23;;36170:6;36153:23;;;36164:5;36153:23;36030:147;;36114:6;36121:1;36045:78;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36035:89;;;;;;36030:95;;:147;;;;:::i;:::-;36020:9;:158::i;:::-;36007:171;;36207:261;36442:10;36438:3;:14;;;;:::i;:::-;36336:6;36392:1;36232:200;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36222:211;;;;;;36217:217;;:236;;;;:::i;:::-;36207:9;:261::i;:::-;36202:2;:266;;;;:::i;:::-;36195:273;;36509:1;36506;:4;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36492:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;36485:52;;36574:10;36585:1;36574:13;;;;;;;;:::i;:::-;;;;;;;;36560:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;36552:50;;36640:22;36657:4;36640:16;:22::i;:::-;36625:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;36617:51;;36710:10;36753:4;36794:5;36801;36780:27;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36739:91;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36696:153;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36683:166;;35945:1;35940:6;;;;;:::i;:::-;;;35897:964;;;;36873:26;37011:7;37047:20;37064:2;37047:16;:20::i;:::-;37020:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;36996:75;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36962:111;;;;;;;;:::i;:::-;;;;;;;;;;;;;36930:324;;;;;;;;:::i;:::-;;;;;;;;;;;;;37283:7;37292;37269:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36902:409;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36873:438;;37324:27;37405:10;37354:72;;;;;;;;:::i;:::-;;;;;;;;;;;;;37324:102;;37470:13;37455:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;37439:52;;37525:12;37538:13;37511:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37504:48;;;;;;;;;;;;;34524:3036;;;:::o;20379:20::-;;;;;;;;;;;;:::o;33054:42::-;;;;;;;;;;;;;;;;;:::o;22995:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24566:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;26718:207::-;26845:8;26804:16;:28;26821:10;26804:28;;;;;;;;;;;;;;;:38;26833:8;26804:38;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;26898:8;26871:46;;26886:10;26871:46;;;26908:8;26871:46;;;;;;:::i;:::-;;;;;;;;26718:207;;:::o;28849:160::-;28944:4;28968:33;28978:10;28990:2;28994:6;28968:9;:33::i;:::-;28961:40;;28849:160;;;;:::o;29586:437::-;29740:26;29753:4;29759:2;29763;29740:12;:26::i;:::-;29815:1;29797:2;:14;;;:19;;:156;;;;;29913:40;;;29833:120;;;29848:2;29833:35;;;29869:10;29881:4;29887:2;29891:4;;29833:63;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:120;;;;;29797:156;29779:237;;;29987:17;;;;;;;;;;;;;;29779:237;29586:437;;;;;:::o;25351:114::-;25416:1;25393:9;:21;25403:10;25393:21;;;;;;;;;;;;;;;;:24;25390:67;;25453:4;25429:9;:21;25439:10;25429:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;25390:67;25351:114::o;34112:404::-;34172:13;34233:1;34210:12;34204:26;;;;;:::i;:::-;;;:30;34200:309;;;34272:12;34286:37;34303:15;:19;34319:2;34303:19;;;;;;;;;;;;34286:16;:37::i;:::-;34258:67;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34251:74;;;;34200:309;34470:8;34475:2;34470:4;:8::i;:::-;34382:115;;;;;;;;:::i;:::-;;;;;;;;;;;;;34358:139;;34112:404;;;;:::o;32378:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37568:409::-;37619:25;37654:17;;;;;;;;;;;;;;;;;;;37679;37699:20;37714:4;37699:14;:20::i;:::-;37679:40;;37731:6;37727:191;37740:3;:10;37738:1;:12;37727:191;;;37792:11;37804:12;37809:3;37813:1;37809:6;;;;;;;;:::i;:::-;;;;;;;;37804:4;:12::i;:::-;37778:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37764:54;;37844:1;37833:3;:10;:12;;;;:::i;:::-;37830:1;:15;37827:83;;37884:11;37870:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;37856:44;;37827:83;37751:3;;;;;;;37727:191;;;;37953:11;37939:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;37925:44;;37646:331;37568:409;;;:::o;23532:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32680:106::-;20466:5;;;;;;;;;;20452:19;;:10;:19;;;20448:46;;20480:14;;;;;;;;;;;;;;20448:46;32769:9:::1;32754:12;:24;;;;;;:::i;:::-;;32680:106:::0;:::o;23763:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32350:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20711:219::-;20466:5;;;;;;;;;;20452:19;;:10;:19;;;20448:46;;20480:14;;;;;;;;;;;;;;20448:46;20812:1:::1;20794:20;;:6;:20;;::::0;20790:47:::1;;20823:14;;;;;;;;;;;;;;20790:47;20858:6;20850:5;::::0;:14:::1;;;;;;;;;;;;;;;;;;20915:6;20882:40;;20903:10;20882:40;;;;;;;;;;;;20711:219:::0;:::o;31189:92::-;31232:7;31265:8;31259:2;:14;;;;:::i;:::-;31252:21;;31189:92;:::o;30091:1059::-;30204:4;30221:12;30236:10;:8;:10::i;:::-;30221:25;;30257:27;30287:9;:15;30297:4;30287:15;;;;;;;;;;;;;;;;30257:45;;30313:29;30345:9;:13;30355:2;30345:13;;;;;;;;;;;;;;;;30313:45;;30390:6;30371:9;:15;30381:4;30371:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;30451:6;30434:9;:13;30444:2;30434:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;30542:9;:15;30552:4;30542:15;;;;;;;;;;;;;;;;;;;;;;;;;30537:234;;30574:22;30649:4;30631:9;:15;30641:4;30631:15;;;;;;;;;;;;;;;;:22;;;;:::i;:::-;30622:4;30600:19;:26;;;;:::i;:::-;30599:55;;;;:::i;:::-;30574:80;;30674:9;30669:91;30693:14;30689:1;:18;30669:91;;;30733:11;30739:4;30733:5;:11::i;:::-;30709:3;;;;;;;30669:91;;;;30559:212;30537:234;30847:9;:13;30857:2;30847:13;;;;;;;;;;;;;;;;;;;;;;;;;30842:230;;30877:22;30952:4;30928:21;:28;;;;:::i;:::-;30919:4;30903:9;:13;30913:2;30903:13;;;;;;;;;;;;;;;;:20;;;;:::i;:::-;30902:55;;;;:::i;:::-;30877:80;;30977:9;30972:89;30996:14;30992:1;:18;30972:89;;;31036:9;31042:2;31036:5;:9::i;:::-;31012:3;;;;;;;30972:89;;;;30862:210;30842:230;31109:2;31089:31;;31103:4;31089:31;;;31113:6;31089:31;;;;;;:::i;:::-;;;;;;;;31138:4;31131:11;;;;;30091:1059;;;;;:::o;32152:160::-;32272:5;32265:4;:12;;;;;;:::i;:::-;;32297:7;32288:6;:16;;;;;;:::i;:::-;;32152:160;;:::o;17672:718::-;17728:13;17779:14;17816:1;17796:17;17807:5;17796:10;:17::i;:::-;:21;17779:38;;17832:20;17866:6;17855:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17832:41;;17888:11;18017:6;18013:2;18009:15;18001:6;17997:28;17990:35;;18054:290;18061:4;18054:290;;;18086:5;;;;;;;;18228:10;18223:2;18216:5;18212:14;18207:32;18202:3;18194:46;18286:2;18277:11;;;;;;:::i;:::-;;;;;18320:1;18311:5;:10;18054:290;18307:21;18054:290;18365:6;18358:13;;;;;17672:718;;;:::o;10508:1673::-;10556:7;10585:1;10580;:6;10576:47;;10610:1;10603:8;;;;10576:47;11314:14;11348:1;11337:7;11342:1;11337:4;:7::i;:::-;:12;;11331:1;:19;;11314:36;;11816:1;11805:6;11801:1;:10;;;;;:::i;:::-;;;11792:6;:19;11791:26;;11782:35;;11866:1;11855:6;11851:1;:10;;;;;:::i;:::-;;;11842:6;:19;11841:26;;11832:35;;11916:1;11905:6;11901:1;:10;;;;;:::i;:::-;;;11892:6;:19;11891:26;;11882:35;;11966:1;11955:6;11951:1;:10;;;;;:::i;:::-;;;11942:6;:19;11941:26;;11932:35;;12016:1;12005:6;12001:1;:10;;;;;:::i;:::-;;;11992:6;:19;11991:26;;11982:35;;12066:1;12055:6;12051:1;:10;;;;;:::i;:::-;;;12042:6;:19;12041:26;;12032:35;;12116:1;12105:6;12101:1;:10;;;;;:::i;:::-;;;12092:6;:19;12091:26;;12082:35;;12139:23;12143:6;12155;12151:1;:10;;;;;:::i;:::-;;;12139:3;:23::i;:::-;12132:30;;;10508:1673;;;;:::o;24247:105::-;24308:13;24334:6;:13;24341:5;24334:13;;;;;;;;;;;;;;;24327:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24247:105;;;:::o;33648:173::-;33706:7;33716:25;33736:4;33716:19;:25::i;:::-;33706:35;;33760:15;:19;33776:2;33760:19;;;;;;;;;;;;33746:4;:11;33751:5;;33746:11;;;;;;;;;;;:33;;;;33793:1;33786:5;;:8;;;;;;;:::i;:::-;;;;;;;;33799:17;33811:4;33799:11;:17::i;:::-;33695:126;33648:173;:::o;33167:476::-;33217:15;33229:2;33217:11;:15::i;:::-;33237:7;33247:4;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33237:23;;33267:11;33351:5;;33313:2;33341:3;33326:12;:18;;;;:::i;:::-;33316:29;33296:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33286:61;;;;;;33281:67;;:75;;;;:::i;:::-;33267:89;;33361:9;33378:8;:16;33387:6;33378:16;;;;;;;;;;;;;;;;;;;;;33375:109;;;33408:4;:12;33413:6;33408:12;;;;;;;;;;;;33401:19;;33375:109;;;33443:6;33436:13;;33474:4;33455:8;:16;33464:6;33455:16;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;33375:109;33495:1;33488:5;;:8;;;;;;;:::i;:::-;;;;;;;;33516;:15;33525:5;;33516:15;;;;;;;;;;;;;;;;;;;;;:33;;33544:5;;33516:33;;;33532:4;:11;33537:5;;33532:11;;;;;;;;;;;;33516:33;33501:4;:12;33506:6;33501:12;;;;;;;;;;;:48;;;;33572:4;33554:8;:15;33563:5;;33554:15;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;33603:4;33581:15;:19;33597:2;33581:19;;;;;;;;;;;:26;;;;33633:4;33630:2;33617:21;;;;;;;;;;;;33212:431;;;33167:476;:::o;14235:948::-;14288:7;14308:14;14325:1;14308:18;;14375:8;14366:5;:17;14362:106;;14413:8;14404:17;;;;;;:::i;:::-;;;;;14450:2;14440:12;;;;14362:106;14495:8;14486:5;:17;14482:106;;14533:8;14524:17;;;;;;:::i;:::-;;;;;14570:2;14560:12;;;;14482:106;14615:8;14606:5;:17;14602:106;;14653:8;14644:17;;;;;;:::i;:::-;;;;;14690:2;14680:12;;;;14602:106;14735:7;14726:5;:16;14722:103;;14772:7;14763:16;;;;;;:::i;:::-;;;;;14808:1;14798:11;;;;14722:103;14852:7;14843:5;:16;14839:103;;14889:7;14880:16;;;;;;:::i;:::-;;;;;14925:1;14915:11;;;;14839:103;14969:7;14960:5;:16;14956:103;;15006:7;14997:16;;;;;;:::i;:::-;;;;;15042:1;15032:11;;;;14956:103;15086:7;15077:5;:16;15073:68;;15124:1;15114:11;;;;15073:68;15169:6;15162:13;;;14235:948;;;:::o;12667:1019::-;12719:7;12739:14;12756:1;12739:18;;12812:1;12806:3;12797:5;:12;;:16;12793:102;;;12844:3;12834:13;;;;;12876:3;12866:13;;;;12793:102;12927:1;12922:2;12913:5;:11;;:15;12909:99;;;12959:2;12949:12;;;;;12990:2;12980:12;;;;12909:99;13040:1;13035:2;13026:5;:11;;:15;13022:99;;;13072:2;13062:12;;;;;13103:2;13093:12;;;;13022:99;13153:1;13148:2;13139:5;:11;;:15;13135:99;;;13185:2;13175:12;;;;;13216:2;13206:12;;;;13135:99;13265:1;13261;13252:5;:10;;:14;13248:96;;;13297:1;13287:11;;;;;13327:1;13317:11;;;;13248:96;13375:1;13371;13362:5;:10;;:14;13358:96;;;13407:1;13397:11;;;;;13437:1;13427:11;;;;13358:96;13485:1;13481;13472:5;:10;;:14;13468:96;;;13517:1;13507:11;;;;;13547:1;13537:11;;;;13468:96;13595:1;13591;13582:5;:10;;:14;13578:66;;;13627:1;13617:11;;;;13578:66;13672:6;13665:13;;;12667:1019;;;:::o;4345:106::-;4403:7;4434:1;4430;:5;:13;;4442:1;4430:13;;;4438:1;4430:13;4423:20;;4345:106;;;;:::o;24051:193::-;24118:7;24163:1;24140:6;:13;24147:5;24140:13;;;;;;;;;;;;;;;:20;;;;:24;24132:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;24200:6;:13;24207:5;24200:13;;;;;;;;;;;;;;;24237:1;24214:6;:13;24221:5;24214:13;;;;;;;;;;;;;;;:20;;;;:24;;;;:::i;:::-;24200:39;;;;;;;;:::i;:::-;;;;;;;;;;24193:46;;24051:193;;;:::o;31771:373::-;31848:1;31832:18;;:4;:18;;;31828:73;;31874:15;;;;;;;;;;;;;;31828:73;31913:10;31926:6;:12;31933:4;31926:12;;;;;;;;;;;;;;;31961:1;31939:6;:12;31946:4;31939:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;31926:37;;;;;;;;:::i;:::-;;;;;;;;;;31913:50;;31974:6;:12;31981:4;31974:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32010:11;:15;32022:2;32010:15;;;;;;;;;;;32003:22;;;32043:8;:12;32052:2;32043:12;;;;;;;;;;;;32036:19;;;;;;;;;;;32073:11;:15;32085:2;32073:15;;;;;;;;;;;;32066:22;;;;;;;;;;;32133:2;32129:1;32106:30;;32115:4;32106:30;;;;;;;;;;;;31817:327;31771:373;:::o;31289:474::-;31362:1;31348:16;;:2;:16;;;31344:74;;31388:18;;;;;;;;;;;;;;31344:74;31455:6;;:8;;;;;;;;;;;;;31487:10;31500:6;;31487:19;;31547:1;31523:26;;:8;:12;31532:2;31523:12;;;;;;;;;;;;;;;;;;;;;:26;;;31519:81;;31573:15;;;;;;;;;;;;;;31519:81;31627:2;31612:8;:12;31621:2;31612:12;;;;;;;;;;;;:17;;;;;;;;;;;;;;;;;;31640:6;:10;31647:2;31640:10;;;;;;;;;;;;;;;31656:2;31640:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31708:1;31688:6;:10;31695:2;31688:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;31670:11;:15;31682:2;31670:15;;;;;;;;;;;:39;;;;31752:2;31748;31727:28;;31744:1;31727:28;;;;;;;;;;;;31333:430;31289:474;:::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:118::-;4220:24;4238:5;4220:24;:::i;:::-;4215:3;4208:37;4133:118;;:::o;4257:222::-;4350:4;4388:2;4377:9;4373:18;4365:26;;4401:71;4469:1;4458:9;4454:17;4445:6;4401:71;:::i;:::-;4257:222;;;;:::o;4485:117::-;4594:1;4591;4584:12;4608:117;4717:1;4714;4707:12;4731:180;4779:77;4776:1;4769:88;4876:4;4873:1;4866:15;4900:4;4897:1;4890:15;4917:281;5000:27;5022:4;5000:27;:::i;:::-;4992:6;4988:40;5130:6;5118:10;5115:22;5094:18;5082:10;5079:34;5076:62;5073:88;;;5141:18;;:::i;:::-;5073:88;5181:10;5177:2;5170:22;4960:238;4917:281;;:::o;5204:129::-;5238:6;5265:20;;:::i;:::-;5255:30;;5294:33;5322:4;5314:6;5294:33;:::i;:::-;5204:129;;;:::o;5339:308::-;5401:4;5491:18;5483:6;5480:30;5477:56;;;5513:18;;:::i;:::-;5477:56;5551:29;5573:6;5551:29;:::i;:::-;5543:37;;5635:4;5629;5625:15;5617:23;;5339:308;;;:::o;5653:146::-;5750:6;5745:3;5740;5727:30;5791:1;5782:6;5777:3;5773:16;5766:27;5653:146;;;:::o;5805:425::-;5883:5;5908:66;5924:49;5966:6;5924:49;:::i;:::-;5908:66;:::i;:::-;5899:75;;5997:6;5990:5;5983:21;6035:4;6028:5;6024:16;6073:3;6064:6;6059:3;6055:16;6052:25;6049:112;;;6080:79;;:::i;:::-;6049:112;6170:54;6217:6;6212:3;6207;6170:54;:::i;:::-;5889:341;5805:425;;;;;:::o;6250:340::-;6306:5;6355:3;6348:4;6340:6;6336:17;6332:27;6322:122;;6363:79;;:::i;:::-;6322:122;6480:6;6467:20;6505:79;6580:3;6572:6;6565:4;6557:6;6553:17;6505:79;:::i;:::-;6496:88;;6312:278;6250:340;;;;:::o;6596:509::-;6665:6;6714:2;6702:9;6693:7;6689:23;6685:32;6682:119;;;6720:79;;:::i;:::-;6682:119;6868:1;6857:9;6853:17;6840:31;6898:18;6890:6;6887:30;6884:117;;;6920:79;;:::i;:::-;6884:117;7025:63;7080:7;7071:6;7060:9;7056:22;7025:63;:::i;:::-;7015:73;;6811:287;6596:509;;;;:::o;7111:619::-;7188:6;7196;7204;7253:2;7241:9;7232:7;7228:23;7224:32;7221:119;;;7259:79;;:::i;:::-;7221:119;7379:1;7404:53;7449:7;7440:6;7429:9;7425:22;7404:53;:::i;:::-;7394:63;;7350:117;7506:2;7532:53;7577:7;7568:6;7557:9;7553:22;7532:53;:::i;:::-;7522:63;;7477:118;7634:2;7660:53;7705:7;7696:6;7685:9;7681:22;7660:53;:::i;:::-;7650:63;;7605:118;7111:619;;;;;:::o;7736:86::-;7771:7;7811:4;7804:5;7800:16;7789:27;;7736:86;;;:::o;7828:112::-;7911:22;7927:5;7911:22;:::i;:::-;7906:3;7899:35;7828:112;;:::o;7946:214::-;8035:4;8073:2;8062:9;8058:18;8050:26;;8086:67;8150:1;8139:9;8135:17;8126:6;8086:67;:::i;:::-;7946:214;;;;:::o;8166:834::-;8254:6;8262;8311:2;8299:9;8290:7;8286:23;8282:32;8279:119;;;8317:79;;:::i;:::-;8279:119;8465:1;8454:9;8450:17;8437:31;8495:18;8487:6;8484:30;8481:117;;;8517:79;;:::i;:::-;8481:117;8622:63;8677:7;8668:6;8657:9;8653:22;8622:63;:::i;:::-;8612:73;;8408:287;8762:2;8751:9;8747:18;8734:32;8793:18;8785:6;8782:30;8779:117;;;8815:79;;:::i;:::-;8779:117;8920:63;8975:7;8966:6;8955:9;8951:22;8920:63;:::i;:::-;8910:73;;8705:288;8166:834;;;;;:::o;9006:116::-;9076:21;9091:5;9076:21;:::i;:::-;9069:5;9066:32;9056:60;;9112:1;9109;9102:12;9056:60;9006:116;:::o;9128:133::-;9171:5;9209:6;9196:20;9187:29;;9225:30;9249:5;9225:30;:::i;:::-;9128:133;;;;:::o;9267:468::-;9332:6;9340;9389:2;9377:9;9368:7;9364:23;9360:32;9357:119;;;9395:79;;:::i;:::-;9357:119;9515:1;9540:53;9585:7;9576:6;9565:9;9561:22;9540:53;:::i;:::-;9530:63;;9486:117;9642:2;9668:50;9710:7;9701:6;9690:9;9686:22;9668:50;:::i;:::-;9658:60;;9613:115;9267:468;;;;;:::o;9741:114::-;9808:6;9842:5;9836:12;9826:22;;9741:114;;;:::o;9861:184::-;9960:11;9994:6;9989:3;9982:19;10034:4;10029:3;10025:14;10010:29;;9861:184;;;;:::o;10051:132::-;10118:4;10141:3;10133:11;;10171:4;10166:3;10162:14;10154:22;;10051:132;;;:::o;10189:108::-;10266:24;10284:5;10266:24;:::i;:::-;10261:3;10254:37;10189:108;;:::o;10303:179::-;10372:10;10393:46;10435:3;10427:6;10393:46;:::i;:::-;10471:4;10466:3;10462:14;10448:28;;10303:179;;;;:::o;10488:113::-;10558:4;10590;10585:3;10581:14;10573:22;;10488:113;;;:::o;10637:732::-;10756:3;10785:54;10833:5;10785:54;:::i;:::-;10855:86;10934:6;10929:3;10855:86;:::i;:::-;10848:93;;10965:56;11015:5;10965:56;:::i;:::-;11044:7;11075:1;11060:284;11085:6;11082:1;11079:13;11060:284;;;11161:6;11155:13;11188:63;11247:3;11232:13;11188:63;:::i;:::-;11181:70;;11274:60;11327:6;11274:60;:::i;:::-;11264:70;;11120:224;11107:1;11104;11100:9;11095:14;;11060:284;;;11064:14;11360:3;11353:10;;10761:608;;;10637:732;;;;:::o;11375:111::-;11439:6;11473:5;11467:12;11457:22;;11375:111;;;:::o;11492:181::-;11588:11;11622:6;11617:3;11610:19;11662:4;11657:3;11653:14;11638:29;;11492:181;;;;:::o;11679:129::-;11743:4;11766:3;11758:11;;11796:4;11791:3;11787:14;11779:22;;11679:129;;;:::o;11814:99::-;11885:21;11900:5;11885:21;:::i;:::-;11880:3;11873:34;11814:99;;:::o;11919:167::-;11982:10;12003:40;12039:3;12031:6;12003:40;:::i;:::-;12075:4;12070:3;12066:14;12052:28;;11919:167;;;;:::o;12092:110::-;12159:4;12191;12186:3;12182:14;12174:22;;12092:110;;;:::o;12232:708::-;12345:3;12374:51;12419:5;12374:51;:::i;:::-;12441:83;12517:6;12512:3;12441:83;:::i;:::-;12434:90;;12548:53;12595:5;12548:53;:::i;:::-;12624:7;12655:1;12640:275;12665:6;12662:1;12659:13;12640:275;;;12741:6;12735:13;12768:57;12821:3;12806:13;12768:57;:::i;:::-;12761:64;;12848:57;12898:6;12848:57;:::i;:::-;12838:67;;12700:215;12687:1;12684;12680:9;12675:14;;12640:275;;;12644:14;12931:3;12924:10;;12350:590;;;12232:708;;;;:::o;12946:622::-;13161:4;13199:2;13188:9;13184:18;13176:26;;13248:9;13242:4;13238:20;13234:1;13223:9;13219:17;13212:47;13276:108;13379:4;13370:6;13276:108;:::i;:::-;13268:116;;13431:9;13425:4;13421:20;13416:2;13405:9;13401:18;13394:48;13459:102;13556:4;13547:6;13459:102;:::i;:::-;13451:110;;12946:622;;;;;:::o;13574:329::-;13633:6;13682:2;13670:9;13661:7;13657:23;13653:32;13650:119;;;13688:79;;:::i;:::-;13650:119;13808:1;13833:53;13878:7;13869:6;13858:9;13854:22;13833:53;:::i;:::-;13823:63;;13779:117;13574:329;;;;:::o;13909:117::-;14018:1;14015;14008:12;14032:117;14141:1;14138;14131:12;14168:552;14225:8;14235:6;14285:3;14278:4;14270:6;14266:17;14262:27;14252:122;;14293:79;;:::i;:::-;14252:122;14406:6;14393:20;14383:30;;14436:18;14428:6;14425:30;14422:117;;;14458:79;;:::i;:::-;14422:117;14572:4;14564:6;14560:17;14548:29;;14626:3;14618:4;14610:6;14606:17;14596:8;14592:32;14589:41;14586:128;;;14633:79;;:::i;:::-;14586:128;14168:552;;;;;:::o;14726:963::-;14823:6;14831;14839;14847;14855;14904:3;14892:9;14883:7;14879:23;14875:33;14872:120;;;14911:79;;:::i;:::-;14872:120;15031:1;15056:53;15101:7;15092:6;15081:9;15077:22;15056:53;:::i;:::-;15046:63;;15002:117;15158:2;15184:53;15229:7;15220:6;15209:9;15205:22;15184:53;:::i;:::-;15174:63;;15129:118;15286:2;15312:53;15357:7;15348:6;15337:9;15333:22;15312:53;:::i;:::-;15302:63;;15257:118;15442:2;15431:9;15427:18;15414:32;15473:18;15465:6;15462:30;15459:117;;;15495:79;;:::i;:::-;15459:117;15608:64;15664:7;15655:6;15644:9;15640:22;15608:64;:::i;:::-;15590:82;;;;15385:297;14726:963;;;;;;;;:::o;15695:474::-;15763:6;15771;15820:2;15808:9;15799:7;15795:23;15791:32;15788:119;;;15826:79;;:::i;:::-;15788:119;15946:1;15971:53;16016:7;16007:6;15996:9;15992:22;15971:53;:::i;:::-;15961:63;;15917:117;16073:2;16099:53;16144:7;16135:6;16124:9;16120:22;16099:53;:::i;:::-;16089:63;;16044:118;15695:474;;;;;:::o;16175:180::-;16223:77;16220:1;16213:88;16320:4;16317:1;16310:15;16344:4;16341:1;16334:15;16361:320;16405:6;16442:1;16436:4;16432:12;16422:22;;16489:1;16483:4;16479:12;16510:18;16500:81;;16566:4;16558:6;16554:17;16544:27;;16500:81;16628:2;16620:6;16617:14;16597:18;16594:38;16591:84;;16647:18;;:::i;:::-;16591:84;16412:269;16361:320;;;:::o;16687:141::-;16736:4;16759:3;16751:11;;16782:3;16779:1;16772:14;16816:4;16813:1;16803:18;16795:26;;16687:141;;;:::o;16834:93::-;16871:6;16918:2;16913;16906:5;16902:14;16898:23;16888:33;;16834:93;;;:::o;16933:107::-;16977:8;17027:5;17021:4;17017:16;16996:37;;16933:107;;;;:::o;17046:393::-;17115:6;17165:1;17153:10;17149:18;17188:97;17218:66;17207:9;17188:97;:::i;:::-;17306:39;17336:8;17325:9;17306:39;:::i;:::-;17294:51;;17378:4;17374:9;17367:5;17363:21;17354:30;;17427:4;17417:8;17413:19;17406:5;17403:30;17393:40;;17122:317;;17046:393;;;;;:::o;17445:60::-;17473:3;17494:5;17487:12;;17445:60;;;:::o;17511:142::-;17561:9;17594:53;17612:34;17621:24;17639:5;17621:24;:::i;:::-;17612:34;:::i;:::-;17594:53;:::i;:::-;17581:66;;17511:142;;;:::o;17659:75::-;17702:3;17723:5;17716:12;;17659:75;;;:::o;17740:269::-;17850:39;17881:7;17850:39;:::i;:::-;17911:91;17960:41;17984:16;17960:41;:::i;:::-;17952:6;17945:4;17939:11;17911:91;:::i;:::-;17905:4;17898:105;17816:193;17740:269;;;:::o;18015:73::-;18060:3;18015:73;:::o;18094:189::-;18171:32;;:::i;:::-;18212:65;18270:6;18262;18256:4;18212:65;:::i;:::-;18147:136;18094:189;;:::o;18289:186::-;18349:120;18366:3;18359:5;18356:14;18349:120;;;18420:39;18457:1;18450:5;18420:39;:::i;:::-;18393:1;18386:5;18382:13;18373:22;;18349:120;;;18289:186;;:::o;18481:543::-;18582:2;18577:3;18574:11;18571:446;;;18616:38;18648:5;18616:38;:::i;:::-;18700:29;18718:10;18700:29;:::i;:::-;18690:8;18686:44;18883:2;18871:10;18868:18;18865:49;;;18904:8;18889:23;;18865:49;18927:80;18983:22;19001:3;18983:22;:::i;:::-;18973:8;18969:37;18956:11;18927:80;:::i;:::-;18586:431;;18571:446;18481:543;;;:::o;19030:117::-;19084:8;19134:5;19128:4;19124:16;19103:37;;19030:117;;;;:::o;19153:169::-;19197:6;19230:51;19278:1;19274:6;19266:5;19263:1;19259:13;19230:51;:::i;:::-;19226:56;19311:4;19305;19301:15;19291:25;;19204:118;19153:169;;;;:::o;19327:295::-;19403:4;19549:29;19574:3;19568:4;19549:29;:::i;:::-;19541:37;;19611:3;19608:1;19604:11;19598:4;19595:21;19587:29;;19327:295;;;;:::o;19627:1395::-;19744:37;19777:3;19744:37;:::i;:::-;19846:18;19838:6;19835:30;19832:56;;;19868:18;;:::i;:::-;19832:56;19912:38;19944:4;19938:11;19912:38;:::i;:::-;19997:67;20057:6;20049;20043:4;19997:67;:::i;:::-;20091:1;20115:4;20102:17;;20147:2;20139:6;20136:14;20164:1;20159:618;;;;20821:1;20838:6;20835:77;;;20887:9;20882:3;20878:19;20872:26;20863:35;;20835:77;20938:67;20998:6;20991:5;20938:67;:::i;:::-;20932:4;20925:81;20794:222;20129:887;;20159:618;20211:4;20207:9;20199:6;20195:22;20245:37;20277:4;20245:37;:::i;:::-;20304:1;20318:208;20332:7;20329:1;20326:14;20318:208;;;20411:9;20406:3;20402:19;20396:26;20388:6;20381:42;20462:1;20454:6;20450:14;20440:24;;20509:2;20498:9;20494:18;20481:31;;20355:4;20352:1;20348:12;20343:17;;20318:208;;;20554:6;20545:7;20542:19;20539:179;;;20612:9;20607:3;20603:19;20597:26;20655:48;20697:4;20689:6;20685:17;20674:9;20655:48;:::i;:::-;20647:6;20640:64;20562:156;20539:179;20764:1;20760;20752:6;20748:14;20744:22;20738:4;20731:36;20166:611;;;20129:887;;19719:1303;;;19627:1395;;:::o;21028:180::-;21076:77;21073:1;21066:88;21173:4;21170:1;21163:15;21197:4;21194:1;21187:15;21214:194;21254:4;21274:20;21292:1;21274:20;:::i;:::-;21269:25;;21308:20;21326:1;21308:20;:::i;:::-;21303:25;;21352:1;21349;21345:9;21337:17;;21376:1;21370:4;21367:11;21364:37;;;21381:18;;:::i;:::-;21364:37;21214:194;;;;:::o;21414:180::-;21462:77;21459:1;21452:88;21559:4;21556:1;21549:15;21583:4;21580:1;21573:15;21600:180;21648:77;21645:1;21638:88;21745:4;21742:1;21735:15;21769:4;21766:1;21759:15;21786:168;21869:11;21903:6;21898:3;21891:19;21943:4;21938:3;21934:14;21919:29;;21786:168;;;;:::o;21960:114::-;;:::o;22080:362::-;22221:3;22242:65;22305:1;22300:3;22242:65;:::i;:::-;22235:72;;22316:93;22405:3;22316:93;:::i;:::-;22434:1;22429:3;22425:11;22418:18;;22080:362;;;:::o;22448:748::-;22697:4;22735:3;22724:9;22720:19;22712:27;;22749:71;22817:1;22806:9;22802:17;22793:6;22749:71;:::i;:::-;22830:72;22898:2;22887:9;22883:18;22874:6;22830:72;:::i;:::-;22912;22980:2;22969:9;22965:18;22956:6;22912:72;:::i;:::-;23031:9;23025:4;23021:20;23016:2;23005:9;23001:18;22994:48;23059:130;23184:4;23059:130;:::i;:::-;23051:138;;22448:748;;;;;;:::o;23202:149::-;23238:7;23278:66;23271:5;23267:78;23256:89;;23202:149;;;:::o;23357:120::-;23429:23;23446:5;23429:23;:::i;:::-;23422:5;23419:34;23409:62;;23467:1;23464;23457:12;23409:62;23357:120;:::o;23483:141::-;23539:5;23570:6;23564:13;23555:22;;23586:32;23612:5;23586:32;:::i;:::-;23483:141;;;;:::o;23630:349::-;23699:6;23748:2;23736:9;23727:7;23723:23;23719:32;23716:119;;;23754:79;;:::i;:::-;23716:119;23874:1;23899:63;23954:7;23945:6;23934:9;23930:22;23899:63;:::i;:::-;23889:73;;23845:127;23630:349;;;;:::o;23985:148::-;24087:11;24124:3;24109:18;;23985:148;;;;:::o;24139:173::-;24279:25;24275:1;24267:6;24263:14;24256:49;24139:173;:::o;24318:402::-;24478:3;24499:85;24581:2;24576:3;24499:85;:::i;:::-;24492:92;;24593:93;24682:3;24593:93;:::i;:::-;24711:2;24706:3;24702:12;24695:19;;24318:402;;;:::o;24726:79::-;24765:7;24794:5;24783:16;;24726:79;;;:::o;24811:157::-;24916:45;24936:24;24954:5;24936:24;:::i;:::-;24916:45;:::i;:::-;24911:3;24904:58;24811:157;;:::o;24974:663::-;25215:3;25237:148;25381:3;25237:148;:::i;:::-;25230:155;;25395:75;25466:3;25457:6;25395:75;:::i;:::-;25495:2;25490:3;25486:12;25479:19;;25508:75;25579:3;25570:6;25508:75;:::i;:::-;25608:2;25603:3;25599:12;25592:19;;25628:3;25621:10;;24974:663;;;;;:::o;25643:180::-;25691:77;25688:1;25681:88;25788:4;25785:1;25778:15;25812:4;25809:1;25802:15;25829:176;25861:1;25878:20;25896:1;25878:20;:::i;:::-;25873:25;;25912:20;25930:1;25912:20;:::i;:::-;25907:25;;25951:1;25941:35;;25956:18;;:::i;:::-;25941:35;25997:1;25994;25990:9;25985:14;;25829:176;;;;:::o;26011:223::-;26151:34;26147:1;26139:6;26135:14;26128:58;26220:6;26215:2;26207:6;26203:15;26196:31;26011:223;:::o;26240:402::-;26400:3;26421:85;26503:2;26498:3;26421:85;:::i;:::-;26414:92;;26515:93;26604:3;26515:93;:::i;:::-;26633:2;26628:3;26624:12;26617:19;;26240:402;;;:::o;26648:663::-;26889:3;26911:148;27055:3;26911:148;:::i;:::-;26904:155;;27069:75;27140:3;27131:6;27069:75;:::i;:::-;27169:2;27164:3;27160:12;27153:19;;27182:75;27253:3;27244:6;27182:75;:::i;:::-;27282:2;27277:3;27273:12;27266:19;;27302:3;27295:10;;26648:663;;;;;:::o;27317:390::-;27423:3;27451:39;27484:5;27451:39;:::i;:::-;27506:89;27588:6;27583:3;27506:89;:::i;:::-;27499:96;;27604:65;27662:6;27657:3;27650:4;27643:5;27639:16;27604:65;:::i;:::-;27694:6;27689:3;27685:16;27678:23;;27427:280;27317:390;;;;:::o;27713:242::-;27882:66;27877:3;27870:79;27713:242;:::o;27961:542::-;28184:3;28206:95;28297:3;28288:6;28206:95;:::i;:::-;28199:102;;28311:138;28445:3;28311:138;:::i;:::-;28474:2;28469:3;28465:12;28458:19;;28494:3;28487:10;;27961:542;;;;:::o;28509:242::-;28678:66;28673:3;28666:79;28509:242;:::o;28757:542::-;28980:3;29002:95;29093:3;29084:6;29002:95;:::i;:::-;28995:102;;29107:138;29241:3;29107:138;:::i;:::-;29270:2;29265:3;29261:12;29254:19;;29290:3;29283:10;;28757:542;;;;:::o;29305:170::-;29469:3;29464;29457:16;29305:170;:::o;29477:519::-;29699:3;29717:95;29808:3;29799:6;29717:95;:::i;:::-;29710:102;;29818:137;29951:3;29818:137;:::i;:::-;29976:1;29971:3;29967:11;29960:18;;29991:3;29984:10;;29477:519;;;;:::o;29998:419::-;30178:3;30196:95;30287:3;30278:6;30196:95;:::i;:::-;30189:102;;30304:95;30395:3;30386:6;30304:95;:::i;:::-;30297:102;;30412:3;30405:10;;29998:419;;;;;:::o;30419:171::-;30459:3;30474:20;30492:1;30474:20;:::i;:::-;30469:25;;30504:20;30522:1;30504:20;:::i;:::-;30499:25;;30543:1;30540;30536:9;30529:16;;30560:3;30557:1;30554:10;30551:36;;;30567:18;;:::i;:::-;30551:36;30419:171;;;;:::o;30592:233::-;30756:66;30751:3;30744:79;30592:233;:::o;30827:519::-;31049:3;31060:137;31193:3;31060:137;:::i;:::-;31218:1;31213:3;31209:11;31202:18;;31233:95;31324:3;31315:6;31233:95;:::i;:::-;31226:102;;31341:3;31334:10;;30827:519;;;;:::o;31348:234::-;31513:66;31508:3;31501:79;31348:234;:::o;31584:522::-;31807:3;31818:138;31952:3;31818:138;:::i;:::-;31977:2;31972:3;31968:12;31961:19;;31993:95;32084:3;32075:6;31993:95;:::i;:::-;31986:102;;32101:3;32094:10;;31584:522;;;;:::o;32108:563::-;32244:66;32240:1;32232:6;32228:14;32221:90;32341:34;32336:2;32328:6;32324:15;32317:59;32406:66;32401:2;32393:6;32389:15;32382:91;32503:66;32498:2;32490:6;32486:15;32479:91;32601:66;32595:3;32587:6;32583:16;32576:92;32108:563;:::o;32673:388::-;32833:3;32850:86;32932:3;32927;32850:86;:::i;:::-;32843:93;;32941;33030:3;32941:93;:::i;:::-;33055:3;33050;33046:13;33039:20;;32673:388;;;:::o;33063:525::-;33296:3;33314:95;33405:3;33396:6;33314:95;:::i;:::-;33307:102;;33422:148;33566:3;33422:148;:::i;:::-;33415:155;;33583:3;33576:10;;33063:525;;;;:::o;33610:794::-;33713:3;33746:5;33740:12;33771:36;33797:9;33771:36;:::i;:::-;33819:89;33901:6;33896:3;33819:89;:::i;:::-;33812:96;;33935:1;33924:9;33920:17;33947:1;33942:150;;;;34102:1;34097:305;;;;33913:489;;33942:150;34018:4;34014:9;34003;33999:25;33994:3;33987:38;34076:6;34069:14;34062:22;34054:6;34050:35;34045:3;34041:45;34034:52;;33942:150;;34097:305;34156:38;34188:5;34156:38;:::i;:::-;34212:1;34222:142;34236:6;34233:1;34230:13;34222:142;;;34306:7;34300:14;34296:1;34291:3;34287:11;34280:35;34352:1;34343:7;34339:15;34328:26;;34258:4;34255:1;34251:12;34246:17;;34222:142;;;34389:6;34384:3;34380:16;34373:23;;34104:298;;33913:489;;33717:687;;33610:794;;;;:::o;34406:413::-;34583:3;34601:92;34689:3;34680:6;34601:92;:::i;:::-;34594:99;;34706:95;34797:3;34788:6;34706:95;:::i;:::-;34699:102;;34814:3;34807:10;;34406:413;;;;;:::o;34821:234::-;34986:66;34981:3;34974:79;34821:234;:::o;35057:522::-;35280:3;35291:138;35425:3;35291:138;:::i;:::-;35450:2;35445:3;35441:12;35434:19;;35466:95;35557:3;35548:6;35466:95;:::i;:::-;35459:102;;35574:3;35567:10;;35057:522;;;;:::o;35581:167::-;35741:4;35736:3;35729:17;35581:167;:::o;35750:503::-;35972:3;35986:95;36077:3;36068:6;35986:95;:::i;:::-;35979:102;;36083:137;36216:3;36083:137;:::i;:::-;36237:1;36232:3;36228:11;36221:18;;36248:3;36241:10;;35750:503;;;;:::o;36273:286::-;36369:3;36382:70;36445:6;36440:3;36382:70;:::i;:::-;36375:77;;36454:56;36503:6;36498:3;36491:5;36454:56;:::i;:::-;36527:29;36549:6;36527:29;:::i;:::-;36522:3;36518:39;36511:46;;36273:286;;;;;:::o;36561:608::-;36766:4;36796:3;36785:9;36781:19;36773:27;;36802:71;36870:1;36859:9;36855:17;36846:6;36802:71;:::i;:::-;36875:72;36943:2;36932:9;36928:18;36919:6;36875:72;:::i;:::-;36949;37017:2;37006:9;37002:18;36993:6;36949:72;:::i;:::-;37060:9;37054:4;37050:20;37045:2;37034:9;37030:18;37023:48;37080:86;37161:4;37152:6;37144;37080:86;:::i;:::-;37072:94;;36561:608;;;;;;;;:::o;37171:193::-;37332:29;37327:3;37320:42;37171:193;:::o;37366:506::-;37589:3;37596:138;37730:3;37596:138;:::i;:::-;37751:2;37746:3;37742:12;37735:19;;37763:95;37854:3;37845:6;37763:95;:::i;:::-;37756:102;;37867:3;37860:10;;37366:506;;;;:::o;37874:166::-;38034:3;38029;38022:16;37874:166;:::o;38042:503::-;38264:3;38278:95;38369:3;38360:6;38278:95;:::i;:::-;38271:102;;38375:137;38508:3;38375:137;:::i;:::-;38529:1;38524:3;38520:11;38513:18;;38540:3;38533:10;;38042:503;;;;:::o;38547:166::-;38707:3;38702;38695:16;38547:166;:::o;38715:503::-;38937:3;38951:95;39042:3;39033:6;38951:95;:::i;:::-;38944:102;;39048:137;39181:3;39048:137;:::i;:::-;39202:1;39197:3;39193:11;39186:18;;39213:3;39206:10;;38715:503;;;;:::o;39220:82::-;39262:8;39293:5;39290:1;39286:13;39273:26;;39220:82;;;:::o;39304:700::-;39365:5;39372:4;39388:6;39379:15;;39404:5;39395:14;;39410:592;39431:1;39421:8;39418:15;39410:592;;;39502:4;39497:3;39493:14;39487:4;39484:24;39481:50;;;39511:18;;:::i;:::-;39481:50;39553:1;39543:8;39539:16;39536:387;;;39912:4;39905:5;39901:16;39892:25;;39536:387;39946:4;39940;39936:15;39928:23;;39968:32;39991:8;39968:32;:::i;:::-;39956:44;;39410:592;;;39304:700;;;;;;;:::o;40006:845::-;40060:5;40219:8;40209:40;;40240:1;40231:10;;40242:5;;40209:40;40260:4;40250:36;;40277:1;40268:10;;40279:5;;40250:36;40330:4;40362:1;40357:27;;;;40390:1;40385:143;;;;40323:205;;40357:27;40375:1;40366:10;;40377:5;;;40385:143;40414:3;40404:8;40401:17;40398:43;;;40421:18;;:::i;:::-;40398:43;40462:8;40459:1;40455:16;40446:25;;40489:3;40482:5;40479:14;40476:40;;;40496:18;;:::i;:::-;40476:40;40521:5;;;40323:205;;40613:2;40603:8;40600:16;40594:3;40588:4;40585:13;40581:36;40571:2;40561:8;40558:16;40553:2;40547:4;40544:12;40540:35;40532:87;40529:182;;;40645:8;40639:4;40635:19;40626:28;;40672:3;40665:5;40662:14;40659:40;;;40679:18;;:::i;:::-;40659:40;40704:5;;40529:182;40728:42;40766:3;40756:8;40750:4;40747:1;40728:42;:::i;:::-;40713:57;;;;40794:4;40789:3;40785:14;40778:5;40775:25;40772:51;;;40803:18;;:::i;:::-;40772:51;40844:4;40837:5;40833:16;40824:25;;40006:845;;;;;;:::o;40853:253::-;40911:5;40927:23;40945:4;40927:23;:::i;:::-;40919:31;;40963:25;40979:8;40963:25;:::i;:::-;40951:37;;40999:104;41036:66;41026:8;41020:4;40999:104;:::i;:::-;40990:113;;40853:253;;;;:::o;41108:149::-;41148:1;41157:20;41175:1;41157:20;:::i;:::-;41152:25;;41183:20;41201:1;41183:20;:::i;:::-;41178:25;;41214:1;41204:35;;41219:18;;:::i;:::-;41204:35;41253:1;41250;41246:9;41241:14;;41108:149;;;;:::o;41259:123::-;41316:5;41339:6;41333:13;41324:22;;41347:33;41374:5;41347:33;:::i;:::-;41259:123;;;;:::o;41384:307::-;41454:6;41495:2;41483:9;41474:7;41470:23;41466:32;41463:119;;;41501:79;;:::i;:::-;41463:119;41605:1;41622:64;41678:7;41669:6;41658:9;41654:22;41622:64;:::i;:::-;41612:74;;41584:104;41384:307;;;;:::o;41693:65::-;41730:7;41751:5;41740:16;;41693:65;;;:::o;41760:67::-;41799:7;41820:5;41809:16;;41760:67;;;:::o;41829:145::-;41926:45;41946:24;41964:5;41946:24;:::i;:::-;41926:45;:::i;:::-;41921:3;41914:58;41829:145;;:::o;41976:353::-;42116:3;42123:75;42194:3;42185:6;42123:75;:::i;:::-;42215:2;42210:3;42206:12;42199:19;;42220:75;42291:3;42282:6;42220:75;:::i;:::-;42312:2;42307:3;42303:12;42296:19;;42324:3;42317:10;;41976:353;;;;;:::o;42331:157::-;42463:21;42459:1;42451:6;42447:14;42440:45;42331:157;:::o;42490:338::-;42632:3;42645:67;42709:2;42704:3;42645:67;:::i;:::-;42638:74;;42713:93;42802:3;42713:93;:::i;:::-;42823:2;42818:3;42814:12;42807:19;;42490:338;;;:::o;42830:391::-;42996:4;43026:2;43015:9;43011:18;43003:26;;43067:9;43061:4;43057:20;43053:1;43042:9;43038:17;43031:47;43087:131;43213:4;43087:131;:::i;:::-;43079:139;;42830:391;;;:::o

Swarm Source

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