ETH Price: $3,275.84 (-4.10%)
Gas: 7 Gwei

Token

PAALX: Bots Collection (PAALX)
 

Overview

Max Total Supply

1,000 PAALX

Holders

299

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 PAALX
0x63a2b0db67e56c7de1dd132a85265cba39ac1b34
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:
PAALXBotsCollection

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-03-01
*/

// File: @openzeppelin/[email protected]/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

// File: @openzeppelin/[email protected]/utils/math/SignedMath.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

// File: @openzeppelin/[email protected]/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/[email protected]/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)

pragma solidity ^0.8.0;



/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @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), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toString(int256 value) internal pure returns (string memory) {
        return string(abi.encodePacked(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) {
        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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        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 keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

// File: @openzeppelin/[email protected]/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/[email protected]/access/Ownable.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/[email protected]/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// File: @openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/[email protected]/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/[email protected]/interfaces/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)

pragma solidity ^0.8.0;


// File: @openzeppelin/[email protected]/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/[email protected]/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// File: @openzeppelin/[email protected]/interfaces/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol)

pragma solidity ^0.8.0;


// File: @openzeppelin/[email protected]/interfaces/IERC4906.sol


// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC4906.sol)

pragma solidity ^0.8.0;



/// @title EIP-721 Metadata Update Extension
interface IERC4906 is IERC165, IERC721 {
    /// @dev This event emits when the metadata of a token is changed.
    /// So that the third-party platforms such as NFT market could
    /// timely update the images and related attributes of the NFT.
    event MetadataUpdate(uint256 _tokenId);

    /// @dev This event emits when the metadata of a range of tokens is changed.
    /// So that the third-party platforms such as NFT market could
    /// timely update the images and related attributes of the NFTs.
    event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);
}

// File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/[email protected]/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not token owner or approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
        _safeTransfer(from, to, tokenId, data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _ownerOf(tokenId) != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId, 1);

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId, 1);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId, 1);

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId, 1);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(address from, address to, uint256 tokenId) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}

    /**
     * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
     *
     * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant
     * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such
     * that `ownerOf(tokenId)` is `a`.
     */
    // solhint-disable-next-line func-name-mixedcase
    function __unsafe_increaseBalance(address account, uint256 amount) internal {
        _balances[account] += amount;
    }
}

// File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721URIStorage.sol


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;



/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is IERC4906, ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC165-supportsInterface}
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, IERC165) returns (bool) {
        return interfaceId == bytes4(0x49064906) || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Emits {MetadataUpdate}.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;

        emit MetadataUpdate(tokenId);
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally checks to see if a
     * token-specific URI was set for the token, and if so, it deletes the token URI from
     * the storage mapping.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: PAALXBotsCollectionNew.sol

//SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;







/**
 * @title PAALX Bots Collection
 * @author Jscrui
 * @notice This contract is the PAALX Bots Collection.
 * @dev This contract is based on ERC721 and ERC721URIStorage
 * 
 * Mint price (mintPrice) is amount of ether to be paid to mint a NFT.
 * Max supply (MAX_SUPPLY) is 1000 NFTs
 * Max supply per wallet (MAX_PER_WALLET) is 15 NFTs
 * 
 */
contract PAALXBotsCollection is ERC721, ERC721URIStorage, Ownable, ReentrancyGuard {        

    string public baseURI;
    string public baseExtension = ".json";
        
    uint256 public mintPrice = 0.1 ether; // 100000000000000000 ether

    uint256 public constant MAX_SUPPLY = 1000; //Total supply
    uint256 public constant MAX_PER_WALLET = 15; //Total supply per round
    
    uint256 public totalSupply;
    
    bool public isPublic;
    bool public isOpen; 

    mapping(address => bool) public isWhitelisted;    
    mapping(address => uint256) public userBalance;

    event Minted(address indexed owner, uint256 tokenId);    
        
    constructor() ERC721("PAALX: Bots Collection", "PAALX"){                        
        baseURI = "https://luxury-pudding-a5ff74.netlify.app/metadata/";                        
    }

    /**
     * This function is called by a user to mint a new NFT
     * @notice The opening time must be reached
     * @notice The user must approve the contract to spend the ERC20 token     
     * @notice The user must be whitelisted or the contract must be public
     */
    function mint() external payable nonReentrant {
        require(isOpen, "PAALX: Not open yet"); 
        require(isPublic || isWhitelisted[msg.sender], "PAALX: Not whitelisted");
        require(totalSupply < MAX_SUPPLY, "PAALX: Max supply reached");        
        require(msg.value == mintPrice, "PAALX: Not enough ether"); 
        require(userBalance[msg.sender] < MAX_PER_WALLET, "PAALX: Max per wallet reached");

        // Increment the total supply        
        totalSupply++;

        // Increment the user balance
        userBalance[msg.sender]++;

        //Mint
        _safeMint(msg.sender, totalSupply);

        // Token URI should be baseURI + tokenID + baseExtension (https://baseURI/1.json)
        string memory thisTokenURI = string(abi.encodePacked(baseURI, Strings.toString(totalSupply), baseExtension));
        _setTokenURI(totalSupply, thisTokenURI);
        
        emit Minted(msg.sender, totalSupply);        
    }

    /**
     * This function is called by a user to mint a batch of NFTs
     * @param _amount The amount of NFTs to be minted being 25 the max amount
     */
    function mintBatch(uint256 _amount) external payable nonReentrant {
        require(isOpen, "PAALX: Not open");         
        require(isPublic || isWhitelisted[msg.sender], "PAALX: Not whitelisted");
        require((totalSupply + _amount) <= MAX_SUPPLY, "PAALX: Max supply reached");
        require(_amount > 0, "PAALX: Amount must be greater than 0");
        require(_amount <= MAX_PER_WALLET, "PAALX: Amount must be less than 25");        
        require((userBalance[msg.sender] + _amount) <= MAX_PER_WALLET, "PAALX: Max per wallet reached");
        require(msg.value == mintPrice * _amount, "PAALX: Not enough ether");        
        
        for (uint256 i = 0; i < _amount; i++) {
            // Increment the total supply        
            totalSupply++;

            // Increment the user balance
            userBalance[msg.sender]++;

            //Mint
            _safeMint(msg.sender, totalSupply);

            // Token URI should be baseURI + tokenID + baseExtension (https://baseURI/1.json)
            string memory thisTokenURI = string(abi.encodePacked(baseURI, Strings.toString(totalSupply), baseExtension));
            _setTokenURI(totalSupply, thisTokenURI);
        
            emit Minted(msg.sender, totalSupply);   
        }   
    }   

    /**
     * This function returns all the metadata for the NFTs hold by the user
     * @param _address The address to check balance
     * @return array of tokenURIs
     */
     function checkTokensBalanceOf(address _address) public view returns(string[] memory) {
        uint256 balance = balanceOf(_address);
        string[] memory tokensURI;
        uint256 i = 0;
        while (tokensURI.length < balance) {
            tokensURI[i] = this.tokenURI(i);
            i++; 
        }
        return tokensURI;
    }

    /**
     * This function is to set the base URI 
     * @param _newBaseURI The new base URI 
     * Example: https://micro-pets.com/api/metadata/
     */
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    /**
     * This function is to set the base extension 
     * @param _newBaseExtension The new base extension 
     * Example: .json
     */
    function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
        baseExtension = _newBaseExtension;
    }

    /**
     * This function is to set the mint price     
     * @param _newMintPrice The new mint price
     * @dev The mint price is in wei
     * Example:
     *      1 = 0,000000000000000001 ether
     *      1000000000000000 = 0,001 ether
     *      1000000000000000000 = 1 ether
     */
    function setMintPrice(uint256 _newMintPrice) public onlyOwner {
        mintPrice = _newMintPrice;
    }

    /**
     * This function starts the minting period
     */
    function startMinting() public onlyOwner {
        isOpen = true;     
    }

    /**
     * This function sets the mint method as public or private
     * @param _isPublic Should be true to be public
     */
    function setPublic(bool _isPublic) public onlyOwner {
        isPublic = _isPublic;
    }

    /**
     * Set an array of addresses as whitelisted or not 
     * @dev should be aligned as address => true/false
     * @param _addresses Array of addresses to be set
     * @param _isWhitelisted Array of boolean values to be set
     */    
    function setWhitelist(address[] memory _addresses, bool[] memory _isWhitelisted) public onlyOwner {
        require(_addresses.length == _isWhitelisted.length, "Arrays must have the same length");
        for (uint256 i = 0; i < _addresses.length; i++) {
            isWhitelisted[_addresses[i]] = _isWhitelisted[i];            
        }
    }   

    /** 
    * Whitdraw the earned Ether from the contract
    */
    function withdrawEarnings() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    /**
     * This function allows the owner to mint 1 NFT to an address 
     * @param _to The address of the receiver 
     */
    function mintTo(address _to) public onlyOwner nonReentrant {
        require(totalSupply < MAX_SUPPLY, "PAALX: Max supply reached");
        
        // Increment the total supply
        totalSupply++;

        // Increment the user balance
        userBalance[msg.sender]++;

        _safeMint(_to, totalSupply);

        emit Minted(_to, totalSupply);
    }


    
    // The following functions are overrides required.
    function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) {
        return super.tokenURI(tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721URIStorage) returns (bool){
        return super.supportsInterface(interfaceId);
    }

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","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":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"checkTokensBalanceOf","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintBatch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","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":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"tokenId","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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPublic","type":"bool"}],"name":"setPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"bool[]","name":"_isWhitelisted","type":"bool[]"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawEarnings","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a90816200004a91906200047c565b5067016345785d8a0000600b5534801562000063575f80fd5b506040518060400160405280601681526020017f5041414c583a20426f747320436f6c6c656374696f6e000000000000000000008152506040518060400160405280600581526020017f5041414c58000000000000000000000000000000000000000000000000000000815250815f9081620000e091906200047c565b508060019081620000f291906200047c565b50505062000115620001096200014e60201b60201c565b6200015560201b60201c565b600160088190555060405180606001604052806033815260200162004e7560339139600990816200014791906200047c565b5062000560565b5f33905090565b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200029457607f821691505b602082108103620002aa57620002a96200024f565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200030e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002d1565b6200031a8683620002d1565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620003646200035e620003588462000332565b6200033b565b62000332565b9050919050565b5f819050919050565b6200037f8362000344565b620003976200038e826200036b565b848454620002dd565b825550505050565b5f90565b620003ad6200039f565b620003ba81848462000374565b505050565b5b81811015620003e157620003d55f82620003a3565b600181019050620003c0565b5050565b601f8211156200043057620003fa81620002b0565b6200040584620002c2565b8101602085101562000415578190505b6200042d6200042485620002c2565b830182620003bf565b50505b505050565b5f82821c905092915050565b5f620004525f198460080262000435565b1980831691505092915050565b5f6200046c838362000441565b9150826002028217905092915050565b620004878262000218565b67ffffffffffffffff811115620004a357620004a262000222565b5b620004af82546200027c565b620004bc828285620003e5565b5f60209050601f831160018114620004f2575f8415620004dd578287015190505b620004e985826200045f565b86555062000558565b601f1984166200050286620002b0565b5f5b828110156200052b5784890151825560018201915060208501945060208101905062000504565b868310156200054b578489015162000547601f89168262000441565b8355505b6001600288020188555050505b505050505050565b614907806200056e5f395ff3fe608060405260043610610219575f3560e01c80636352211e11610122578063a22cb465116100aa578063da3ef23f1161006e578063da3ef23f14610771578063dc9a153514610799578063e985e9c5146107c3578063f2fde38b146107ff578063f4a0a5281461082757610219565b8063a22cb465146106a5578063b73c6ce9146106cd578063b88d4fde146106e3578063c66828621461070b578063c87b56dd1461073557610219565b8063715018a6116100f1578063715018a6146105fd578063755edd17146106135780638da5cb5b1461063b57806395d89b41146106655780639a65ea261461068f57610219565b80636352211e146105315780636817c76c1461056d5780636c0360eb1461059757806370a08231146105c157610219565b806320e409b4116101a55780633b99adf7116101745780633b99adf71461046757806342842e0e1461048f57806347535d7b146104b757806355f804b3146104e15780635cbcec4e1461050957610219565b806320e409b4146103bd57806323b872dd146103d957806332cb6b0c146104015780633af32abf1461042b57610219565b8063081812fc116101ec578063081812fc146102fb578063095ea7b3146103375780630f2cdd6c1461035f5780631249c58b1461038957806318160ddd1461039357610219565b80630103c92b1461021d57806301ffc9a7146102595780630501d6021461029557806306fdde03146102d1575b5f80fd5b348015610228575f80fd5b50610243600480360381019061023e9190612d84565b61084f565b6040516102509190612dc7565b60405180910390f35b348015610264575f80fd5b5061027f600480360381019061027a9190612e35565b610864565b60405161028c9190612e7a565b60405180910390f35b3480156102a0575f80fd5b506102bb60048036038101906102b69190612d84565b610875565b6040516102c89190612fd8565b60405180910390f35b3480156102dc575f80fd5b506102e5610947565b6040516102f29190613040565b60405180910390f35b348015610306575f80fd5b50610321600480360381019061031c919061308a565b6109d6565b60405161032e91906130c4565b60405180910390f35b348015610342575f80fd5b5061035d600480360381019061035891906130dd565b610a18565b005b34801561036a575f80fd5b50610373610b2e565b6040516103809190612dc7565b60405180910390f35b610391610b33565b005b34801561039e575f80fd5b506103a7610e41565b6040516103b49190612dc7565b60405180910390f35b6103d760048036038101906103d2919061308a565b610e47565b005b3480156103e4575f80fd5b506103ff60048036038101906103fa919061311b565b611218565b005b34801561040c575f80fd5b50610415611278565b6040516104229190612dc7565b60405180910390f35b348015610436575f80fd5b50610451600480360381019061044c9190612d84565b61127e565b60405161045e9190612e7a565b60405180910390f35b348015610472575f80fd5b5061048d60048036038101906104889190613395565b61129b565b005b34801561049a575f80fd5b506104b560048036038101906104b0919061311b565b61138c565b005b3480156104c2575f80fd5b506104cb6113ab565b6040516104d89190612e7a565b60405180910390f35b3480156104ec575f80fd5b50610507600480360381019061050291906134bb565b6113be565b005b348015610514575f80fd5b5061052f600480360381019061052a9190613502565b6113d9565b005b34801561053c575f80fd5b506105576004803603810190610552919061308a565b6113fd565b60405161056491906130c4565b60405180910390f35b348015610578575f80fd5b50610581611481565b60405161058e9190612dc7565b60405180910390f35b3480156105a2575f80fd5b506105ab611487565b6040516105b89190613040565b60405180910390f35b3480156105cc575f80fd5b506105e760048036038101906105e29190612d84565b611513565b6040516105f49190612dc7565b60405180910390f35b348015610608575f80fd5b506106116115c7565b005b34801561061e575f80fd5b5061063960048036038101906106349190612d84565b6115da565b005b348015610646575f80fd5b5061064f611700565b60405161065c91906130c4565b60405180910390f35b348015610670575f80fd5b50610679611728565b6040516106869190613040565b60405180910390f35b34801561069a575f80fd5b506106a36117b8565b005b3480156106b0575f80fd5b506106cb60048036038101906106c6919061352d565b6117dd565b005b3480156106d8575f80fd5b506106e16117f3565b005b3480156106ee575f80fd5b5061070960048036038101906107049190613609565b611846565b005b348015610716575f80fd5b5061071f6118a8565b60405161072c9190613040565b60405180910390f35b348015610740575f80fd5b5061075b6004803603810190610756919061308a565b611934565b6040516107689190613040565b60405180910390f35b34801561077c575f80fd5b50610797600480360381019061079291906134bb565b611946565b005b3480156107a4575f80fd5b506107ad611961565b6040516107ba9190612e7a565b60405180910390f35b3480156107ce575f80fd5b506107e960048036038101906107e49190613689565b611973565b6040516107f69190612e7a565b60405180910390f35b34801561080a575f80fd5b5061082560048036038101906108209190612d84565b611a01565b005b348015610832575f80fd5b5061084d6004803603810190610848919061308a565b611a83565b005b600f602052805f5260405f205f915090505481565b5f61086e82611a95565b9050919050565b60605f61088183611513565b905060605f5b828251101561093c573073ffffffffffffffffffffffffffffffffffffffff1663c87b56dd826040518263ffffffff1660e01b81526004016108c99190612dc7565b5f60405180830381865afa1580156108e3573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061090b9190613735565b82828151811061091e5761091d61377c565b5b60200260200101819052508080610934906137d6565b915050610887565b819350505050919050565b60605f80546109559061384a565b80601f01602080910402602001604051908101604052809291908181526020018280546109819061384a565b80156109cc5780601f106109a3576101008083540402835291602001916109cc565b820191905f5260205f20905b8154815290600101906020018083116109af57829003601f168201915b5050505050905090565b5f6109e082611af5565b60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610a22826113fd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a89906138ea565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ab1611b40565b73ffffffffffffffffffffffffffffffffffffffff161480610ae05750610adf81610ada611b40565b611973565b5b610b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1690613978565b60405180910390fd5b610b298383611b47565b505050565b600f81565b610b3b611bfd565b600d60019054906101000a900460ff16610b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b81906139e0565b60405180910390fd5b600d5f9054906101000a900460ff1680610bea5750600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b610c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2090613a48565b60405180910390fd5b6103e8600c5410610c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6690613ab0565b60405180910390fd5b600b543414610cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caa90613b18565b60405180910390fd5b600f805f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410610d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2990613b80565b60405180910390fd5b600c5f815480929190610d44906137d6565b9190505550600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190610d96906137d6565b9190505550610da733600c54611c4c565b5f6009610db5600c54611c69565b600a604051602001610dc993929190613c6a565b6040516020818303038152906040529050610de6600c5482611d33565b3373ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe600c54604051610e2e9190612dc7565b60405180910390a250610e3f611dd5565b565b600c5481565b610e4f611bfd565b600d60019054906101000a900460ff16610e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9590613ce4565b60405180910390fd5b600d5f9054906101000a900460ff1680610efe5750600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b610f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3490613a48565b60405180910390fd5b6103e881600c54610f4e9190613d02565b1115610f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8690613ab0565b60405180910390fd5b5f8111610fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc890613da5565b60405180910390fd5b600f811115611015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100c90613e33565b60405180910390fd5b600f81600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546110609190613d02565b11156110a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109890613b80565b60405180910390fd5b80600b546110af9190613e51565b34146110f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e790613b18565b60405180910390fd5b5f5b8181101561120c57600c5f81548092919061110c906137d6565b9190505550600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81548092919061115e906137d6565b919050555061116f33600c54611c4c565b5f600961117d600c54611c69565b600a60405160200161119193929190613c6a565b60405160208183030381529060405290506111ae600c5482611d33565b3373ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe600c546040516111f69190612dc7565b60405180910390a25080806001019150506110f2565b50611215611dd5565b50565b611229611223611b40565b82611ddf565b611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f90613f02565b60405180910390fd5b611273838383611e73565b505050565b6103e881565b600e602052805f5260405f205f915054906101000a900460ff1681565b6112a361215f565b80518251146112e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112de90613f6a565b60405180910390fd5b5f5b8251811015611387578181815181106113055761130461377c565b5b6020026020010151600e5f8584815181106113235761132261377c565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080806001019150506112e9565b505050565b6113a683838360405180602001604052805f815250611846565b505050565b600d60019054906101000a900460ff1681565b6113c661215f565b80600990816113d59190614113565b5050565b6113e161215f565b80600d5f6101000a81548160ff02191690831515021790555050565b5f80611408836121dd565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611478576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146f9061422c565b60405180910390fd5b80915050919050565b600b5481565b600980546114949061384a565b80601f01602080910402602001604051908101604052809291908181526020018280546114c09061384a565b801561150b5780601f106114e25761010080835404028352916020019161150b565b820191905f5260205f20905b8154815290600101906020018083116114ee57829003601f168201915b505050505081565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611579906142ba565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6115cf61215f565b6115d85f612216565b565b6115e261215f565b6115ea611bfd565b6103e8600c5410611630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162790613ab0565b60405180910390fd5b600c5f815480929190611642906137d6565b9190505550600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190611694906137d6565b91905055506116a581600c54611c4c565b8073ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe600c546040516116ed9190612dc7565b60405180910390a26116fd611dd5565b50565b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546117379061384a565b80601f01602080910402602001604051908101604052809291908181526020018280546117639061384a565b80156117ae5780601f10611785576101008083540402835291602001916117ae565b820191905f5260205f20905b81548152906001019060200180831161179157829003601f168201915b5050505050905090565b6117c061215f565b6001600d60016101000a81548160ff021916908315150217905550565b6117ef6117e8611b40565b83836122d9565b5050565b6117fb61215f565b5f4790503373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611842573d5f803e3d5ffd5b5050565b611857611851611b40565b83611ddf565b611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90613f02565b60405180910390fd5b6118a284848484612440565b50505050565b600a80546118b59061384a565b80601f01602080910402602001604051908101604052809291908181526020018280546118e19061384a565b801561192c5780601f106119035761010080835404028352916020019161192c565b820191905f5260205f20905b81548152906001019060200180831161190f57829003601f168201915b505050505081565b606061193f8261249c565b9050919050565b61194e61215f565b80600a908161195d9190614113565b5050565b600d5f9054906101000a900460ff1681565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611a0961215f565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6e90614348565b60405180910390fd5b611a8081612216565b50565b611a8b61215f565b80600b8190555050565b5f634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611aee5750611aed826125a6565b5b9050919050565b611afe81612687565b611b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b349061422c565b60405180910390fd5b50565b5f33905090565b8160045f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bb7836113fd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600260085403611c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c39906143b0565b60405180910390fd5b6002600881905550565b611c65828260405180602001604052805f8152506126c7565b5050565b60605f6001611c7784612721565b0190505f8167ffffffffffffffff811115611c9557611c9461316f565b5b6040519080825280601f01601f191660200182016040528015611cc75781602001600182028036833780820191505090505b5090505f82602001820190505b600115611d28578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611d1d57611d1c6143ce565b5b0494505f8503611cd4575b819350505050919050565b611d3c82612687565b611d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d729061446b565b60405180910390fd5b8060065f8481526020019081526020015f209081611d999190614113565b507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce782604051611dc99190612dc7565b60405180910390a15050565b6001600881905550565b5f80611dea836113fd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e2c5750611e2b8185611973565b5b80611e6a57508373ffffffffffffffffffffffffffffffffffffffff16611e52846109d6565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e93826113fd565b73ffffffffffffffffffffffffffffffffffffffff1614611ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee0906144f9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4e90614587565b60405180910390fd5b611f648383836001612872565b8273ffffffffffffffffffffffffffffffffffffffff16611f84826113fd565b73ffffffffffffffffffffffffffffffffffffffff1614611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd1906144f9565b60405180910390fd5b60045f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540392505081905550600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461215a8383836001612878565b505050565b612167611b40565b73ffffffffffffffffffffffffffffffffffffffff16612185611700565b73ffffffffffffffffffffffffffffffffffffffff16146121db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d2906145ef565b60405180910390fd5b565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233e90614657565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124339190612e7a565b60405180910390a3505050565b61244b848484611e73565b6124578484848461287e565b612496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248d906146e5565b60405180910390fd5b50505050565b60606124a782611af5565b5f60065f8481526020019081526020015f2080546124c49061384a565b80601f01602080910402602001604051908101604052809291908181526020018280546124f09061384a565b801561253b5780601f106125125761010080835404028352916020019161253b565b820191905f5260205f20905b81548152906001019060200180831161251e57829003601f168201915b505050505090505f61254b612a00565b90505f81510361255f5781925050506125a1565b5f8251111561259357808260405160200161257b929190614703565b604051602081830303815290604052925050506125a1565b61259c84612a16565b925050505b919050565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061267057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612680575061267f82612a7b565b5b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff166126a8836121dd565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6126d18383612ae4565b6126dd5f84848461287e565b61271c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612713906146e5565b60405180910390fd5b505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061277d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612773576127726143ce565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106127ba576d04ee2d6d415b85acef810000000083816127b0576127af6143ce565b5b0492506020810190505b662386f26fc1000083106127e957662386f26fc1000083816127df576127de6143ce565b5b0492506010810190505b6305f5e1008310612812576305f5e1008381612808576128076143ce565b5b0492506008810190505b612710831061283757612710838161282d5761282c6143ce565b5b0492506004810190505b6064831061285a57606483816128505761284f6143ce565b5b0492506002810190505b600a8310612869576001810190505b80915050919050565b50505050565b50505050565b5f61289e8473ffffffffffffffffffffffffffffffffffffffff16612cf7565b156129f3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128c7611b40565b8786866040518563ffffffff1660e01b81526004016128e99493929190614778565b6020604051808303815f875af192505050801561292457506040513d601f19601f8201168201806040525081019061292191906147d6565b60015b6129a3573d805f8114612952576040519150601f19603f3d011682016040523d82523d5f602084013e612957565b606091505b505f81510361299b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612992906146e5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129f8565b600190505b949350505050565b606060405180602001604052805f815250905090565b6060612a2182611af5565b5f612a2a612a00565b90505f815111612a485760405180602001604052805f815250612a73565b80612a5284611c69565b604051602001612a63929190614703565b6040516020818303038152906040525b915050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b499061484b565b60405180910390fd5b612b5b81612687565b15612b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b92906148b3565b60405180910390fd5b612ba85f83836001612872565b612bb181612687565b15612bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be8906148b3565b60405180910390fd5b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cf35f83836001612878565b5050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612d5382612d2a565b9050919050565b612d6381612d49565b8114612d6d575f80fd5b50565b5f81359050612d7e81612d5a565b92915050565b5f60208284031215612d9957612d98612d22565b5b5f612da684828501612d70565b91505092915050565b5f819050919050565b612dc181612daf565b82525050565b5f602082019050612dda5f830184612db8565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e1481612de0565b8114612e1e575f80fd5b50565b5f81359050612e2f81612e0b565b92915050565b5f60208284031215612e4a57612e49612d22565b5b5f612e5784828501612e21565b91505092915050565b5f8115159050919050565b612e7481612e60565b82525050565b5f602082019050612e8d5f830184612e6b565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612ef3578082015181840152602081019050612ed8565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612f1882612ebc565b612f228185612ec6565b9350612f32818560208601612ed6565b612f3b81612efe565b840191505092915050565b5f612f518383612f0e565b905092915050565b5f602082019050919050565b5f612f6f82612e93565b612f798185612e9d565b935083602082028501612f8b85612ead565b805f5b85811015612fc65784840389528151612fa78582612f46565b9450612fb283612f59565b925060208a01995050600181019050612f8e565b50829750879550505050505092915050565b5f6020820190508181035f830152612ff08184612f65565b905092915050565b5f82825260208201905092915050565b5f61301282612ebc565b61301c8185612ff8565b935061302c818560208601612ed6565b61303581612efe565b840191505092915050565b5f6020820190508181035f8301526130588184613008565b905092915050565b61306981612daf565b8114613073575f80fd5b50565b5f8135905061308481613060565b92915050565b5f6020828403121561309f5761309e612d22565b5b5f6130ac84828501613076565b91505092915050565b6130be81612d49565b82525050565b5f6020820190506130d75f8301846130b5565b92915050565b5f80604083850312156130f3576130f2612d22565b5b5f61310085828601612d70565b925050602061311185828601613076565b9150509250929050565b5f805f6060848603121561313257613131612d22565b5b5f61313f86828701612d70565b935050602061315086828701612d70565b925050604061316186828701613076565b9150509250925092565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6131a582612efe565b810181811067ffffffffffffffff821117156131c4576131c361316f565b5b80604052505050565b5f6131d6612d19565b90506131e2828261319c565b919050565b5f67ffffffffffffffff8211156132015761320061316f565b5b602082029050602081019050919050565b5f80fd5b5f613228613223846131e7565b6131cd565b9050808382526020820190506020840283018581111561324b5761324a613212565b5b835b8181101561327457806132608882612d70565b84526020840193505060208101905061324d565b5050509392505050565b5f82601f8301126132925761329161316b565b5b81356132a2848260208601613216565b91505092915050565b5f67ffffffffffffffff8211156132c5576132c461316f565b5b602082029050602081019050919050565b6132df81612e60565b81146132e9575f80fd5b50565b5f813590506132fa816132d6565b92915050565b5f61331261330d846132ab565b6131cd565b9050808382526020820190506020840283018581111561333557613334613212565b5b835b8181101561335e578061334a88826132ec565b845260208401935050602081019050613337565b5050509392505050565b5f82601f83011261337c5761337b61316b565b5b813561338c848260208601613300565b91505092915050565b5f80604083850312156133ab576133aa612d22565b5b5f83013567ffffffffffffffff8111156133c8576133c7612d26565b5b6133d48582860161327e565b925050602083013567ffffffffffffffff8111156133f5576133f4612d26565b5b61340185828601613368565b9150509250929050565b5f80fd5b5f67ffffffffffffffff8211156134295761342861316f565b5b61343282612efe565b9050602081019050919050565b828183375f83830152505050565b5f61345f61345a8461340f565b6131cd565b90508281526020810184848401111561347b5761347a61340b565b5b61348684828561343f565b509392505050565b5f82601f8301126134a2576134a161316b565b5b81356134b284826020860161344d565b91505092915050565b5f602082840312156134d0576134cf612d22565b5b5f82013567ffffffffffffffff8111156134ed576134ec612d26565b5b6134f98482850161348e565b91505092915050565b5f6020828403121561351757613516612d22565b5b5f613524848285016132ec565b91505092915050565b5f806040838503121561354357613542612d22565b5b5f61355085828601612d70565b9250506020613561858286016132ec565b9150509250929050565b5f67ffffffffffffffff8211156135855761358461316f565b5b61358e82612efe565b9050602081019050919050565b5f6135ad6135a88461356b565b6131cd565b9050828152602081018484840111156135c9576135c861340b565b5b6135d484828561343f565b509392505050565b5f82601f8301126135f0576135ef61316b565b5b813561360084826020860161359b565b91505092915050565b5f805f806080858703121561362157613620612d22565b5b5f61362e87828801612d70565b945050602061363f87828801612d70565b935050604061365087828801613076565b925050606085013567ffffffffffffffff81111561367157613670612d26565b5b61367d878288016135dc565b91505092959194509250565b5f806040838503121561369f5761369e612d22565b5b5f6136ac85828601612d70565b92505060206136bd85828601612d70565b9150509250929050565b5f6136d96136d48461340f565b6131cd565b9050828152602081018484840111156136f5576136f461340b565b5b613700848285612ed6565b509392505050565b5f82601f83011261371c5761371b61316b565b5b815161372c8482602086016136c7565b91505092915050565b5f6020828403121561374a57613749612d22565b5b5f82015167ffffffffffffffff81111561376757613766612d26565b5b61377384828501613708565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6137e082612daf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613812576138116137a9565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061386157607f821691505b6020821081036138745761387361381d565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f6138d4602183612ff8565b91506138df8261387a565b604082019050919050565b5f6020820190508181035f830152613901816138c8565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f5f8201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b5f613962603d83612ff8565b915061396d82613908565b604082019050919050565b5f6020820190508181035f83015261398f81613956565b9050919050565b7f5041414c583a204e6f74206f70656e20796574000000000000000000000000005f82015250565b5f6139ca601383612ff8565b91506139d582613996565b602082019050919050565b5f6020820190508181035f8301526139f7816139be565b9050919050565b7f5041414c583a204e6f742077686974656c6973746564000000000000000000005f82015250565b5f613a32601683612ff8565b9150613a3d826139fe565b602082019050919050565b5f6020820190508181035f830152613a5f81613a26565b9050919050565b7f5041414c583a204d617820737570706c792072656163686564000000000000005f82015250565b5f613a9a601983612ff8565b9150613aa582613a66565b602082019050919050565b5f6020820190508181035f830152613ac781613a8e565b9050919050565b7f5041414c583a204e6f7420656e6f7567682065746865720000000000000000005f82015250565b5f613b02601783612ff8565b9150613b0d82613ace565b602082019050919050565b5f6020820190508181035f830152613b2f81613af6565b9050919050565b7f5041414c583a204d6178207065722077616c6c657420726561636865640000005f82015250565b5f613b6a601d83612ff8565b9150613b7582613b36565b602082019050919050565b5f6020820190508181035f830152613b9781613b5e565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154613bc68161384a565b613bd08186613b9e565b9450600182165f8114613bea5760018114613bff57613c31565b60ff1983168652811515820286019350613c31565b613c0885613ba8565b5f5b83811015613c2957815481890152600182019150602081019050613c0a565b838801955050505b50505092915050565b5f613c4482612ebc565b613c4e8185613b9e565b9350613c5e818560208601612ed6565b80840191505092915050565b5f613c758286613bba565b9150613c818285613c3a565b9150613c8d8284613bba565b9150819050949350505050565b7f5041414c583a204e6f74206f70656e00000000000000000000000000000000005f82015250565b5f613cce600f83612ff8565b9150613cd982613c9a565b602082019050919050565b5f6020820190508181035f830152613cfb81613cc2565b9050919050565b5f613d0c82612daf565b9150613d1783612daf565b9250828201905080821115613d2f57613d2e6137a9565b5b92915050565b7f5041414c583a20416d6f756e74206d75737420626520677265617465722074685f8201527f616e203000000000000000000000000000000000000000000000000000000000602082015250565b5f613d8f602483612ff8565b9150613d9a82613d35565b604082019050919050565b5f6020820190508181035f830152613dbc81613d83565b9050919050565b7f5041414c583a20416d6f756e74206d757374206265206c657373207468616e205f8201527f3235000000000000000000000000000000000000000000000000000000000000602082015250565b5f613e1d602283612ff8565b9150613e2882613dc3565b604082019050919050565b5f6020820190508181035f830152613e4a81613e11565b9050919050565b5f613e5b82612daf565b9150613e6683612daf565b9250828202613e7481612daf565b91508282048414831517613e8b57613e8a6137a9565b5b5092915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e655f8201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b5f613eec602d83612ff8565b9150613ef782613e92565b604082019050919050565b5f6020820190508181035f830152613f1981613ee0565b9050919050565b7f417272617973206d7573742068617665207468652073616d65206c656e6774685f82015250565b5f613f54602083612ff8565b9150613f5f82613f20565b602082019050919050565b5f6020820190508181035f830152613f8181613f48565b9050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302613fd27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613f97565b613fdc8683613f97565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61401761401261400d84612daf565b613ff4565b612daf565b9050919050565b5f819050919050565b61403083613ffd565b61404461403c8261401e565b848454613fa3565b825550505050565b5f90565b61405861404c565b614063818484614027565b505050565b5b818110156140865761407b5f82614050565b600181019050614069565b5050565b601f8211156140cb5761409c81613ba8565b6140a584613f88565b810160208510156140b4578190505b6140c86140c085613f88565b830182614068565b50505b505050565b5f82821c905092915050565b5f6140eb5f19846008026140d0565b1980831691505092915050565b5f61410383836140dc565b9150826002028217905092915050565b61411c82612ebc565b67ffffffffffffffff8111156141355761413461316f565b5b61413f825461384a565b61414a82828561408a565b5f60209050601f83116001811461417b575f8415614169578287015190505b61417385826140f8565b8655506141da565b601f19841661418986613ba8565b5f5b828110156141b05784890151825560018201915060208501945060208101905061418b565b868310156141cd57848901516141c9601f8916826140dc565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e20494400000000000000005f82015250565b5f614216601883612ff8565b9150614221826141e2565b602082019050919050565b5f6020820190508181035f8301526142438161420a565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f7420612076615f8201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b5f6142a4602983612ff8565b91506142af8261424a565b604082019050919050565b5f6020820190508181035f8301526142d181614298565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f614332602683612ff8565b915061433d826142d8565b604082019050919050565b5f6020820190508181035f83015261435f81614326565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f61439a601f83612ff8565b91506143a582614366565b602082019050919050565b5f6020820190508181035f8301526143c78161438e565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e5f8201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b5f614455602e83612ff8565b9150614460826143fb565b604082019050919050565b5f6020820190508181035f83015261448281614449565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f7272656374205f8201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b5f6144e3602583612ff8565b91506144ee82614489565b604082019050919050565b5f6020820190508181035f830152614510816144d7565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f614571602483612ff8565b915061457c82614517565b604082019050919050565b5f6020820190508181035f83015261459e81614565565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6145d9602083612ff8565b91506145e4826145a5565b602082019050919050565b5f6020820190508181035f830152614606816145cd565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c6572000000000000005f82015250565b5f614641601983612ff8565b915061464c8261460d565b602082019050919050565b5f6020820190508181035f83015261466e81614635565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e2045524337323152655f8201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b5f6146cf603283612ff8565b91506146da82614675565b604082019050919050565b5f6020820190508181035f8301526146fc816146c3565b9050919050565b5f61470e8285613c3a565b915061471a8284613c3a565b91508190509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f61474a82614726565b6147548185614730565b9350614764818560208601612ed6565b61476d81612efe565b840191505092915050565b5f60808201905061478b5f8301876130b5565b61479860208301866130b5565b6147a56040830185612db8565b81810360608301526147b78184614740565b905095945050505050565b5f815190506147d081612e0b565b92915050565b5f602082840312156147eb576147ea612d22565b5b5f6147f8848285016147c2565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f614835602083612ff8565b915061484082614801565b602082019050919050565b5f6020820190508181035f83015261486281614829565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e746564000000005f82015250565b5f61489d601c83612ff8565b91506148a882614869565b602082019050919050565b5f6020820190508181035f8301526148ca81614891565b905091905056fea26469706673582212203cfc9f8ba7d47894edf9ce68426ab1467223a2998af97671afe1f580499eccb264736f6c6343000818003368747470733a2f2f6c75787572792d70756464696e672d6135666637342e6e65746c6966792e6170702f6d657461646174612f

Deployed Bytecode

0x608060405260043610610219575f3560e01c80636352211e11610122578063a22cb465116100aa578063da3ef23f1161006e578063da3ef23f14610771578063dc9a153514610799578063e985e9c5146107c3578063f2fde38b146107ff578063f4a0a5281461082757610219565b8063a22cb465146106a5578063b73c6ce9146106cd578063b88d4fde146106e3578063c66828621461070b578063c87b56dd1461073557610219565b8063715018a6116100f1578063715018a6146105fd578063755edd17146106135780638da5cb5b1461063b57806395d89b41146106655780639a65ea261461068f57610219565b80636352211e146105315780636817c76c1461056d5780636c0360eb1461059757806370a08231146105c157610219565b806320e409b4116101a55780633b99adf7116101745780633b99adf71461046757806342842e0e1461048f57806347535d7b146104b757806355f804b3146104e15780635cbcec4e1461050957610219565b806320e409b4146103bd57806323b872dd146103d957806332cb6b0c146104015780633af32abf1461042b57610219565b8063081812fc116101ec578063081812fc146102fb578063095ea7b3146103375780630f2cdd6c1461035f5780631249c58b1461038957806318160ddd1461039357610219565b80630103c92b1461021d57806301ffc9a7146102595780630501d6021461029557806306fdde03146102d1575b5f80fd5b348015610228575f80fd5b50610243600480360381019061023e9190612d84565b61084f565b6040516102509190612dc7565b60405180910390f35b348015610264575f80fd5b5061027f600480360381019061027a9190612e35565b610864565b60405161028c9190612e7a565b60405180910390f35b3480156102a0575f80fd5b506102bb60048036038101906102b69190612d84565b610875565b6040516102c89190612fd8565b60405180910390f35b3480156102dc575f80fd5b506102e5610947565b6040516102f29190613040565b60405180910390f35b348015610306575f80fd5b50610321600480360381019061031c919061308a565b6109d6565b60405161032e91906130c4565b60405180910390f35b348015610342575f80fd5b5061035d600480360381019061035891906130dd565b610a18565b005b34801561036a575f80fd5b50610373610b2e565b6040516103809190612dc7565b60405180910390f35b610391610b33565b005b34801561039e575f80fd5b506103a7610e41565b6040516103b49190612dc7565b60405180910390f35b6103d760048036038101906103d2919061308a565b610e47565b005b3480156103e4575f80fd5b506103ff60048036038101906103fa919061311b565b611218565b005b34801561040c575f80fd5b50610415611278565b6040516104229190612dc7565b60405180910390f35b348015610436575f80fd5b50610451600480360381019061044c9190612d84565b61127e565b60405161045e9190612e7a565b60405180910390f35b348015610472575f80fd5b5061048d60048036038101906104889190613395565b61129b565b005b34801561049a575f80fd5b506104b560048036038101906104b0919061311b565b61138c565b005b3480156104c2575f80fd5b506104cb6113ab565b6040516104d89190612e7a565b60405180910390f35b3480156104ec575f80fd5b50610507600480360381019061050291906134bb565b6113be565b005b348015610514575f80fd5b5061052f600480360381019061052a9190613502565b6113d9565b005b34801561053c575f80fd5b506105576004803603810190610552919061308a565b6113fd565b60405161056491906130c4565b60405180910390f35b348015610578575f80fd5b50610581611481565b60405161058e9190612dc7565b60405180910390f35b3480156105a2575f80fd5b506105ab611487565b6040516105b89190613040565b60405180910390f35b3480156105cc575f80fd5b506105e760048036038101906105e29190612d84565b611513565b6040516105f49190612dc7565b60405180910390f35b348015610608575f80fd5b506106116115c7565b005b34801561061e575f80fd5b5061063960048036038101906106349190612d84565b6115da565b005b348015610646575f80fd5b5061064f611700565b60405161065c91906130c4565b60405180910390f35b348015610670575f80fd5b50610679611728565b6040516106869190613040565b60405180910390f35b34801561069a575f80fd5b506106a36117b8565b005b3480156106b0575f80fd5b506106cb60048036038101906106c6919061352d565b6117dd565b005b3480156106d8575f80fd5b506106e16117f3565b005b3480156106ee575f80fd5b5061070960048036038101906107049190613609565b611846565b005b348015610716575f80fd5b5061071f6118a8565b60405161072c9190613040565b60405180910390f35b348015610740575f80fd5b5061075b6004803603810190610756919061308a565b611934565b6040516107689190613040565b60405180910390f35b34801561077c575f80fd5b50610797600480360381019061079291906134bb565b611946565b005b3480156107a4575f80fd5b506107ad611961565b6040516107ba9190612e7a565b60405180910390f35b3480156107ce575f80fd5b506107e960048036038101906107e49190613689565b611973565b6040516107f69190612e7a565b60405180910390f35b34801561080a575f80fd5b5061082560048036038101906108209190612d84565b611a01565b005b348015610832575f80fd5b5061084d6004803603810190610848919061308a565b611a83565b005b600f602052805f5260405f205f915090505481565b5f61086e82611a95565b9050919050565b60605f61088183611513565b905060605f5b828251101561093c573073ffffffffffffffffffffffffffffffffffffffff1663c87b56dd826040518263ffffffff1660e01b81526004016108c99190612dc7565b5f60405180830381865afa1580156108e3573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061090b9190613735565b82828151811061091e5761091d61377c565b5b60200260200101819052508080610934906137d6565b915050610887565b819350505050919050565b60605f80546109559061384a565b80601f01602080910402602001604051908101604052809291908181526020018280546109819061384a565b80156109cc5780601f106109a3576101008083540402835291602001916109cc565b820191905f5260205f20905b8154815290600101906020018083116109af57829003601f168201915b5050505050905090565b5f6109e082611af5565b60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610a22826113fd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a89906138ea565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ab1611b40565b73ffffffffffffffffffffffffffffffffffffffff161480610ae05750610adf81610ada611b40565b611973565b5b610b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1690613978565b60405180910390fd5b610b298383611b47565b505050565b600f81565b610b3b611bfd565b600d60019054906101000a900460ff16610b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b81906139e0565b60405180910390fd5b600d5f9054906101000a900460ff1680610bea5750600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b610c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2090613a48565b60405180910390fd5b6103e8600c5410610c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6690613ab0565b60405180910390fd5b600b543414610cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caa90613b18565b60405180910390fd5b600f805f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410610d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2990613b80565b60405180910390fd5b600c5f815480929190610d44906137d6565b9190505550600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190610d96906137d6565b9190505550610da733600c54611c4c565b5f6009610db5600c54611c69565b600a604051602001610dc993929190613c6a565b6040516020818303038152906040529050610de6600c5482611d33565b3373ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe600c54604051610e2e9190612dc7565b60405180910390a250610e3f611dd5565b565b600c5481565b610e4f611bfd565b600d60019054906101000a900460ff16610e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9590613ce4565b60405180910390fd5b600d5f9054906101000a900460ff1680610efe5750600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b610f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3490613a48565b60405180910390fd5b6103e881600c54610f4e9190613d02565b1115610f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8690613ab0565b60405180910390fd5b5f8111610fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc890613da5565b60405180910390fd5b600f811115611015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100c90613e33565b60405180910390fd5b600f81600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546110609190613d02565b11156110a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109890613b80565b60405180910390fd5b80600b546110af9190613e51565b34146110f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e790613b18565b60405180910390fd5b5f5b8181101561120c57600c5f81548092919061110c906137d6565b9190505550600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81548092919061115e906137d6565b919050555061116f33600c54611c4c565b5f600961117d600c54611c69565b600a60405160200161119193929190613c6a565b60405160208183030381529060405290506111ae600c5482611d33565b3373ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe600c546040516111f69190612dc7565b60405180910390a25080806001019150506110f2565b50611215611dd5565b50565b611229611223611b40565b82611ddf565b611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f90613f02565b60405180910390fd5b611273838383611e73565b505050565b6103e881565b600e602052805f5260405f205f915054906101000a900460ff1681565b6112a361215f565b80518251146112e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112de90613f6a565b60405180910390fd5b5f5b8251811015611387578181815181106113055761130461377c565b5b6020026020010151600e5f8584815181106113235761132261377c565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080806001019150506112e9565b505050565b6113a683838360405180602001604052805f815250611846565b505050565b600d60019054906101000a900460ff1681565b6113c661215f565b80600990816113d59190614113565b5050565b6113e161215f565b80600d5f6101000a81548160ff02191690831515021790555050565b5f80611408836121dd565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611478576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146f9061422c565b60405180910390fd5b80915050919050565b600b5481565b600980546114949061384a565b80601f01602080910402602001604051908101604052809291908181526020018280546114c09061384a565b801561150b5780601f106114e25761010080835404028352916020019161150b565b820191905f5260205f20905b8154815290600101906020018083116114ee57829003601f168201915b505050505081565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611579906142ba565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6115cf61215f565b6115d85f612216565b565b6115e261215f565b6115ea611bfd565b6103e8600c5410611630576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162790613ab0565b60405180910390fd5b600c5f815480929190611642906137d6565b9190505550600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190611694906137d6565b91905055506116a581600c54611c4c565b8073ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe600c546040516116ed9190612dc7565b60405180910390a26116fd611dd5565b50565b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546117379061384a565b80601f01602080910402602001604051908101604052809291908181526020018280546117639061384a565b80156117ae5780601f10611785576101008083540402835291602001916117ae565b820191905f5260205f20905b81548152906001019060200180831161179157829003601f168201915b5050505050905090565b6117c061215f565b6001600d60016101000a81548160ff021916908315150217905550565b6117ef6117e8611b40565b83836122d9565b5050565b6117fb61215f565b5f4790503373ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611842573d5f803e3d5ffd5b5050565b611857611851611b40565b83611ddf565b611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90613f02565b60405180910390fd5b6118a284848484612440565b50505050565b600a80546118b59061384a565b80601f01602080910402602001604051908101604052809291908181526020018280546118e19061384a565b801561192c5780601f106119035761010080835404028352916020019161192c565b820191905f5260205f20905b81548152906001019060200180831161190f57829003601f168201915b505050505081565b606061193f8261249c565b9050919050565b61194e61215f565b80600a908161195d9190614113565b5050565b600d5f9054906101000a900460ff1681565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611a0961215f565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6e90614348565b60405180910390fd5b611a8081612216565b50565b611a8b61215f565b80600b8190555050565b5f634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611aee5750611aed826125a6565b5b9050919050565b611afe81612687565b611b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b349061422c565b60405180910390fd5b50565b5f33905090565b8160045f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bb7836113fd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600260085403611c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c39906143b0565b60405180910390fd5b6002600881905550565b611c65828260405180602001604052805f8152506126c7565b5050565b60605f6001611c7784612721565b0190505f8167ffffffffffffffff811115611c9557611c9461316f565b5b6040519080825280601f01601f191660200182016040528015611cc75781602001600182028036833780820191505090505b5090505f82602001820190505b600115611d28578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581611d1d57611d1c6143ce565b5b0494505f8503611cd4575b819350505050919050565b611d3c82612687565b611d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d729061446b565b60405180910390fd5b8060065f8481526020019081526020015f209081611d999190614113565b507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce782604051611dc99190612dc7565b60405180910390a15050565b6001600881905550565b5f80611dea836113fd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e2c5750611e2b8185611973565b5b80611e6a57508373ffffffffffffffffffffffffffffffffffffffff16611e52846109d6565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e93826113fd565b73ffffffffffffffffffffffffffffffffffffffff1614611ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee0906144f9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4e90614587565b60405180910390fd5b611f648383836001612872565b8273ffffffffffffffffffffffffffffffffffffffff16611f84826113fd565b73ffffffffffffffffffffffffffffffffffffffff1614611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd1906144f9565b60405180910390fd5b60045f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540392505081905550600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461215a8383836001612878565b505050565b612167611b40565b73ffffffffffffffffffffffffffffffffffffffff16612185611700565b73ffffffffffffffffffffffffffffffffffffffff16146121db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d2906145ef565b60405180910390fd5b565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233e90614657565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124339190612e7a565b60405180910390a3505050565b61244b848484611e73565b6124578484848461287e565b612496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248d906146e5565b60405180910390fd5b50505050565b60606124a782611af5565b5f60065f8481526020019081526020015f2080546124c49061384a565b80601f01602080910402602001604051908101604052809291908181526020018280546124f09061384a565b801561253b5780601f106125125761010080835404028352916020019161253b565b820191905f5260205f20905b81548152906001019060200180831161251e57829003601f168201915b505050505090505f61254b612a00565b90505f81510361255f5781925050506125a1565b5f8251111561259357808260405160200161257b929190614703565b604051602081830303815290604052925050506125a1565b61259c84612a16565b925050505b919050565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061267057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612680575061267f82612a7b565b5b9050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff166126a8836121dd565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6126d18383612ae4565b6126dd5f84848461287e565b61271c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612713906146e5565b60405180910390fd5b505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061277d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612773576127726143ce565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106127ba576d04ee2d6d415b85acef810000000083816127b0576127af6143ce565b5b0492506020810190505b662386f26fc1000083106127e957662386f26fc1000083816127df576127de6143ce565b5b0492506010810190505b6305f5e1008310612812576305f5e1008381612808576128076143ce565b5b0492506008810190505b612710831061283757612710838161282d5761282c6143ce565b5b0492506004810190505b6064831061285a57606483816128505761284f6143ce565b5b0492506002810190505b600a8310612869576001810190505b80915050919050565b50505050565b50505050565b5f61289e8473ffffffffffffffffffffffffffffffffffffffff16612cf7565b156129f3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128c7611b40565b8786866040518563ffffffff1660e01b81526004016128e99493929190614778565b6020604051808303815f875af192505050801561292457506040513d601f19601f8201168201806040525081019061292191906147d6565b60015b6129a3573d805f8114612952576040519150601f19603f3d011682016040523d82523d5f602084013e612957565b606091505b505f81510361299b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612992906146e5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129f8565b600190505b949350505050565b606060405180602001604052805f815250905090565b6060612a2182611af5565b5f612a2a612a00565b90505f815111612a485760405180602001604052805f815250612a73565b80612a5284611c69565b604051602001612a63929190614703565b6040516020818303038152906040525b915050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b499061484b565b60405180910390fd5b612b5b81612687565b15612b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b92906148b3565b60405180910390fd5b612ba85f83836001612872565b612bb181612687565b15612bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be8906148b3565b60405180910390fd5b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cf35f83836001612878565b5050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612d5382612d2a565b9050919050565b612d6381612d49565b8114612d6d575f80fd5b50565b5f81359050612d7e81612d5a565b92915050565b5f60208284031215612d9957612d98612d22565b5b5f612da684828501612d70565b91505092915050565b5f819050919050565b612dc181612daf565b82525050565b5f602082019050612dda5f830184612db8565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e1481612de0565b8114612e1e575f80fd5b50565b5f81359050612e2f81612e0b565b92915050565b5f60208284031215612e4a57612e49612d22565b5b5f612e5784828501612e21565b91505092915050565b5f8115159050919050565b612e7481612e60565b82525050565b5f602082019050612e8d5f830184612e6b565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612ef3578082015181840152602081019050612ed8565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612f1882612ebc565b612f228185612ec6565b9350612f32818560208601612ed6565b612f3b81612efe565b840191505092915050565b5f612f518383612f0e565b905092915050565b5f602082019050919050565b5f612f6f82612e93565b612f798185612e9d565b935083602082028501612f8b85612ead565b805f5b85811015612fc65784840389528151612fa78582612f46565b9450612fb283612f59565b925060208a01995050600181019050612f8e565b50829750879550505050505092915050565b5f6020820190508181035f830152612ff08184612f65565b905092915050565b5f82825260208201905092915050565b5f61301282612ebc565b61301c8185612ff8565b935061302c818560208601612ed6565b61303581612efe565b840191505092915050565b5f6020820190508181035f8301526130588184613008565b905092915050565b61306981612daf565b8114613073575f80fd5b50565b5f8135905061308481613060565b92915050565b5f6020828403121561309f5761309e612d22565b5b5f6130ac84828501613076565b91505092915050565b6130be81612d49565b82525050565b5f6020820190506130d75f8301846130b5565b92915050565b5f80604083850312156130f3576130f2612d22565b5b5f61310085828601612d70565b925050602061311185828601613076565b9150509250929050565b5f805f6060848603121561313257613131612d22565b5b5f61313f86828701612d70565b935050602061315086828701612d70565b925050604061316186828701613076565b9150509250925092565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6131a582612efe565b810181811067ffffffffffffffff821117156131c4576131c361316f565b5b80604052505050565b5f6131d6612d19565b90506131e2828261319c565b919050565b5f67ffffffffffffffff8211156132015761320061316f565b5b602082029050602081019050919050565b5f80fd5b5f613228613223846131e7565b6131cd565b9050808382526020820190506020840283018581111561324b5761324a613212565b5b835b8181101561327457806132608882612d70565b84526020840193505060208101905061324d565b5050509392505050565b5f82601f8301126132925761329161316b565b5b81356132a2848260208601613216565b91505092915050565b5f67ffffffffffffffff8211156132c5576132c461316f565b5b602082029050602081019050919050565b6132df81612e60565b81146132e9575f80fd5b50565b5f813590506132fa816132d6565b92915050565b5f61331261330d846132ab565b6131cd565b9050808382526020820190506020840283018581111561333557613334613212565b5b835b8181101561335e578061334a88826132ec565b845260208401935050602081019050613337565b5050509392505050565b5f82601f83011261337c5761337b61316b565b5b813561338c848260208601613300565b91505092915050565b5f80604083850312156133ab576133aa612d22565b5b5f83013567ffffffffffffffff8111156133c8576133c7612d26565b5b6133d48582860161327e565b925050602083013567ffffffffffffffff8111156133f5576133f4612d26565b5b61340185828601613368565b9150509250929050565b5f80fd5b5f67ffffffffffffffff8211156134295761342861316f565b5b61343282612efe565b9050602081019050919050565b828183375f83830152505050565b5f61345f61345a8461340f565b6131cd565b90508281526020810184848401111561347b5761347a61340b565b5b61348684828561343f565b509392505050565b5f82601f8301126134a2576134a161316b565b5b81356134b284826020860161344d565b91505092915050565b5f602082840312156134d0576134cf612d22565b5b5f82013567ffffffffffffffff8111156134ed576134ec612d26565b5b6134f98482850161348e565b91505092915050565b5f6020828403121561351757613516612d22565b5b5f613524848285016132ec565b91505092915050565b5f806040838503121561354357613542612d22565b5b5f61355085828601612d70565b9250506020613561858286016132ec565b9150509250929050565b5f67ffffffffffffffff8211156135855761358461316f565b5b61358e82612efe565b9050602081019050919050565b5f6135ad6135a88461356b565b6131cd565b9050828152602081018484840111156135c9576135c861340b565b5b6135d484828561343f565b509392505050565b5f82601f8301126135f0576135ef61316b565b5b813561360084826020860161359b565b91505092915050565b5f805f806080858703121561362157613620612d22565b5b5f61362e87828801612d70565b945050602061363f87828801612d70565b935050604061365087828801613076565b925050606085013567ffffffffffffffff81111561367157613670612d26565b5b61367d878288016135dc565b91505092959194509250565b5f806040838503121561369f5761369e612d22565b5b5f6136ac85828601612d70565b92505060206136bd85828601612d70565b9150509250929050565b5f6136d96136d48461340f565b6131cd565b9050828152602081018484840111156136f5576136f461340b565b5b613700848285612ed6565b509392505050565b5f82601f83011261371c5761371b61316b565b5b815161372c8482602086016136c7565b91505092915050565b5f6020828403121561374a57613749612d22565b5b5f82015167ffffffffffffffff81111561376757613766612d26565b5b61377384828501613708565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6137e082612daf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613812576138116137a9565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061386157607f821691505b6020821081036138745761387361381d565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f6138d4602183612ff8565b91506138df8261387a565b604082019050919050565b5f6020820190508181035f830152613901816138c8565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f5f8201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b5f613962603d83612ff8565b915061396d82613908565b604082019050919050565b5f6020820190508181035f83015261398f81613956565b9050919050565b7f5041414c583a204e6f74206f70656e20796574000000000000000000000000005f82015250565b5f6139ca601383612ff8565b91506139d582613996565b602082019050919050565b5f6020820190508181035f8301526139f7816139be565b9050919050565b7f5041414c583a204e6f742077686974656c6973746564000000000000000000005f82015250565b5f613a32601683612ff8565b9150613a3d826139fe565b602082019050919050565b5f6020820190508181035f830152613a5f81613a26565b9050919050565b7f5041414c583a204d617820737570706c792072656163686564000000000000005f82015250565b5f613a9a601983612ff8565b9150613aa582613a66565b602082019050919050565b5f6020820190508181035f830152613ac781613a8e565b9050919050565b7f5041414c583a204e6f7420656e6f7567682065746865720000000000000000005f82015250565b5f613b02601783612ff8565b9150613b0d82613ace565b602082019050919050565b5f6020820190508181035f830152613b2f81613af6565b9050919050565b7f5041414c583a204d6178207065722077616c6c657420726561636865640000005f82015250565b5f613b6a601d83612ff8565b9150613b7582613b36565b602082019050919050565b5f6020820190508181035f830152613b9781613b5e565b9050919050565b5f81905092915050565b5f819050815f5260205f209050919050565b5f8154613bc68161384a565b613bd08186613b9e565b9450600182165f8114613bea5760018114613bff57613c31565b60ff1983168652811515820286019350613c31565b613c0885613ba8565b5f5b83811015613c2957815481890152600182019150602081019050613c0a565b838801955050505b50505092915050565b5f613c4482612ebc565b613c4e8185613b9e565b9350613c5e818560208601612ed6565b80840191505092915050565b5f613c758286613bba565b9150613c818285613c3a565b9150613c8d8284613bba565b9150819050949350505050565b7f5041414c583a204e6f74206f70656e00000000000000000000000000000000005f82015250565b5f613cce600f83612ff8565b9150613cd982613c9a565b602082019050919050565b5f6020820190508181035f830152613cfb81613cc2565b9050919050565b5f613d0c82612daf565b9150613d1783612daf565b9250828201905080821115613d2f57613d2e6137a9565b5b92915050565b7f5041414c583a20416d6f756e74206d75737420626520677265617465722074685f8201527f616e203000000000000000000000000000000000000000000000000000000000602082015250565b5f613d8f602483612ff8565b9150613d9a82613d35565b604082019050919050565b5f6020820190508181035f830152613dbc81613d83565b9050919050565b7f5041414c583a20416d6f756e74206d757374206265206c657373207468616e205f8201527f3235000000000000000000000000000000000000000000000000000000000000602082015250565b5f613e1d602283612ff8565b9150613e2882613dc3565b604082019050919050565b5f6020820190508181035f830152613e4a81613e11565b9050919050565b5f613e5b82612daf565b9150613e6683612daf565b9250828202613e7481612daf565b91508282048414831517613e8b57613e8a6137a9565b5b5092915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e655f8201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b5f613eec602d83612ff8565b9150613ef782613e92565b604082019050919050565b5f6020820190508181035f830152613f1981613ee0565b9050919050565b7f417272617973206d7573742068617665207468652073616d65206c656e6774685f82015250565b5f613f54602083612ff8565b9150613f5f82613f20565b602082019050919050565b5f6020820190508181035f830152613f8181613f48565b9050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302613fd27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613f97565b613fdc8683613f97565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61401761401261400d84612daf565b613ff4565b612daf565b9050919050565b5f819050919050565b61403083613ffd565b61404461403c8261401e565b848454613fa3565b825550505050565b5f90565b61405861404c565b614063818484614027565b505050565b5b818110156140865761407b5f82614050565b600181019050614069565b5050565b601f8211156140cb5761409c81613ba8565b6140a584613f88565b810160208510156140b4578190505b6140c86140c085613f88565b830182614068565b50505b505050565b5f82821c905092915050565b5f6140eb5f19846008026140d0565b1980831691505092915050565b5f61410383836140dc565b9150826002028217905092915050565b61411c82612ebc565b67ffffffffffffffff8111156141355761413461316f565b5b61413f825461384a565b61414a82828561408a565b5f60209050601f83116001811461417b575f8415614169578287015190505b61417385826140f8565b8655506141da565b601f19841661418986613ba8565b5f5b828110156141b05784890151825560018201915060208501945060208101905061418b565b868310156141cd57848901516141c9601f8916826140dc565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e20494400000000000000005f82015250565b5f614216601883612ff8565b9150614221826141e2565b602082019050919050565b5f6020820190508181035f8301526142438161420a565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f7420612076615f8201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b5f6142a4602983612ff8565b91506142af8261424a565b604082019050919050565b5f6020820190508181035f8301526142d181614298565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f614332602683612ff8565b915061433d826142d8565b604082019050919050565b5f6020820190508181035f83015261435f81614326565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f61439a601f83612ff8565b91506143a582614366565b602082019050919050565b5f6020820190508181035f8301526143c78161438e565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e5f8201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b5f614455602e83612ff8565b9150614460826143fb565b604082019050919050565b5f6020820190508181035f83015261448281614449565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f7272656374205f8201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b5f6144e3602583612ff8565b91506144ee82614489565b604082019050919050565b5f6020820190508181035f830152614510816144d7565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f614571602483612ff8565b915061457c82614517565b604082019050919050565b5f6020820190508181035f83015261459e81614565565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6145d9602083612ff8565b91506145e4826145a5565b602082019050919050565b5f6020820190508181035f830152614606816145cd565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c6572000000000000005f82015250565b5f614641601983612ff8565b915061464c8261460d565b602082019050919050565b5f6020820190508181035f83015261466e81614635565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e2045524337323152655f8201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b5f6146cf603283612ff8565b91506146da82614675565b604082019050919050565b5f6020820190508181035f8301526146fc816146c3565b9050919050565b5f61470e8285613c3a565b915061471a8284613c3a565b91508190509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f61474a82614726565b6147548185614730565b9350614764818560208601612ed6565b61476d81612efe565b840191505092915050565b5f60808201905061478b5f8301876130b5565b61479860208301866130b5565b6147a56040830185612db8565b81810360608301526147b78184614740565b905095945050505050565b5f815190506147d081612e0b565b92915050565b5f602082840312156147eb576147ea612d22565b5b5f6147f8848285016147c2565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f614835602083612ff8565b915061484082614801565b602082019050919050565b5f6020820190508181035f83015261486281614829565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e746564000000005f82015250565b5f61489d601c83612ff8565b91506148a882614869565b602082019050919050565b5f6020820190508181035f8301526148ca81614891565b905091905056fea26469706673582212203cfc9f8ba7d47894edf9ce68426ab1467223a2998af97671afe1f580499eccb264736f6c63430008180033

Deployed Bytecode Sourcemap

63865:7393:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64414:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70960:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67654:350;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46132:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47644:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47162:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64183:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65019:971;;;:::i;:::-;;64264:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66161:1298;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48344:301;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64120:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64358:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69631:349;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48716:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64330:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68175:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69278:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45842:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64047:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63965:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45573:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23367:103;;;;;;;;;;;;;:::i;:::-;;70353:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22726:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46301:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69057:78;;;;;;;;;;;;;:::i;:::-;;47887:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70060:151;;;;;;;;;;;;;:::i;:::-;;48938:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63993:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70797:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68437:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64303:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48113:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23625:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68877:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64414:46;;;;;;;;;;;;;;;;;:::o;70960:170::-;71063:4;71086:36;71110:11;71086:23;:36::i;:::-;71079:43;;70960:170;;;:::o;67654:350::-;67722:15;67750;67768:19;67778:8;67768:9;:19::i;:::-;67750:37;;67798:25;67834:9;67858:112;67884:7;67865:9;:16;:26;67858:112;;;67923:4;:13;;;67937:1;67923:16;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67908:9;67918:1;67908:12;;;;;;;;:::i;:::-;;;;;;;:31;;;;67954:3;;;;;:::i;:::-;;;;67858:112;;;67987:9;67980:16;;;;;67654:350;;;:::o;46132:100::-;46186:13;46219:5;46212:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46132:100;:::o;47644:171::-;47720:7;47740:23;47755:7;47740:14;:23::i;:::-;47783:15;:24;47799:7;47783:24;;;;;;;;;;;;;;;;;;;;;47776:31;;47644:171;;;:::o;47162:416::-;47243:13;47259:23;47274:7;47259:14;:23::i;:::-;47243:39;;47307:5;47301:11;;:2;:11;;;47293:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;47401:5;47385:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;47410:37;47427:5;47434:12;:10;:12::i;:::-;47410:16;:37::i;:::-;47385:62;47363:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;47549:21;47558:2;47562:7;47549:8;:21::i;:::-;47232:346;47162:416;;:::o;64183:43::-;64224:2;64183:43;:::o;65019:971::-;2351:21;:19;:21::i;:::-;65084:6:::1;;;;;;;;;;;65076:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;65134:8;;;;;;;;;;;:37;;;;65146:13;:25;65160:10;65146:25;;;;;;;;;;;;;;;;;;;;;;;;;65134:37;65126:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;64157:4;65217:11;;:24;65209:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;65311:9;;65298;:22;65290:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;64224:2;65368:11:::0;:23:::1;65380:10;65368:23;;;;;;;;;;;;;;;;:40;65360:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;65502:11;;:13;;;;;;;;;:::i;:::-;;;;;;65567:11;:23;65579:10;65567:23;;;;;;;;;;;;;;;;:25;;;;;;;;;:::i;:::-;;;;;;65621:34;65631:10;65643:11;;65621:9;:34::i;:::-;65759:26;65812:7;65821:29;65838:11;;65821:16;:29::i;:::-;65852:13;65795:71;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65759:108;;65878:39;65891:11;;65904:12;65878;:39::i;:::-;65950:10;65943:31;;;65962:11;;65943:31;;;;;;:::i;:::-;;;;;;;;65065:925;2395:20:::0;:18;:20::i;:::-;65019:971::o;64264:26::-;;;;:::o;66161:1298::-;2351:21;:19;:21::i;:::-;66246:6:::1;;;;;;;;;;;66238:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;66300:8;;;;;;;;;;;:37;;;;66312:13;:25;66326:10;66312:25;;;;;;;;;;;;;;;;;;;;;;;;;66300:37;66292:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;64157:4;66398:7;66384:11;;:21;;;;:::i;:::-;66383:37;;66375:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;66479:1;66469:7;:11;66461:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;64224:2;66540:7;:25;;66532:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;64224:2;66658:7;66632:11;:23;66644:10;66632:23;;;;;;;;;;;;;;;;:33;;;;:::i;:::-;66631:53;;66623:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;66762:7;66750:9;;:19;;;;:::i;:::-;66737:9;:32;66729:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66831:9;66826:623;66850:7;66846:1;:11;66826:623;;;66930:11;;:13;;;;;;;;;:::i;:::-;;;;;;67003:11;:23;67015:10;67003:23;;;;;;;;;;;;;;;;:25;;;;;;;;;:::i;:::-;;;;;;67065:34;67075:10;67087:11;;67065:9;:34::i;:::-;67211:26;67264:7;67273:29;67290:11;;67273:16;:29::i;:::-;67304:13;67247:71;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67211:108;;67334:39;67347:11;;67360:12;67334;:39::i;:::-;67410:10;67403:31;;;67422:11;;67403:31;;;;;;:::i;:::-;;;;;;;;66864:585;66859:3;;;;;;;66826:623;;;;2395:20:::0;:18;:20::i;:::-;66161:1298;:::o;48344:301::-;48505:41;48524:12;:10;:12::i;:::-;48538:7;48505:18;:41::i;:::-;48497:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;48609:28;48619:4;48625:2;48629:7;48609:9;:28::i;:::-;48344:301;;;:::o;64120:41::-;64157:4;64120:41;:::o;64358:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;69631:349::-;22612:13;:11;:13::i;:::-;69769:14:::1;:21;69748:10;:17;:42;69740:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;69843:9;69838:135;69862:10;:17;69858:1;:21;69838:135;;;69932:14;69947:1;69932:17;;;;;;;;:::i;:::-;;;;;;;;69901:13;:28;69915:10;69926:1;69915:13;;;;;;;;:::i;:::-;;;;;;;;69901:28;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;69881:3;;;;;;;69838:135;;;;69631:349:::0;;:::o;48716:151::-;48820:39;48837:4;48843:2;48847:7;48820:39;;;;;;;;;;;;:16;:39::i;:::-;48716:151;;;:::o;64330:18::-;;;;;;;;;;;;;:::o;68175:104::-;22612:13;:11;:13::i;:::-;68260:11:::1;68250:7;:21;;;;;;:::i;:::-;;68175:104:::0;:::o;69278:91::-;22612:13;:11;:13::i;:::-;69352:9:::1;69341:8;;:20;;;;;;;;;;;;;;;;;;69278:91:::0;:::o;45842:223::-;45914:7;45934:13;45950:17;45959:7;45950:8;:17::i;:::-;45934:33;;46003:1;45986:19;;:5;:19;;;45978:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;46052:5;46045:12;;;45842:223;;;:::o;64047:36::-;;;;:::o;63965:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45573:207::-;45645:7;45690:1;45673:19;;:5;:19;;;45665:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45756:9;:16;45766:5;45756:16;;;;;;;;;;;;;;;;45749:23;;45573:207;;;:::o;23367:103::-;22612:13;:11;:13::i;:::-;23432:30:::1;23459:1;23432:18;:30::i;:::-;23367:103::o:0;70353:372::-;22612:13;:11;:13::i;:::-;2351:21:::1;:19;:21::i;:::-;64157:4:::2;70431:11;;:24;70423:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;70545:11;;:13;;;;;;;;;:::i;:::-;;;;;;70610:11;:23;70622:10;70610:23;;;;;;;;;;;;;;;;:25;;;;;;;;;:::i;:::-;;;;;;70648:27;70658:3;70663:11;;70648:9;:27::i;:::-;70700:3;70693:24;;;70705:11;;70693:24;;;;;;:::i;:::-;;;;;;;;2395:20:::1;:18;:20::i;:::-;70353:372:::0;:::o;22726:87::-;22772:7;22799:6;;;;;;;;;;;22792:13;;22726:87;:::o;46301:104::-;46357:13;46390:7;46383:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46301:104;:::o;69057:78::-;22612:13;:11;:13::i;:::-;69118:4:::1;69109:6;;:13;;;;;;;;;;;;;;;;;;69057:78::o:0;47887:155::-;47982:52;48001:12;:10;:12::i;:::-;48015:8;48025;47982:18;:52::i;:::-;47887:155;;:::o;70060:151::-;22612:13;:11;:13::i;:::-;70116:15:::1;70134:21;70116:39;;70174:10;70166:28;;:37;70195:7;70166:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;70105:106;70060:151::o:0;48938:279::-;49069:41;49088:12;:10;:12::i;:::-;49102:7;49069:18;:41::i;:::-;49061:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;49171:38;49185:4;49191:2;49195:7;49204:4;49171:13;:38::i;:::-;48938:279;;;;:::o;63993:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;70797:155::-;70888:13;70921:23;70936:7;70921:14;:23::i;:::-;70914:30;;70797:155;;;:::o;68437:128::-;22612:13;:11;:13::i;:::-;68540:17:::1;68524:13;:33;;;;;;:::i;:::-;;68437:128:::0;:::o;64303:20::-;;;;;;;;;;;;;:::o;48113:164::-;48210:4;48234:18;:25;48253:5;48234:25;;;;;;;;;;;;;;;:35;48260:8;48234:35;;;;;;;;;;;;;;;;;;;;;;;;;48227:42;;48113:164;;;;:::o;23625:201::-;22612:13;:11;:13::i;:::-;23734:1:::1;23714:22;;:8;:22;;::::0;23706:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;23790:28;23809:8;23790:18;:28::i;:::-;23625:201:::0;:::o;68877:106::-;22612:13;:11;:13::i;:::-;68962::::1;68950:9;:25;;;;68877:106:::0;:::o;61601:207::-;61703:4;61749:10;61742:18;;61727:33;;;:11;:33;;;;:73;;;;61764:36;61788:11;61764:23;:36::i;:::-;61727:73;61720:80;;61601:207;;;:::o;57207:135::-;57289:16;57297:7;57289;:16::i;:::-;57281:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;57207:135;:::o;21271:98::-;21324:7;21351:10;21344:17;;21271:98;:::o;56520:174::-;56622:2;56595:15;:24;56611:7;56595:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;56678:7;56674:2;56640:46;;56649:23;56664:7;56649:14;:23::i;:::-;56640:46;;;;;;;;;;;;56520:174;;:::o;2431:293::-;1833:1;2565:7;;:19;2557:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1833:1;2698:7;:18;;;;2431:293::o;51813:110::-;51889:26;51899:2;51903:7;51889:26;;;;;;;;;;;;:9;:26::i;:::-;51813:110;;:::o;18184:716::-;18240:13;18291:14;18328:1;18308:17;18319:5;18308:10;:17::i;:::-;:21;18291:38;;18344:20;18378:6;18367:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18344:41;;18400:11;18529:6;18525:2;18521:15;18513:6;18509:28;18502:35;;18566:288;18573:4;18566:288;;;18598:5;;;;;;;;18740:8;18735:2;18728:5;18724:14;18719:30;18714:3;18706:44;18796:2;18787:11;;;;;;:::i;:::-;;;;;18830:1;18821:5;:10;18566:288;18817:21;18566:288;18875:6;18868:13;;;;;18184:716;;;:::o;62699:258::-;62799:16;62807:7;62799;:16::i;:::-;62791:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;62899:9;62877:10;:19;62888:7;62877:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;62926:23;62941:7;62926:23;;;;;;:::i;:::-;;;;;;;;62699:258;;:::o;2732:213::-;1789:1;2915:7;:22;;;;2732:213::o;51207:264::-;51300:4;51317:13;51333:23;51348:7;51333:14;:23::i;:::-;51317:39;;51386:5;51375:16;;:7;:16;;;:52;;;;51395:32;51412:5;51419:7;51395:16;:32::i;:::-;51375:52;:87;;;;51455:7;51431:31;;:20;51443:7;51431:11;:20::i;:::-;:31;;;51375:87;51367:96;;;51207:264;;;;:::o;55172:1229::-;55297:4;55270:31;;:23;55285:7;55270:14;:23::i;:::-;:31;;;55262:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;55376:1;55362:16;;:2;:16;;;55354:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;55432:42;55453:4;55459:2;55463:7;55472:1;55432:20;:42::i;:::-;55604:4;55577:31;;:23;55592:7;55577:14;:23::i;:::-;:31;;;55569:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;55722:15;:24;55738:7;55722:24;;;;;;;;;;;;55715:31;;;;;;;;;;;56217:1;56198:9;:15;56208:4;56198:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;56250:1;56233:9;:13;56243:2;56233:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;56292:2;56273:7;:16;56281:7;56273:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;56331:7;56327:2;56312:27;;56321:4;56312:27;;;;;;;;;;;;56352:41;56372:4;56378:2;56382:7;56391:1;56352:19;:41::i;:::-;55172:1229;;;:::o;22891:132::-;22966:12;:10;:12::i;:::-;22955:23;;:7;:5;:7::i;:::-;:23;;;22947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22891:132::o;50482:117::-;50548:7;50575;:16;50583:7;50575:16;;;;;;;;;;;;;;;;;;;;;50568:23;;50482:117;;;:::o;23986:191::-;24060:16;24079:6;;;;;;;;;;;24060:25;;24105:8;24096:6;;:17;;;;;;;;;;;;;;;;;;24160:8;24129:40;;24150:8;24129:40;;;;;;;;;;;;24049:128;23986:191;:::o;56837:281::-;56958:8;56949:17;;:5;:17;;;56941:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;57045:8;57007:18;:25;57026:5;57007:25;;;;;;;;;;;;;;;:35;57033:8;57007:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;57091:8;57069:41;;57084:5;57069:41;;;57101:8;57069:41;;;;;;:::i;:::-;;;;;;;;56837:281;;;:::o;50098:270::-;50211:28;50221:4;50227:2;50231:7;50211:9;:28::i;:::-;50258:47;50281:4;50287:2;50291:7;50300:4;50258:22;:47::i;:::-;50250:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;50098:270;;;;:::o;61879:624::-;61952:13;61978:23;61993:7;61978:14;:23::i;:::-;62014;62040:10;:19;62051:7;62040:19;;;;;;;;;;;62014:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62070:18;62091:10;:8;:10::i;:::-;62070:31;;62199:1;62183:4;62177:18;:23;62173:72;;62224:9;62217:16;;;;;;62173:72;62375:1;62355:9;62349:23;:27;62345:108;;;62424:4;62430:9;62407:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62393:48;;;;;;62345:108;62472:23;62487:7;62472:14;:23::i;:::-;62465:30;;;;61879:624;;;;:::o;45204:305::-;45306:4;45358:25;45343:40;;;:11;:40;;;;:105;;;;45415:33;45400:48;;;:11;:48;;;;45343:105;:158;;;;45465:36;45489:11;45465:23;:36::i;:::-;45343:158;45323:178;;45204:305;;;:::o;50912:128::-;50977:4;51030:1;51001:31;;:17;51010:7;51001:8;:17::i;:::-;:31;;;;50994:38;;50912:128;;;:::o;52150:285::-;52245:18;52251:2;52255:7;52245:5;:18::i;:::-;52296:53;52327:1;52331:2;52335:7;52344:4;52296:22;:53::i;:::-;52274:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;52150:285;;;:::o;15012:948::-;15065:7;15085:14;15102:1;15085:18;;15152:8;15143:5;:17;15139:106;;15190:8;15181:17;;;;;;:::i;:::-;;;;;15227:2;15217:12;;;;15139:106;15272:8;15263:5;:17;15259:106;;15310:8;15301:17;;;;;;:::i;:::-;;;;;15347:2;15337:12;;;;15259:106;15392:8;15383:5;:17;15379:106;;15430:8;15421:17;;;;;;:::i;:::-;;;;;15467:2;15457:12;;;;15379:106;15512:7;15503:5;:16;15499:103;;15549:7;15540:16;;;;;;:::i;:::-;;;;;15585:1;15575:11;;;;15499:103;15629:7;15620:5;:16;15616:103;;15666:7;15657:16;;;;;;:::i;:::-;;;;;15702:1;15692:11;;;;15616:103;15746:7;15737:5;:16;15733:103;;15783:7;15774:16;;;;;;:::i;:::-;;;;;15819:1;15809:11;;;;15733:103;15863:7;15854:5;:16;15850:68;;15901:1;15891:11;;;;15850:68;15946:6;15939:13;;;15012:948;;;:::o;59491:116::-;;;;;:::o;60329:115::-;;;;;:::o;57906:853::-;58060:4;58081:15;:2;:13;;;:15::i;:::-;58077:675;;;58133:2;58117:36;;;58154:12;:10;:12::i;:::-;58168:4;58174:7;58183:4;58117:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;58113:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58375:1;58358:6;:13;:18;58354:328;;58401:60;;;;;;;;;;:::i;:::-;;;;;;;;58354:328;58632:6;58626:13;58617:6;58613:2;58609:15;58602:38;58113:584;58249:41;;;58239:51;;;:6;:51;;;;58232:58;;;;;58077:675;58736:4;58729:11;;57906:853;;;;;;;:::o;47006:94::-;47057:13;47083:9;;;;;;;;;;;;;;47006:94;:::o;46476:281::-;46549:13;46575:23;46590:7;46575:14;:23::i;:::-;46611:21;46635:10;:8;:10::i;:::-;46611:34;;46687:1;46669:7;46663:21;:25;:86;;;;;;;;;;;;;;;;;46715:7;46724:18;:7;:16;:18::i;:::-;46698:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46663:86;46656:93;;;46476:281;;;:::o;36834:157::-;36919:4;36958:25;36943:40;;;:11;:40;;;;36936:47;;36834:157;;;:::o;52771:942::-;52865:1;52851:16;;:2;:16;;;52843:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;52924:16;52932:7;52924;:16::i;:::-;52923:17;52915:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52986:48;53015:1;53019:2;53023:7;53032:1;52986:20;:48::i;:::-;53133:16;53141:7;53133;:16::i;:::-;53132:17;53124:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;53548:1;53531:9;:13;53541:2;53531:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;53592:2;53573:7;:16;53581:7;53573:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;53637:7;53633:2;53612:33;;53629:1;53612:33;;;;;;;;;;;;53658:47;53686:1;53690:2;53694:7;53703:1;53658:19;:47::i;:::-;52771:942;;:::o;25664:326::-;25724:4;25981:1;25959:7;:19;;;:23;25952:30;;25664:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:222::-;1476:4;1514:2;1503:9;1499:18;1491:26;;1527:71;1595:1;1584:9;1580:17;1571:6;1527:71;:::i;:::-;1383:222;;;;:::o;1611:149::-;1647:7;1687:66;1680:5;1676:78;1665:89;;1611:149;;;:::o;1766:120::-;1838:23;1855:5;1838:23;:::i;:::-;1831:5;1828:34;1818:62;;1876:1;1873;1866:12;1818:62;1766:120;:::o;1892:137::-;1937:5;1975:6;1962:20;1953:29;;1991:32;2017:5;1991:32;:::i;:::-;1892:137;;;;:::o;2035:327::-;2093:6;2142:2;2130:9;2121:7;2117:23;2113:32;2110:119;;;2148:79;;:::i;:::-;2110:119;2268:1;2293:52;2337:7;2328:6;2317:9;2313:22;2293:52;:::i;:::-;2283:62;;2239:116;2035:327;;;;:::o;2368:90::-;2402:7;2445:5;2438:13;2431:21;2420:32;;2368:90;;;:::o;2464:109::-;2545:21;2560:5;2545:21;:::i;:::-;2540:3;2533:34;2464:109;;:::o;2579:210::-;2666:4;2704:2;2693:9;2689:18;2681:26;;2717:65;2779:1;2768:9;2764:17;2755:6;2717:65;:::i;:::-;2579:210;;;;:::o;2795:124::-;2872:6;2906:5;2900:12;2890:22;;2795:124;;;:::o;2925:194::-;3034:11;3068:6;3063:3;3056:19;3108:4;3103:3;3099:14;3084:29;;2925:194;;;;:::o;3125:142::-;3202:4;3225:3;3217:11;;3255:4;3250:3;3246:14;3238:22;;3125:142;;;:::o;3273:99::-;3325:6;3359:5;3353:12;3343:22;;3273:99;;;:::o;3378:159::-;3452:11;3486:6;3481:3;3474:19;3526:4;3521:3;3517:14;3502:29;;3378:159;;;;:::o;3543:246::-;3624:1;3634:113;3648:6;3645:1;3642:13;3634:113;;;3733:1;3728:3;3724:11;3718:18;3714:1;3709:3;3705:11;3698:39;3670:2;3667:1;3663:10;3658:15;;3634:113;;;3781:1;3772:6;3767:3;3763:16;3756:27;3605:184;3543:246;;;:::o;3795:102::-;3836:6;3887:2;3883:7;3878:2;3871:5;3867:14;3863:28;3853:38;;3795:102;;;:::o;3903:357::-;3981:3;4009:39;4042:5;4009:39;:::i;:::-;4064:61;4118:6;4113:3;4064:61;:::i;:::-;4057:68;;4134:65;4192:6;4187:3;4180:4;4173:5;4169:16;4134:65;:::i;:::-;4224:29;4246:6;4224:29;:::i;:::-;4219:3;4215:39;4208:46;;3985:275;3903:357;;;;:::o;4266:196::-;4355:10;4390:66;4452:3;4444:6;4390:66;:::i;:::-;4376:80;;4266:196;;;;:::o;4468:123::-;4548:4;4580;4575:3;4571:14;4563:22;;4468:123;;;:::o;4625:991::-;4764:3;4793:64;4851:5;4793:64;:::i;:::-;4873:96;4962:6;4957:3;4873:96;:::i;:::-;4866:103;;4995:3;5040:4;5032:6;5028:17;5023:3;5019:27;5070:66;5130:5;5070:66;:::i;:::-;5159:7;5190:1;5175:396;5200:6;5197:1;5194:13;5175:396;;;5271:9;5265:4;5261:20;5256:3;5249:33;5322:6;5316:13;5350:84;5429:4;5414:13;5350:84;:::i;:::-;5342:92;;5457:70;5520:6;5457:70;:::i;:::-;5447:80;;5556:4;5551:3;5547:14;5540:21;;5235:336;5222:1;5219;5215:9;5210:14;;5175:396;;;5179:14;5587:4;5580:11;;5607:3;5600:10;;4769:847;;;;;4625:991;;;;:::o;5622:413::-;5785:4;5823:2;5812:9;5808:18;5800:26;;5872:9;5866:4;5862:20;5858:1;5847:9;5843:17;5836:47;5900:128;6023:4;6014:6;5900:128;:::i;:::-;5892:136;;5622:413;;;;:::o;6041:169::-;6125:11;6159:6;6154:3;6147:19;6199:4;6194:3;6190:14;6175:29;;6041:169;;;;:::o;6216:377::-;6304:3;6332:39;6365:5;6332:39;:::i;:::-;6387:71;6451:6;6446:3;6387:71;:::i;:::-;6380:78;;6467:65;6525:6;6520:3;6513:4;6506:5;6502:16;6467:65;:::i;:::-;6557:29;6579:6;6557:29;:::i;:::-;6552:3;6548:39;6541:46;;6308:285;6216:377;;;;:::o;6599:313::-;6712:4;6750:2;6739:9;6735:18;6727:26;;6799:9;6793:4;6789:20;6785:1;6774:9;6770:17;6763:47;6827:78;6900:4;6891:6;6827:78;:::i;:::-;6819:86;;6599:313;;;;:::o;6918:122::-;6991:24;7009:5;6991:24;:::i;:::-;6984:5;6981:35;6971:63;;7030:1;7027;7020:12;6971:63;6918:122;:::o;7046:139::-;7092:5;7130:6;7117:20;7108:29;;7146:33;7173:5;7146:33;:::i;:::-;7046:139;;;;:::o;7191:329::-;7250:6;7299:2;7287:9;7278:7;7274:23;7270:32;7267:119;;;7305:79;;:::i;:::-;7267:119;7425:1;7450:53;7495:7;7486:6;7475:9;7471:22;7450:53;:::i;:::-;7440:63;;7396:117;7191:329;;;;:::o;7526:118::-;7613:24;7631:5;7613:24;:::i;:::-;7608:3;7601:37;7526:118;;:::o;7650:222::-;7743:4;7781:2;7770:9;7766:18;7758:26;;7794:71;7862:1;7851:9;7847:17;7838:6;7794:71;:::i;:::-;7650:222;;;;:::o;7878:474::-;7946:6;7954;8003:2;7991:9;7982:7;7978:23;7974:32;7971:119;;;8009:79;;:::i;:::-;7971:119;8129:1;8154:53;8199:7;8190:6;8179:9;8175:22;8154:53;:::i;:::-;8144:63;;8100:117;8256:2;8282:53;8327:7;8318:6;8307:9;8303:22;8282:53;:::i;:::-;8272:63;;8227:118;7878:474;;;;;:::o;8358:619::-;8435:6;8443;8451;8500:2;8488:9;8479:7;8475:23;8471:32;8468:119;;;8506:79;;:::i;:::-;8468:119;8626:1;8651:53;8696:7;8687:6;8676:9;8672:22;8651:53;:::i;:::-;8641:63;;8597:117;8753:2;8779:53;8824:7;8815:6;8804:9;8800:22;8779:53;:::i;:::-;8769:63;;8724:118;8881:2;8907:53;8952:7;8943:6;8932:9;8928:22;8907:53;:::i;:::-;8897:63;;8852:118;8358:619;;;;;:::o;8983:117::-;9092:1;9089;9082:12;9106:180;9154:77;9151:1;9144:88;9251:4;9248:1;9241:15;9275:4;9272:1;9265:15;9292:281;9375:27;9397:4;9375:27;:::i;:::-;9367:6;9363:40;9505:6;9493:10;9490:22;9469:18;9457:10;9454:34;9451:62;9448:88;;;9516:18;;:::i;:::-;9448:88;9556:10;9552:2;9545:22;9335:238;9292:281;;:::o;9579:129::-;9613:6;9640:20;;:::i;:::-;9630:30;;9669:33;9697:4;9689:6;9669:33;:::i;:::-;9579:129;;;:::o;9714:311::-;9791:4;9881:18;9873:6;9870:30;9867:56;;;9903:18;;:::i;:::-;9867:56;9953:4;9945:6;9941:17;9933:25;;10013:4;10007;10003:15;9995:23;;9714:311;;;:::o;10031:117::-;10140:1;10137;10130:12;10171:710;10267:5;10292:81;10308:64;10365:6;10308:64;:::i;:::-;10292:81;:::i;:::-;10283:90;;10393:5;10422:6;10415:5;10408:21;10456:4;10449:5;10445:16;10438:23;;10509:4;10501:6;10497:17;10489:6;10485:30;10538:3;10530:6;10527:15;10524:122;;;10557:79;;:::i;:::-;10524:122;10672:6;10655:220;10689:6;10684:3;10681:15;10655:220;;;10764:3;10793:37;10826:3;10814:10;10793:37;:::i;:::-;10788:3;10781:50;10860:4;10855:3;10851:14;10844:21;;10731:144;10715:4;10710:3;10706:14;10699:21;;10655:220;;;10659:21;10273:608;;10171:710;;;;;:::o;10904:370::-;10975:5;11024:3;11017:4;11009:6;11005:17;11001:27;10991:122;;11032:79;;:::i;:::-;10991:122;11149:6;11136:20;11174:94;11264:3;11256:6;11249:4;11241:6;11237:17;11174:94;:::i;:::-;11165:103;;10981:293;10904:370;;;;:::o;11280:308::-;11354:4;11444:18;11436:6;11433:30;11430:56;;;11466:18;;:::i;:::-;11430:56;11516:4;11508:6;11504:17;11496:25;;11576:4;11570;11566:15;11558:23;;11280:308;;;:::o;11594:116::-;11664:21;11679:5;11664:21;:::i;:::-;11657:5;11654:32;11644:60;;11700:1;11697;11690:12;11644:60;11594:116;:::o;11716:133::-;11759:5;11797:6;11784:20;11775:29;;11813:30;11837:5;11813:30;:::i;:::-;11716:133;;;;:::o;11869:701::-;11962:5;11987:78;12003:61;12057:6;12003:61;:::i;:::-;11987:78;:::i;:::-;11978:87;;12085:5;12114:6;12107:5;12100:21;12148:4;12141:5;12137:16;12130:23;;12201:4;12193:6;12189:17;12181:6;12177:30;12230:3;12222:6;12219:15;12216:122;;;12249:79;;:::i;:::-;12216:122;12364:6;12347:217;12381:6;12376:3;12373:15;12347:217;;;12456:3;12485:34;12515:3;12503:10;12485:34;:::i;:::-;12480:3;12473:47;12549:4;12544:3;12540:14;12533:21;;12423:141;12407:4;12402:3;12398:14;12391:21;;12347:217;;;12351:21;11968:602;;11869:701;;;;;:::o;12590:364::-;12658:5;12707:3;12700:4;12692:6;12688:17;12684:27;12674:122;;12715:79;;:::i;:::-;12674:122;12832:6;12819:20;12857:91;12944:3;12936:6;12929:4;12921:6;12917:17;12857:91;:::i;:::-;12848:100;;12664:290;12590:364;;;;:::o;12960:888::-;13075:6;13083;13132:2;13120:9;13111:7;13107:23;13103:32;13100:119;;;13138:79;;:::i;:::-;13100:119;13286:1;13275:9;13271:17;13258:31;13316:18;13308:6;13305:30;13302:117;;;13338:79;;:::i;:::-;13302:117;13443:78;13513:7;13504:6;13493:9;13489:22;13443:78;:::i;:::-;13433:88;;13229:302;13598:2;13587:9;13583:18;13570:32;13629:18;13621:6;13618:30;13615:117;;;13651:79;;:::i;:::-;13615:117;13756:75;13823:7;13814:6;13803:9;13799:22;13756:75;:::i;:::-;13746:85;;13541:300;12960:888;;;;;:::o;13854:117::-;13963:1;13960;13953:12;13977:308;14039:4;14129:18;14121:6;14118:30;14115:56;;;14151:18;;:::i;:::-;14115:56;14189:29;14211:6;14189:29;:::i;:::-;14181:37;;14273:4;14267;14263:15;14255:23;;13977:308;;;:::o;14291:146::-;14388:6;14383:3;14378;14365:30;14429:1;14420:6;14415:3;14411:16;14404:27;14291:146;;;:::o;14443:425::-;14521:5;14546:66;14562:49;14604:6;14562:49;:::i;:::-;14546:66;:::i;:::-;14537:75;;14635:6;14628:5;14621:21;14673:4;14666:5;14662:16;14711:3;14702:6;14697:3;14693:16;14690:25;14687:112;;;14718:79;;:::i;:::-;14687:112;14808:54;14855:6;14850:3;14845;14808:54;:::i;:::-;14527:341;14443:425;;;;;:::o;14888:340::-;14944:5;14993:3;14986:4;14978:6;14974:17;14970:27;14960:122;;15001:79;;:::i;:::-;14960:122;15118:6;15105:20;15143:79;15218:3;15210:6;15203:4;15195:6;15191:17;15143:79;:::i;:::-;15134:88;;14950:278;14888:340;;;;:::o;15234:509::-;15303:6;15352:2;15340:9;15331:7;15327:23;15323:32;15320:119;;;15358:79;;:::i;:::-;15320:119;15506:1;15495:9;15491:17;15478:31;15536:18;15528:6;15525:30;15522:117;;;15558:79;;:::i;:::-;15522:117;15663:63;15718:7;15709:6;15698:9;15694:22;15663:63;:::i;:::-;15653:73;;15449:287;15234:509;;;;:::o;15749:323::-;15805:6;15854:2;15842:9;15833:7;15829:23;15825:32;15822:119;;;15860:79;;:::i;:::-;15822:119;15980:1;16005:50;16047:7;16038:6;16027:9;16023:22;16005:50;:::i;:::-;15995:60;;15951:114;15749:323;;;;:::o;16078:468::-;16143:6;16151;16200:2;16188:9;16179:7;16175:23;16171:32;16168:119;;;16206:79;;:::i;:::-;16168:119;16326:1;16351:53;16396:7;16387:6;16376:9;16372:22;16351:53;:::i;:::-;16341:63;;16297:117;16453:2;16479:50;16521:7;16512:6;16501:9;16497:22;16479:50;:::i;:::-;16469:60;;16424:115;16078:468;;;;;:::o;16552:307::-;16613:4;16703:18;16695:6;16692:30;16689:56;;;16725:18;;:::i;:::-;16689:56;16763:29;16785:6;16763:29;:::i;:::-;16755:37;;16847:4;16841;16837:15;16829:23;;16552:307;;;:::o;16865:423::-;16942:5;16967:65;16983:48;17024:6;16983:48;:::i;:::-;16967:65;:::i;:::-;16958:74;;17055:6;17048:5;17041:21;17093:4;17086:5;17082:16;17131:3;17122:6;17117:3;17113:16;17110:25;17107:112;;;17138:79;;:::i;:::-;17107:112;17228:54;17275:6;17270:3;17265;17228:54;:::i;:::-;16948:340;16865:423;;;;;:::o;17307:338::-;17362:5;17411:3;17404:4;17396:6;17392:17;17388:27;17378:122;;17419:79;;:::i;:::-;17378:122;17536:6;17523:20;17561:78;17635:3;17627:6;17620:4;17612:6;17608:17;17561:78;:::i;:::-;17552:87;;17368:277;17307:338;;;;:::o;17651:943::-;17746:6;17754;17762;17770;17819:3;17807:9;17798:7;17794:23;17790:33;17787:120;;;17826:79;;:::i;:::-;17787:120;17946:1;17971:53;18016:7;18007:6;17996:9;17992:22;17971:53;:::i;:::-;17961:63;;17917:117;18073:2;18099:53;18144:7;18135:6;18124:9;18120:22;18099:53;:::i;:::-;18089:63;;18044:118;18201:2;18227:53;18272:7;18263:6;18252:9;18248:22;18227:53;:::i;:::-;18217:63;;18172:118;18357:2;18346:9;18342:18;18329:32;18388:18;18380:6;18377:30;18374:117;;;18410:79;;:::i;:::-;18374:117;18515:62;18569:7;18560:6;18549:9;18545:22;18515:62;:::i;:::-;18505:72;;18300:287;17651:943;;;;;;;:::o;18600:474::-;18668:6;18676;18725:2;18713:9;18704:7;18700:23;18696:32;18693:119;;;18731:79;;:::i;:::-;18693:119;18851:1;18876:53;18921:7;18912:6;18901:9;18897:22;18876:53;:::i;:::-;18866:63;;18822:117;18978:2;19004:53;19049:7;19040:6;19029:9;19025:22;19004:53;:::i;:::-;18994:63;;18949:118;18600:474;;;;;:::o;19080:434::-;19169:5;19194:66;19210:49;19252:6;19210:49;:::i;:::-;19194:66;:::i;:::-;19185:75;;19283:6;19276:5;19269:21;19321:4;19314:5;19310:16;19359:3;19350:6;19345:3;19341:16;19338:25;19335:112;;;19366:79;;:::i;:::-;19335:112;19456:52;19501:6;19496:3;19491;19456:52;:::i;:::-;19175:339;19080:434;;;;;:::o;19534:355::-;19601:5;19650:3;19643:4;19635:6;19631:17;19627:27;19617:122;;19658:79;;:::i;:::-;19617:122;19768:6;19762:13;19793:90;19879:3;19871:6;19864:4;19856:6;19852:17;19793:90;:::i;:::-;19784:99;;19607:282;19534:355;;;;:::o;19895:524::-;19975:6;20024:2;20012:9;20003:7;19999:23;19995:32;19992:119;;;20030:79;;:::i;:::-;19992:119;20171:1;20160:9;20156:17;20150:24;20201:18;20193:6;20190:30;20187:117;;;20223:79;;:::i;:::-;20187:117;20328:74;20394:7;20385:6;20374:9;20370:22;20328:74;:::i;:::-;20318:84;;20121:291;19895:524;;;;:::o;20425:180::-;20473:77;20470:1;20463:88;20570:4;20567:1;20560:15;20594:4;20591:1;20584:15;20611:180;20659:77;20656:1;20649:88;20756:4;20753:1;20746:15;20780:4;20777:1;20770:15;20797:233;20836:3;20859:24;20877:5;20859:24;:::i;:::-;20850:33;;20905:66;20898:5;20895:77;20892:103;;20975:18;;:::i;:::-;20892:103;21022:1;21015:5;21011:13;21004:20;;20797:233;;;:::o;21036:180::-;21084:77;21081:1;21074:88;21181:4;21178:1;21171:15;21205:4;21202:1;21195:15;21222:320;21266:6;21303:1;21297:4;21293:12;21283:22;;21350:1;21344:4;21340:12;21371:18;21361:81;;21427:4;21419:6;21415:17;21405:27;;21361:81;21489:2;21481:6;21478:14;21458:18;21455:38;21452:84;;21508:18;;:::i;:::-;21452:84;21273:269;21222:320;;;:::o;21548:220::-;21688:34;21684:1;21676:6;21672:14;21665:58;21757:3;21752:2;21744:6;21740:15;21733:28;21548:220;:::o;21774:366::-;21916:3;21937:67;22001:2;21996:3;21937:67;:::i;:::-;21930:74;;22013:93;22102:3;22013:93;:::i;:::-;22131:2;22126:3;22122:12;22115:19;;21774:366;;;:::o;22146:419::-;22312:4;22350:2;22339:9;22335:18;22327:26;;22399:9;22393:4;22389:20;22385:1;22374:9;22370:17;22363:47;22427:131;22553:4;22427:131;:::i;:::-;22419:139;;22146:419;;;:::o;22571:248::-;22711:34;22707:1;22699:6;22695:14;22688:58;22780:31;22775:2;22767:6;22763:15;22756:56;22571:248;:::o;22825:366::-;22967:3;22988:67;23052:2;23047:3;22988:67;:::i;:::-;22981:74;;23064:93;23153:3;23064:93;:::i;:::-;23182:2;23177:3;23173:12;23166:19;;22825:366;;;:::o;23197:419::-;23363:4;23401:2;23390:9;23386:18;23378:26;;23450:9;23444:4;23440:20;23436:1;23425:9;23421:17;23414:47;23478:131;23604:4;23478:131;:::i;:::-;23470:139;;23197:419;;;:::o;23622:169::-;23762:21;23758:1;23750:6;23746:14;23739:45;23622:169;:::o;23797:366::-;23939:3;23960:67;24024:2;24019:3;23960:67;:::i;:::-;23953:74;;24036:93;24125:3;24036:93;:::i;:::-;24154:2;24149:3;24145:12;24138:19;;23797:366;;;:::o;24169:419::-;24335:4;24373:2;24362:9;24358:18;24350:26;;24422:9;24416:4;24412:20;24408:1;24397:9;24393:17;24386:47;24450:131;24576:4;24450:131;:::i;:::-;24442:139;;24169:419;;;:::o;24594:172::-;24734:24;24730:1;24722:6;24718:14;24711:48;24594:172;:::o;24772:366::-;24914:3;24935:67;24999:2;24994:3;24935:67;:::i;:::-;24928:74;;25011:93;25100:3;25011:93;:::i;:::-;25129:2;25124:3;25120:12;25113:19;;24772:366;;;:::o;25144:419::-;25310:4;25348:2;25337:9;25333:18;25325:26;;25397:9;25391:4;25387:20;25383:1;25372:9;25368:17;25361:47;25425:131;25551:4;25425:131;:::i;:::-;25417:139;;25144:419;;;:::o;25569:175::-;25709:27;25705:1;25697:6;25693:14;25686:51;25569:175;:::o;25750:366::-;25892:3;25913:67;25977:2;25972:3;25913:67;:::i;:::-;25906:74;;25989:93;26078:3;25989:93;:::i;:::-;26107:2;26102:3;26098:12;26091:19;;25750:366;;;:::o;26122:419::-;26288:4;26326:2;26315:9;26311:18;26303:26;;26375:9;26369:4;26365:20;26361:1;26350:9;26346:17;26339:47;26403:131;26529:4;26403:131;:::i;:::-;26395:139;;26122:419;;;:::o;26547:173::-;26687:25;26683:1;26675:6;26671:14;26664:49;26547:173;:::o;26726:366::-;26868:3;26889:67;26953:2;26948:3;26889:67;:::i;:::-;26882:74;;26965:93;27054:3;26965:93;:::i;:::-;27083:2;27078:3;27074:12;27067:19;;26726:366;;;:::o;27098:419::-;27264:4;27302:2;27291:9;27287:18;27279:26;;27351:9;27345:4;27341:20;27337:1;27326:9;27322:17;27315:47;27379:131;27505:4;27379:131;:::i;:::-;27371:139;;27098:419;;;:::o;27523:179::-;27663:31;27659:1;27651:6;27647:14;27640:55;27523:179;:::o;27708:366::-;27850:3;27871:67;27935:2;27930:3;27871:67;:::i;:::-;27864:74;;27947:93;28036:3;27947:93;:::i;:::-;28065:2;28060:3;28056:12;28049:19;;27708:366;;;:::o;28080:419::-;28246:4;28284:2;28273:9;28269:18;28261:26;;28333:9;28327:4;28323:20;28319:1;28308:9;28304:17;28297:47;28361:131;28487:4;28361:131;:::i;:::-;28353:139;;28080:419;;;:::o;28505:148::-;28607:11;28644:3;28629:18;;28505:148;;;;:::o;28659:141::-;28708:4;28731:3;28723:11;;28754:3;28751:1;28744:14;28788:4;28785:1;28775:18;28767:26;;28659:141;;;:::o;28830:874::-;28933:3;28970:5;28964:12;28999:36;29025:9;28999:36;:::i;:::-;29051:89;29133:6;29128:3;29051:89;:::i;:::-;29044:96;;29171:1;29160:9;29156:17;29187:1;29182:166;;;;29362:1;29357:341;;;;29149:549;;29182:166;29266:4;29262:9;29251;29247:25;29242:3;29235:38;29328:6;29321:14;29314:22;29306:6;29302:35;29297:3;29293:45;29286:52;;29182:166;;29357:341;29424:38;29456:5;29424:38;:::i;:::-;29484:1;29498:154;29512:6;29509:1;29506:13;29498:154;;;29586:7;29580:14;29576:1;29571:3;29567:11;29560:35;29636:1;29627:7;29623:15;29612:26;;29534:4;29531:1;29527:12;29522:17;;29498:154;;;29681:6;29676:3;29672:16;29665:23;;29364:334;;29149:549;;28937:767;;28830:874;;;;:::o;29710:390::-;29816:3;29844:39;29877:5;29844:39;:::i;:::-;29899:89;29981:6;29976:3;29899:89;:::i;:::-;29892:96;;29997:65;30055:6;30050:3;30043:4;30036:5;30032:16;29997:65;:::i;:::-;30087:6;30082:3;30078:16;30071:23;;29820:280;29710:390;;;;:::o;30106:583::-;30328:3;30350:92;30438:3;30429:6;30350:92;:::i;:::-;30343:99;;30459:95;30550:3;30541:6;30459:95;:::i;:::-;30452:102;;30571:92;30659:3;30650:6;30571:92;:::i;:::-;30564:99;;30680:3;30673:10;;30106:583;;;;;;:::o;30695:165::-;30835:17;30831:1;30823:6;30819:14;30812:41;30695:165;:::o;30866:366::-;31008:3;31029:67;31093:2;31088:3;31029:67;:::i;:::-;31022:74;;31105:93;31194:3;31105:93;:::i;:::-;31223:2;31218:3;31214:12;31207:19;;30866:366;;;:::o;31238:419::-;31404:4;31442:2;31431:9;31427:18;31419:26;;31491:9;31485:4;31481:20;31477:1;31466:9;31462:17;31455:47;31519:131;31645:4;31519:131;:::i;:::-;31511:139;;31238:419;;;:::o;31663:191::-;31703:3;31722:20;31740:1;31722:20;:::i;:::-;31717:25;;31756:20;31774:1;31756:20;:::i;:::-;31751:25;;31799:1;31796;31792:9;31785:16;;31820:3;31817:1;31814:10;31811:36;;;31827:18;;:::i;:::-;31811:36;31663:191;;;;:::o;31860:223::-;32000:34;31996:1;31988:6;31984:14;31977:58;32069:6;32064:2;32056:6;32052:15;32045:31;31860:223;:::o;32089:366::-;32231:3;32252:67;32316:2;32311:3;32252:67;:::i;:::-;32245:74;;32328:93;32417:3;32328:93;:::i;:::-;32446:2;32441:3;32437:12;32430:19;;32089:366;;;:::o;32461:419::-;32627:4;32665:2;32654:9;32650:18;32642:26;;32714:9;32708:4;32704:20;32700:1;32689:9;32685:17;32678:47;32742:131;32868:4;32742:131;:::i;:::-;32734:139;;32461:419;;;:::o;32886:221::-;33026:34;33022:1;33014:6;33010:14;33003:58;33095:4;33090:2;33082:6;33078:15;33071:29;32886:221;:::o;33113:366::-;33255:3;33276:67;33340:2;33335:3;33276:67;:::i;:::-;33269:74;;33352:93;33441:3;33352:93;:::i;:::-;33470:2;33465:3;33461:12;33454:19;;33113:366;;;:::o;33485:419::-;33651:4;33689:2;33678:9;33674:18;33666:26;;33738:9;33732:4;33728:20;33724:1;33713:9;33709:17;33702:47;33766:131;33892:4;33766:131;:::i;:::-;33758:139;;33485:419;;;:::o;33910:410::-;33950:7;33973:20;33991:1;33973:20;:::i;:::-;33968:25;;34007:20;34025:1;34007:20;:::i;:::-;34002:25;;34062:1;34059;34055:9;34084:30;34102:11;34084:30;:::i;:::-;34073:41;;34263:1;34254:7;34250:15;34247:1;34244:22;34224:1;34217:9;34197:83;34174:139;;34293:18;;:::i;:::-;34174:139;33958:362;33910:410;;;;:::o;34326:232::-;34466:34;34462:1;34454:6;34450:14;34443:58;34535:15;34530:2;34522:6;34518:15;34511:40;34326:232;:::o;34564:366::-;34706:3;34727:67;34791:2;34786:3;34727:67;:::i;:::-;34720:74;;34803:93;34892:3;34803:93;:::i;:::-;34921:2;34916:3;34912:12;34905:19;;34564:366;;;:::o;34936:419::-;35102:4;35140:2;35129:9;35125:18;35117:26;;35189:9;35183:4;35179:20;35175:1;35164:9;35160:17;35153:47;35217:131;35343:4;35217:131;:::i;:::-;35209:139;;34936:419;;;:::o;35361:182::-;35501:34;35497:1;35489:6;35485:14;35478:58;35361:182;:::o;35549:366::-;35691:3;35712:67;35776:2;35771:3;35712:67;:::i;:::-;35705:74;;35788:93;35877:3;35788:93;:::i;:::-;35906:2;35901:3;35897:12;35890:19;;35549:366;;;:::o;35921:419::-;36087:4;36125:2;36114:9;36110:18;36102:26;;36174:9;36168:4;36164:20;36160:1;36149:9;36145:17;36138:47;36202:131;36328:4;36202:131;:::i;:::-;36194:139;;35921:419;;;:::o;36346:93::-;36383:6;36430:2;36425;36418:5;36414:14;36410:23;36400:33;;36346:93;;;:::o;36445:107::-;36489:8;36539:5;36533:4;36529:16;36508:37;;36445:107;;;;:::o;36558:393::-;36627:6;36677:1;36665:10;36661:18;36700:97;36730:66;36719:9;36700:97;:::i;:::-;36818:39;36848:8;36837:9;36818:39;:::i;:::-;36806:51;;36890:4;36886:9;36879:5;36875:21;36866:30;;36939:4;36929:8;36925:19;36918:5;36915:30;36905:40;;36634:317;;36558:393;;;;;:::o;36957:60::-;36985:3;37006:5;36999:12;;36957:60;;;:::o;37023:142::-;37073:9;37106:53;37124:34;37133:24;37151:5;37133:24;:::i;:::-;37124:34;:::i;:::-;37106:53;:::i;:::-;37093:66;;37023:142;;;:::o;37171:75::-;37214:3;37235:5;37228:12;;37171:75;;;:::o;37252:269::-;37362:39;37393:7;37362:39;:::i;:::-;37423:91;37472:41;37496:16;37472:41;:::i;:::-;37464:6;37457:4;37451:11;37423:91;:::i;:::-;37417:4;37410:105;37328:193;37252:269;;;:::o;37527:73::-;37572:3;37527:73;:::o;37606:189::-;37683:32;;:::i;:::-;37724:65;37782:6;37774;37768:4;37724:65;:::i;:::-;37659:136;37606:189;;:::o;37801:186::-;37861:120;37878:3;37871:5;37868:14;37861:120;;;37932:39;37969:1;37962:5;37932:39;:::i;:::-;37905:1;37898:5;37894:13;37885:22;;37861:120;;;37801:186;;:::o;37993:543::-;38094:2;38089:3;38086:11;38083:446;;;38128:38;38160:5;38128:38;:::i;:::-;38212:29;38230:10;38212:29;:::i;:::-;38202:8;38198:44;38395:2;38383:10;38380:18;38377:49;;;38416:8;38401:23;;38377:49;38439:80;38495:22;38513:3;38495:22;:::i;:::-;38485:8;38481:37;38468:11;38439:80;:::i;:::-;38098:431;;38083:446;37993:543;;;:::o;38542:117::-;38596:8;38646:5;38640:4;38636:16;38615:37;;38542:117;;;;:::o;38665:169::-;38709:6;38742:51;38790:1;38786:6;38778:5;38775:1;38771:13;38742:51;:::i;:::-;38738:56;38823:4;38817;38813:15;38803:25;;38716:118;38665:169;;;;:::o;38839:295::-;38915:4;39061:29;39086:3;39080:4;39061:29;:::i;:::-;39053:37;;39123:3;39120:1;39116:11;39110:4;39107:21;39099:29;;38839:295;;;;:::o;39139:1395::-;39256:37;39289:3;39256:37;:::i;:::-;39358:18;39350:6;39347:30;39344:56;;;39380:18;;:::i;:::-;39344:56;39424:38;39456:4;39450:11;39424:38;:::i;:::-;39509:67;39569:6;39561;39555:4;39509:67;:::i;:::-;39603:1;39627:4;39614:17;;39659:2;39651:6;39648:14;39676:1;39671:618;;;;40333:1;40350:6;40347:77;;;40399:9;40394:3;40390:19;40384:26;40375:35;;40347:77;40450:67;40510:6;40503:5;40450:67;:::i;:::-;40444:4;40437:81;40306:222;39641:887;;39671:618;39723:4;39719:9;39711:6;39707:22;39757:37;39789:4;39757:37;:::i;:::-;39816:1;39830:208;39844:7;39841:1;39838:14;39830:208;;;39923:9;39918:3;39914:19;39908:26;39900:6;39893:42;39974:1;39966:6;39962:14;39952:24;;40021:2;40010:9;40006:18;39993:31;;39867:4;39864:1;39860:12;39855:17;;39830:208;;;40066:6;40057:7;40054:19;40051:179;;;40124:9;40119:3;40115:19;40109:26;40167:48;40209:4;40201:6;40197:17;40186:9;40167:48;:::i;:::-;40159:6;40152:64;40074:156;40051:179;40276:1;40272;40264:6;40260:14;40256:22;40250:4;40243:36;39678:611;;;39641:887;;39231:1303;;;39139:1395;;:::o;40540:174::-;40680:26;40676:1;40668:6;40664:14;40657:50;40540:174;:::o;40720:366::-;40862:3;40883:67;40947:2;40942:3;40883:67;:::i;:::-;40876:74;;40959:93;41048:3;40959:93;:::i;:::-;41077:2;41072:3;41068:12;41061:19;;40720:366;;;:::o;41092:419::-;41258:4;41296:2;41285:9;41281:18;41273:26;;41345:9;41339:4;41335:20;41331:1;41320:9;41316:17;41309:47;41373:131;41499:4;41373:131;:::i;:::-;41365:139;;41092:419;;;:::o;41517:228::-;41657:34;41653:1;41645:6;41641:14;41634:58;41726:11;41721:2;41713:6;41709:15;41702:36;41517:228;:::o;41751:366::-;41893:3;41914:67;41978:2;41973:3;41914:67;:::i;:::-;41907:74;;41990:93;42079:3;41990:93;:::i;:::-;42108:2;42103:3;42099:12;42092:19;;41751:366;;;:::o;42123:419::-;42289:4;42327:2;42316:9;42312:18;42304:26;;42376:9;42370:4;42366:20;42362:1;42351:9;42347:17;42340:47;42404:131;42530:4;42404:131;:::i;:::-;42396:139;;42123:419;;;:::o;42548:225::-;42688:34;42684:1;42676:6;42672:14;42665:58;42757:8;42752:2;42744:6;42740:15;42733:33;42548:225;:::o;42779:366::-;42921:3;42942:67;43006:2;43001:3;42942:67;:::i;:::-;42935:74;;43018:93;43107:3;43018:93;:::i;:::-;43136:2;43131:3;43127:12;43120:19;;42779:366;;;:::o;43151:419::-;43317:4;43355:2;43344:9;43340:18;43332:26;;43404:9;43398:4;43394:20;43390:1;43379:9;43375:17;43368:47;43432:131;43558:4;43432:131;:::i;:::-;43424:139;;43151:419;;;:::o;43576:181::-;43716:33;43712:1;43704:6;43700:14;43693:57;43576:181;:::o;43763:366::-;43905:3;43926:67;43990:2;43985:3;43926:67;:::i;:::-;43919:74;;44002:93;44091:3;44002:93;:::i;:::-;44120:2;44115:3;44111:12;44104:19;;43763:366;;;:::o;44135:419::-;44301:4;44339:2;44328:9;44324:18;44316:26;;44388:9;44382:4;44378:20;44374:1;44363:9;44359:17;44352:47;44416:131;44542:4;44416:131;:::i;:::-;44408:139;;44135:419;;;:::o;44560:180::-;44608:77;44605:1;44598:88;44705:4;44702:1;44695:15;44729:4;44726:1;44719:15;44746:233;44886:34;44882:1;44874:6;44870:14;44863:58;44955:16;44950:2;44942:6;44938:15;44931:41;44746:233;:::o;44985:366::-;45127:3;45148:67;45212:2;45207:3;45148:67;:::i;:::-;45141:74;;45224:93;45313:3;45224:93;:::i;:::-;45342:2;45337:3;45333:12;45326:19;;44985:366;;;:::o;45357:419::-;45523:4;45561:2;45550:9;45546:18;45538:26;;45610:9;45604:4;45600:20;45596:1;45585:9;45581:17;45574:47;45638:131;45764:4;45638:131;:::i;:::-;45630:139;;45357:419;;;:::o;45782:224::-;45922:34;45918:1;45910:6;45906:14;45899:58;45991:7;45986:2;45978:6;45974:15;45967:32;45782:224;:::o;46012:366::-;46154:3;46175:67;46239:2;46234:3;46175:67;:::i;:::-;46168:74;;46251:93;46340:3;46251:93;:::i;:::-;46369:2;46364:3;46360:12;46353:19;;46012:366;;;:::o;46384:419::-;46550:4;46588:2;46577:9;46573:18;46565:26;;46637:9;46631:4;46627:20;46623:1;46612:9;46608:17;46601:47;46665:131;46791:4;46665:131;:::i;:::-;46657:139;;46384:419;;;:::o;46809:223::-;46949:34;46945:1;46937:6;46933:14;46926:58;47018:6;47013:2;47005:6;47001:15;46994:31;46809:223;:::o;47038:366::-;47180:3;47201:67;47265:2;47260:3;47201:67;:::i;:::-;47194:74;;47277:93;47366:3;47277:93;:::i;:::-;47395:2;47390:3;47386:12;47379:19;;47038:366;;;:::o;47410:419::-;47576:4;47614:2;47603:9;47599:18;47591:26;;47663:9;47657:4;47653:20;47649:1;47638:9;47634:17;47627:47;47691:131;47817:4;47691:131;:::i;:::-;47683:139;;47410:419;;;:::o;47835:182::-;47975:34;47971:1;47963:6;47959:14;47952:58;47835:182;:::o;48023:366::-;48165:3;48186:67;48250:2;48245:3;48186:67;:::i;:::-;48179:74;;48262:93;48351:3;48262:93;:::i;:::-;48380:2;48375:3;48371:12;48364:19;;48023:366;;;:::o;48395:419::-;48561:4;48599:2;48588:9;48584:18;48576:26;;48648:9;48642:4;48638:20;48634:1;48623:9;48619:17;48612:47;48676:131;48802:4;48676:131;:::i;:::-;48668:139;;48395:419;;;:::o;48820:175::-;48960:27;48956:1;48948:6;48944:14;48937:51;48820:175;:::o;49001:366::-;49143:3;49164:67;49228:2;49223:3;49164:67;:::i;:::-;49157:74;;49240:93;49329:3;49240:93;:::i;:::-;49358:2;49353:3;49349:12;49342:19;;49001:366;;;:::o;49373:419::-;49539:4;49577:2;49566:9;49562:18;49554:26;;49626:9;49620:4;49616:20;49612:1;49601:9;49597:17;49590:47;49654:131;49780:4;49654:131;:::i;:::-;49646:139;;49373:419;;;:::o;49798:237::-;49938:34;49934:1;49926:6;49922:14;49915:58;50007:20;50002:2;49994:6;49990:15;49983:45;49798:237;:::o;50041:366::-;50183:3;50204:67;50268:2;50263:3;50204:67;:::i;:::-;50197:74;;50280:93;50369:3;50280:93;:::i;:::-;50398:2;50393:3;50389:12;50382:19;;50041:366;;;:::o;50413:419::-;50579:4;50617:2;50606:9;50602:18;50594:26;;50666:9;50660:4;50656:20;50652:1;50641:9;50637:17;50630:47;50694:131;50820:4;50694:131;:::i;:::-;50686:139;;50413:419;;;:::o;50838:435::-;51018:3;51040:95;51131:3;51122:6;51040:95;:::i;:::-;51033:102;;51152:95;51243:3;51234:6;51152:95;:::i;:::-;51145:102;;51264:3;51257:10;;50838:435;;;;;:::o;51279:98::-;51330:6;51364:5;51358:12;51348:22;;51279:98;;;:::o;51383:168::-;51466:11;51500:6;51495:3;51488:19;51540:4;51535:3;51531:14;51516:29;;51383:168;;;;:::o;51557:373::-;51643:3;51671:38;51703:5;51671:38;:::i;:::-;51725:70;51788:6;51783:3;51725:70;:::i;:::-;51718:77;;51804:65;51862:6;51857:3;51850:4;51843:5;51839:16;51804:65;:::i;:::-;51894:29;51916:6;51894:29;:::i;:::-;51889:3;51885:39;51878:46;;51647:283;51557:373;;;;:::o;51936:640::-;52131:4;52169:3;52158:9;52154:19;52146:27;;52183:71;52251:1;52240:9;52236:17;52227:6;52183:71;:::i;:::-;52264:72;52332:2;52321:9;52317:18;52308:6;52264:72;:::i;:::-;52346;52414:2;52403:9;52399:18;52390:6;52346:72;:::i;:::-;52465:9;52459:4;52455:20;52450:2;52439:9;52435:18;52428:48;52493:76;52564:4;52555:6;52493:76;:::i;:::-;52485:84;;51936:640;;;;;;;:::o;52582:141::-;52638:5;52669:6;52663:13;52654:22;;52685:32;52711:5;52685:32;:::i;:::-;52582:141;;;;:::o;52729:349::-;52798:6;52847:2;52835:9;52826:7;52822:23;52818:32;52815:119;;;52853:79;;:::i;:::-;52815:119;52973:1;52998:63;53053:7;53044:6;53033:9;53029:22;52998:63;:::i;:::-;52988:73;;52944:127;52729:349;;;;:::o;53084:182::-;53224:34;53220:1;53212:6;53208:14;53201:58;53084:182;:::o;53272:366::-;53414:3;53435:67;53499:2;53494:3;53435:67;:::i;:::-;53428:74;;53511:93;53600:3;53511:93;:::i;:::-;53629:2;53624:3;53620:12;53613:19;;53272:366;;;:::o;53644:419::-;53810:4;53848:2;53837:9;53833:18;53825:26;;53897:9;53891:4;53887:20;53883:1;53872:9;53868:17;53861:47;53925:131;54051:4;53925:131;:::i;:::-;53917:139;;53644:419;;;:::o;54069:178::-;54209:30;54205:1;54197:6;54193:14;54186:54;54069:178;:::o;54253:366::-;54395:3;54416:67;54480:2;54475:3;54416:67;:::i;:::-;54409:74;;54492:93;54581:3;54492:93;:::i;:::-;54610:2;54605:3;54601:12;54594:19;;54253:366;;;:::o;54625:419::-;54791:4;54829:2;54818:9;54814:18;54806:26;;54878:9;54872:4;54868:20;54864:1;54853:9;54849:17;54842:47;54906:131;55032:4;54906:131;:::i;:::-;54898:139;;54625:419;;;:::o

Swarm Source

ipfs://3cfc9f8ba7d47894edf9ce68426ab1467223a2998af97671afe1f580499eccb2
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.