ETH Price: $2,733.08 (+0.95%)
Gas: 0.74 Gwei

Token

SETOSHI (SET)
 

Overview

Max Total Supply

402 SET

Holders

188

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
6 SET
0x2ac49272478f13a1015448bf8650edccf6c176a6
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:
setoshi

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-12-07
*/

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.20;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the Merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates Merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     *@dev The multiproof provided is not valid.
     */
    error MerkleProofInvalidMultiproof();

    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     */
    function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the Merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 proofLen = proof.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        if (leavesLen + proofLen != totalHashes + 1) {
            revert MerkleProofInvalidMultiproof();
        }

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            if (proofPos != proofLen) {
                revert MerkleProofInvalidMultiproof();
            }
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the Merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 proofLen = proof.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        if (leavesLen + proofLen != totalHashes + 1) {
            revert MerkleProofInvalidMultiproof();
        }

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            if (proofPos != proofLen) {
                revert MerkleProofInvalidMultiproof();
            }
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Sorts the pair (a, b) and hashes the result.
     */
    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    /**
     * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory.
     */
    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: @openzeppelin/contracts/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/contracts/utils/math/SignedMath.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.20;

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

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

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

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

// File: @openzeppelin/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)

pragma solidity ^0.8.20;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds towards infinity instead
     * of rounding towards zero.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        if (b == 0) {
            // Guarantee the same behavior as in a regular Solidity division.
            return a / b;
        }

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

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

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

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            if (denominator <= prod1) {
                revert MathOverflowedMulDiv();
            }

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

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

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

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

            uint256 twos = denominator & (0 - denominator);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)

pragma solidity ^0.8.20;



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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @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/contracts/security/Pausable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: @openzeppelin/contracts/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: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @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`,
     * 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 be 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,
        bytes calldata data
    ) external payable;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom}
     * whenever possible.
     *
     * 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 payable;

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

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

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view virtual returns (uint256) {
        // Counter underflow is impossible as `_currentIndex` does not decrement,
        // and it is initialized to `_startTokenId()`.
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

    /**
     * @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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public payable virtual override {
        address owner = ownerOf(tokenId);

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token IDs
     * are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token IDs
     * have been transferred. This includes minting.
     * And also called after one token has been burned.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

// File: setoshi.sol

//SPDX-License-Identifier: MIT

pragma solidity ^0.8.18;







/**
* stage 1: open to whitelist and the public (4444 supply for wl and 2222 for the public)
* stage 2: if the wl doesn't get fully minted in the first stage, the remaining supply will shift to the public mint in 2 hours. WL minting will no longer be available.
*/

contract setoshi is ERC721A, Ownable, Pausable, ReentrancyGuard {

    uint256 public maxSupply = 6666;

    //minter roles configuration
    struct MintersInfo {
        uint8 maxMintPerTransaction; //max mint per wallet and per transaction
        uint8 numberOfFreemint;
        uint256 supply; //max allocated supply per minter role
        uint256 mintCost;
        bytes32 root; //Merkle root
    }

    mapping(string => MintersInfo) minters; //map of minter types
    mapping(string => uint256) public mintedCount; //map of total mints per type


    enum Phases { N, Phase1, Public } //mint phases, N = mint not live

    Phases public currentPhase;

    mapping(address => uint256) minted; //map of addresses that minted
    mapping(string => mapping(address => uint8)) public mintedPerRole;  //map of addresses that minted per phase and their mint counts
    mapping(address => uint8) public mintedFree; //map of addresses that minted free and their mint counts

    address[] public mintersAddresses; //addresses of minters    
    
    string private baseURI;
    string[] private prerevealedArtworks;
    bool isRevealed;

    //events
    event Minted(address indexed to, uint8 numberOfTokens, uint256 amount);
    event SoldOut();
   
    event PhaseChanged(address indexed to, uint256 indexed eventId, uint8 indexed phaseId);
    event WithdrawalSuccessful(address indexed to, uint256 amount);
    event CollectionRevealed(address indexed to);
    

    //errors
    error WithdrawalFailed();

    constructor() ERC721A("SETOSHI", "SET") {
        _pause();
        currentPhase = Phases.N;

        //added an invalid root here to avoid zero comparison later
        addMintersInfo(
            "WL", // mintoshi role name
            6, // max per walletoshi, per txoshi
            1, // numberoshi of free mint
            4444, // allotoshi
            0.0066 ether, // mint price
            0x8ac3d4f184349fb28ebb642349f97130ce71b7bc967acb07c881b5ec27ad725c //root dummy
        );

        addMintersInfo(
            "PUBLIC", // mintoshi role name
            6, // max per walletoshi, per txoshi
            0, // numberoshi of free mint
            2222, // allotoshi
            0.007 ether, // mint price
            0x8ac3d4f184349fb28ebb642349f97130ce71b7bc967acb07c881b5ec27ad725c //root dummy
        );

    }

    function whitelistMint(uint8 numberOfTokens, bytes32[] calldata proof) external payable nonReentrant whenNotPaused {

        require(currentPhase == Phases.Phase1, "ERROR: Mint is not active.");
        string memory _minterRole = "WL"; //set minter role
       
        uint256 _totalCost;

        //verify whitelist
        require(_isWhitelisted(msg.sender, proof, minters[_minterRole].root), "ERROR: You are not allowed to mint on this phase.");

        require(mintedCount[_minterRole] + numberOfTokens <= minters[_minterRole].supply, "ERROR: Maximum number of mints on this phase has been reached");
        require(numberOfTokens <= minters[_minterRole].maxMintPerTransaction, "ERROR: Maximum number of mints per transaction exceeded");
        require((mintedPerRole[_minterRole][msg.sender] + numberOfTokens) <= minters[_minterRole].maxMintPerTransaction, "ERROR: Your maximum NFT mint per wallet on this phase has been reached.");

        //Free mint check
        if ((mintedFree[msg.sender] > 0)) {

            _totalCost = minters[_minterRole].mintCost * numberOfTokens;
            require(msg.value >= _totalCost, "ERROR: You do not have enough funds to mint.");

        } else {

            //Block for free mint
            if (numberOfTokens == 1) {
                
                require(mintedFree[msg.sender] == 0, "ERROR: You do not have enough funds to mint.");

            } else if (numberOfTokens > 1) {

                _totalCost = minters[_minterRole].mintCost * (numberOfTokens - minters[_minterRole].numberOfFreemint);
                require(msg.value >= _totalCost, "ERROR: You do not have enough funds to mint.");
            
            }
            
            mintedFree[msg.sender] = 1; // Register free mint
        }

        payable(owner()).transfer(msg.value);
        _phaseMint(_minterRole, numberOfTokens, _totalCost);
    }

    function publicMint(uint8 numberOfTokens) external payable nonReentrant whenNotPaused {
        
        require(currentPhase != Phases.N, "ERROR: Mint is not active.");
        string memory _minterRole = "PUBLIC";

        require(numberOfTokens <= minters[_minterRole].maxMintPerTransaction, "ERROR: Maximum number of mints per transaction exceeded");
        require((mintedPerRole[_minterRole][msg.sender] + numberOfTokens) <= minters[_minterRole].maxMintPerTransaction, "ERROR: Your maximum NFT mint per wallet on this phase has been reached.");

        if (currentPhase == Phases.Phase1) {
            //on this phase make sure that the allocated supply count per minter role will not be exceeded
            require(mintedCount[_minterRole] + numberOfTokens <= minters[_minterRole].supply, "ERROR: Maximum number of mints on this phase has been reached");
        }

        uint256 _totalCost;
        _totalCost = minters[_minterRole].mintCost * numberOfTokens;
        require(msg.value >= _totalCost, "ERROR: You do not have enough funds to mint.");
        payable(owner()).transfer(msg.value);
        
        _phaseMint(_minterRole, numberOfTokens, _totalCost);          
    }

    function verifyWhitelist(string memory _minterType, address _address, bytes32[] calldata _merkleProof) public view returns (bool) {
        require(minters[_minterType].root != bytes32(0), "ERROR: Minter Type not found.");
        if (_isWhitelisted(_address, _merkleProof, minters[_minterType].root))
            return true;
        return false;
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(_tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        if (isRevealed) {
            // _tokenId += 1;
            return string(abi.encodePacked(baseURI, Strings.toString(_tokenId), ".json"));
        }

        uint _ipfsIndex = _tokenId % prerevealedArtworks.length; //distribute pre-reveal images, alternating

        return prerevealedArtworks[_ipfsIndex];
    }

    function setMintPhase(uint8 _phase) public onlyOwner {
        currentPhase = Phases(_phase);
        emit PhaseChanged(msg.sender, block.timestamp, uint8(currentPhase));
    }

    function setMaxSupply(uint256 _maxSupply) public onlyOwner {
        maxSupply = _maxSupply;
    }

    //Function to add MintersInfo to minters
    function addMintersInfo(
        string memory _minterName,
        uint8 _maxMintPerTransaction,
        uint8 _numberOfFreeMint,
        uint256 _supply,
        uint256 _mintCost,
        bytes32 _root
    ) public onlyOwner {
        MintersInfo memory newMintersInfo = MintersInfo(
            _maxMintPerTransaction,
            _numberOfFreeMint,
            _supply,
            _mintCost,
            _root
        );
        minters[_minterName] = newMintersInfo;
    }

    //Function to modify MintersInfo of a minterRole
    function modifyMintersInfo(
        string memory _minterName,
        uint8 _newMaxMintPerTransaction,
        uint8 _newNumberOfFreeMint,
        uint256 _newSupply,
        uint256 _newMintCost,
        bytes32 _newRoot
    ) public onlyOwner {
        require(minters[_minterName].root != bytes32(0), "MintersInfo not found.");
        MintersInfo memory updatedMintersInfo = MintersInfo(
            _newMaxMintPerTransaction,
            _newNumberOfFreeMint,
            _newSupply,
            _newMintCost,
            _newRoot
        );

        minters[_minterName] = updatedMintersInfo;
    }

    function modifyMintersMintCost(
        string memory _minterName,
        uint256 _newMintCost
    ) public onlyOwner {
        require(minters[_minterName].root != bytes32(0), "MintersInfo not found.");
        minters[_minterName].mintCost = _newMintCost;
    }

    function modifyMintersSupply(
        string memory _minterName,
        uint256 _newSupplyCount
    ) public onlyOwner {
        require(minters[_minterName].root != bytes32(0), "MintersInfo not found.");
        minters[_minterName].supply = _newSupplyCount;
    }

    function modifyFreeMintCount(
        string memory _minterName,
        uint8 _newFreeMintCount
    ) public onlyOwner {
        require(minters[_minterName].root != bytes32(0), "MintersInfo not found.");
        minters[_minterName].numberOfFreemint = _newFreeMintCount;
    }

    function modifyMintersMaxMintPerTransaction(
        string memory _minterName,
        uint8 _newMaxMintPerTransaction
    ) public onlyOwner {
        require(minters[_minterName].root != bytes32(0), "MintersInfo not found.");
        minters[_minterName].maxMintPerTransaction = _newMaxMintPerTransaction;
    }

    //Function to get the MintersInfo for a specific minter
    function getMintInfo(string memory _minterName, address _userAddress) public view returns (uint8, uint8, uint256, uint256, uint256, uint8) {

        uint8 _mintedPerRole = mintedPerRole[_minterName][_userAddress];
        return (
           
            uint8(currentPhase),
            minters[_minterName].maxMintPerTransaction,
            minters[_minterName].mintCost, 
            minters[_minterName].supply, 
            mintedCount[_minterName],
            _mintedPerRole
        );
    }


    function getWLMintCost() external view returns (uint256) {
        return minters["WL"].mintCost;
    }

    function getPublicMintCost() external view returns (uint256) {
        return minters["PUBLIC"].mintCost;
    }

    function getMaxWLMintPerTransaction() external view returns (uint8) {
        return minters["WL"].maxMintPerTransaction;
    }

    function getMaxPublicMintPerTransaction() external view returns (uint8) {
        return minters["PUBLIC"].maxMintPerTransaction;
    }

    function getWLMintedCount(address userAddress) external view returns (uint256) {
        return mintedPerRole["WL"][userAddress];
    }

    function getPublicMintedCount(address userAddress) external view returns (uint256) {
        return mintedPerRole["PUBLIC"][userAddress];
    }


    //Function to modify the root of an existing MintersInfo
    function modifyMintersRoot(string memory _minterName, bytes32 _newRoot) public onlyOwner {
        require(minters[_minterName].root != bytes32(0), "ERROR: MintersInfo not found."); //change
        minters[_minterName].root = _newRoot;
    }

    function modifyPrerevealImages(string[] memory _urlArray) public onlyOwner {
        prerevealedArtworks = _urlArray;
    }

    function revealCollection (string memory _baseURI, bool _isRevealed) public onlyOwner {
        isRevealed = _isRevealed;
        baseURI = _baseURI;

        if (isRevealed)
            emit CollectionRevealed(msg.sender);
    }

    function unPause() public onlyOwner {
        _unpause();
    }

    function pause() public onlyOwner whenNotPaused {
        _pause();
    }

    function internalMint(uint8 numberOfTokens) public onlyOwner {
        require((_totalMinted() + numberOfTokens) <= maxSupply, "ERROR: Not enough tokens");
        _safeMint(msg.sender, numberOfTokens);
        emit Minted(msg.sender, numberOfTokens, 0);
    }

    function _phaseMint(string memory _minterRole, uint8 _numberOfTokens, uint256 _totalCost) internal {
        
        require((_totalMinted() + _numberOfTokens) <= maxSupply, "ERROR: No tokens left to mint");
        require(_numberOfTokens > 0, "ERROR: Number of tokens should be greater than zero");

        _safeMint(msg.sender, _numberOfTokens);

        //after mint registry
        mintedCount[_minterRole] += _numberOfTokens; //adds the newly minted token count per minter Role
        //mintedPerPhase[uint8(currentPhase)][msg.sender] += _numberOfTokens; //registers the address and the number of tokens of the minter
        mintedPerRole[_minterRole][msg.sender] += _numberOfTokens; //registers the address and the number of tokens of the minter per role
        mintersAddresses.push(msg.sender); //registers minters address, for future purposes

        emit Minted(msg.sender, _numberOfTokens, _totalCost);
        
        //if total minted reach or exceeds max supply - pause contract
        if (_totalMinted() >= maxSupply) {
            emit SoldOut();
           // _pause();
        }    
    } 

    //for whitelist check
    function _isWhitelisted  (
        address _minterLeaf,
        bytes32[] calldata _merkleProof, 
        bytes32 _minterRoot
    ) public pure returns (bool) {
        bytes32 _leaf = keccak256(abi.encodePacked(_minterLeaf));
        return MerkleProof.verify(_merkleProof, _minterRoot, _leaf);
    }

    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"WithdrawalFailed","type":"error"},{"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":true,"internalType":"address","name":"to","type":"address"}],"name":"CollectionRevealed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint8","name":"numberOfTokens","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"amount","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"eventId","type":"uint256"},{"indexed":true,"internalType":"uint8","name":"phaseId","type":"uint8"}],"name":"PhaseChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"SoldOut","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawalSuccessful","type":"event"},{"inputs":[{"internalType":"address","name":"_minterLeaf","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"bytes32","name":"_minterRoot","type":"bytes32"}],"name":"_isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"_minterName","type":"string"},{"internalType":"uint8","name":"_maxMintPerTransaction","type":"uint8"},{"internalType":"uint8","name":"_numberOfFreeMint","type":"uint8"},{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_mintCost","type":"uint256"},{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"addMintersInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPhase","outputs":[{"internalType":"enum setoshi.Phases","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxPublicMintPerTransaction","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxWLMintPerTransaction","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_minterName","type":"string"},{"internalType":"address","name":"_userAddress","type":"address"}],"name":"getMintInfo","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicMintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"getPublicMintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWLMintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"getWLMintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"internalMint","outputs":[],"stateMutability":"nonpayable","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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"mintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedFree","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"address","name":"","type":"address"}],"name":"mintedPerRole","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintersAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_minterName","type":"string"},{"internalType":"uint8","name":"_newFreeMintCount","type":"uint8"}],"name":"modifyFreeMintCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_minterName","type":"string"},{"internalType":"uint8","name":"_newMaxMintPerTransaction","type":"uint8"},{"internalType":"uint8","name":"_newNumberOfFreeMint","type":"uint8"},{"internalType":"uint256","name":"_newSupply","type":"uint256"},{"internalType":"uint256","name":"_newMintCost","type":"uint256"},{"internalType":"bytes32","name":"_newRoot","type":"bytes32"}],"name":"modifyMintersInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_minterName","type":"string"},{"internalType":"uint8","name":"_newMaxMintPerTransaction","type":"uint8"}],"name":"modifyMintersMaxMintPerTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_minterName","type":"string"},{"internalType":"uint256","name":"_newMintCost","type":"uint256"}],"name":"modifyMintersMintCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_minterName","type":"string"},{"internalType":"bytes32","name":"_newRoot","type":"bytes32"}],"name":"modifyMintersRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_minterName","type":"string"},{"internalType":"uint256","name":"_newSupplyCount","type":"uint256"}],"name":"modifyMintersSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_urlArray","type":"string[]"}],"name":"modifyPrerevealImages","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"bool","name":"_isRevealed","type":"bool"}],"name":"revealCollection","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":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_phase","type":"uint8"}],"name":"setMintPhase","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_minterType","type":"string"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"verifyWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052611a0a600a5534801562000016575f80fd5b506040518060400160405280600781526020017f5345544f534849000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f53455400000000000000000000000000000000000000000000000000000000008152508160029081620000949190620007c5565b508060039081620000a69190620007c5565b50620000b76200023160201b60201c565b5f819055505050620000de620000d26200023560201b60201c565b6200023c60201b60201c565b5f600860146101000a81548160ff021916908315150217905550600160098190555062000110620002ff60201b60201c565b5f600d5f6101000a81548160ff02191690836002811115620001375762000136620008a9565b5b0217905550620001b46040518060400160405280600281526020017f574c0000000000000000000000000000000000000000000000000000000000008152506006600161115c661772aa3f8480007f8ac3d4f184349fb28ebb642349f97130ce71b7bc967acb07c881b5ec27ad725c5f1b6200037460201b60201c565b6200022b6040518060400160405280600681526020017f5055424c4943000000000000000000000000000000000000000000000000000081525060065f6108ae6618de76816d80007f8ac3d4f184349fb28ebb642349f97130ce71b7bc967acb07c881b5ec27ad725c5f1b6200037460201b60201c565b62000aa2565b5f90565b5f33905090565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200030f6200043d60201b60201c565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200035b6200023560201b60201c565b6040516200036a919062000919565b60405180910390a1565b620003846200049260201b60201c565b5f6040518060a001604052808760ff1681526020018660ff16815260200185815260200184815260200183815250905080600b88604051620003c791906200099e565b90815260200160405180910390205f820151815f015f6101000a81548160ff021916908360ff1602179055506020820151815f0160016101000a81548160ff021916908360ff16021790555060408201518160010155606082015181600201556080820151816003015590505050505050505050565b6200044d6200052360201b60201c565b1562000490576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004879062000a14565b60405180910390fd5b565b620004a26200023560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004c86200053960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000521576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005189062000a82565b60405180910390fd5b565b5f600860149054906101000a900460ff16905090565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620005dd57607f821691505b602082108103620005f357620005f262000598565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620006577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200061a565b6200066386836200061a565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620006ad620006a7620006a1846200067b565b62000684565b6200067b565b9050919050565b5f819050919050565b620006c8836200068d565b620006e0620006d782620006b4565b84845462000626565b825550505050565b5f90565b620006f6620006e8565b62000703818484620006bd565b505050565b5b818110156200072a576200071e5f82620006ec565b60018101905062000709565b5050565b601f82111562000779576200074381620005f9565b6200074e846200060b565b810160208510156200075e578190505b620007766200076d856200060b565b83018262000708565b50505b505050565b5f82821c905092915050565b5f6200079b5f19846008026200077e565b1980831691505092915050565b5f620007b583836200078a565b9150826002028217905092915050565b620007d08262000561565b67ffffffffffffffff811115620007ec57620007eb6200056b565b5b620007f88254620005c5565b620008058282856200072e565b5f60209050601f8311600181146200083b575f841562000826578287015190505b620008328582620007a8565b865550620008a1565b601f1984166200084b86620005f9565b5f5b8281101562000874578489015182556001820191506020850194506020810190506200084d565b8683101562000894578489015162000890601f8916826200078a565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200090182620008d6565b9050919050565b6200091381620008f5565b82525050565b5f6020820190506200092e5f83018462000908565b92915050565b5f81905092915050565b5f5b838110156200095d57808201518184015260208101905062000940565b5f8484015250505050565b5f620009748262000561565b62000980818562000934565b9350620009928185602086016200093e565b80840191505092915050565b5f620009ab828462000968565b915081905092915050565b5f82825260208201905092915050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f620009fc601083620009b6565b915062000a0982620009c6565b602082019050919050565b5f6020820190508181035f83015262000a2d81620009ee565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f62000a6a602083620009b6565b915062000a778262000a34565b602082019050919050565b5f6020820190508181035f83015262000a9b8162000a5c565b9050919050565b6159da8062000ab05f395ff3fe6080604052600436106102ac575f3560e01c80636f8b44b011610174578063ad5a6dc5116100db578063e1c6780511610094578063e985e9c51161006e578063e985e9c514610a7d578063ed7c7fe814610ab9578063f2fde38b14610ae3578063f7b188a514610b0b576102ac565b8063e1c67805146109f1578063e7d9793714610a19578063e85ada7214610a41576102ac565b8063ad5a6dc5146108f5578063b88d4fde1461091f578063c87b56dd1461093b578063cf7c0b4914610977578063d5abeb011461099f578063d89a7574146109c9576102ac565b80638456cb591161012d5780638456cb591461081d578063858e83b5146108335780638a4d367b1461084f5780638da5cb5b1461087957806395d89b41146108a3578063a22cb465146108cd576102ac565b80636f8b44b01461072957806370a0823114610751578063715018a61461078d578063733428bf146107a3578063792a873e146107cd5780637e454447146107f5576102ac565b8063209848011161021857806342842e0e116101d157806342842e0e1461062757806347d4f57814610643578063583816691461066b5780635c975abb146106875780636107896e146106b15780636352211e146106ed576102ac565b8063209848011461051657806323b872dd14610552578063293227ab1461056e5780632b5619a41461059657806331c07bbf146105d7578063411d1be5146105ff576102ac565b8063095ea7b31161026a578063095ea7b3146103f457806309945734146104105780630e6f52721461044c57806315587fc31461048857806318160ddd146104c4578063189b83bd146104ee576102ac565b8062377580146102b057806301c392f0146102ec57806301ffc9a714610328578063055ad42e1461036457806306fdde031461038e578063081812fc146103b8575b5f80fd5b3480156102bb575f80fd5b506102d660048036038101906102d19190613d49565b610b21565b6040516102e39190613df0565b60405180910390f35b3480156102f7575f80fd5b50610312600480360381019061030d9190613e09565b610bce565b60405161031f9190613e4c565b60405180910390f35b348015610333575f80fd5b5061034e60048036038101906103499190613eba565b610c3d565b60405161035b9190613df0565b60405180910390f35b34801561036f575f80fd5b50610378610cce565b6040516103859190613f58565b60405180910390f35b348015610399575f80fd5b506103a2610ce0565b6040516103af9190613feb565b60405180910390f35b3480156103c3575f80fd5b506103de60048036038101906103d99190614035565b610d70565b6040516103eb919061406f565b60405180910390f35b61040e60048036038101906104099190614088565b610dea565b005b34801561041b575f80fd5b50610436600480360381019061043191906140c6565b610f29565b6040516104439190613e4c565b60405180910390f35b348015610457575f80fd5b50610472600480360381019061046d9190614140565b610f56565b60405161047f9190613df0565b60405180910390f35b348015610493575f80fd5b506104ae60048036038101906104a991906141b1565b610fd7565b6040516104bb9190614226565b60405180910390f35b3480156104cf575f80fd5b506104d8611019565b6040516104e59190613e4c565b60405180910390f35b3480156104f9575f80fd5b50610514600480360381019061050f919061423f565b61102e565b005b348015610521575f80fd5b5061053c60048036038101906105379190613e09565b6110c5565b6040516105499190614226565b60405180910390f35b61056c60048036038101906105679190614299565b6110e2565b005b348015610579575f80fd5b50610594600480360381019061058f91906142e9565b6113f0565b005b3480156105a1575f80fd5b506105bc60048036038101906105b791906141b1565b611487565b6040516105ce96959493929190614343565b60405180910390f35b3480156105e2575f80fd5b506105fd60048036038101906105f891906143cc565b6115bf565b005b34801561060a575f80fd5b50610625600480360381019061062091906143f7565b611670565b005b610641600480360381019061063c9190614299565b611719565b005b34801561064e575f80fd5b5061066960048036038101906106649190614451565b611738565b005b610685600480360381019061068091906144f6565b6117f7565b005b348015610692575f80fd5b5061069b611def565b6040516106a89190613df0565b60405180910390f35b3480156106bc575f80fd5b506106d760048036038101906106d29190614035565b611e05565b6040516106e4919061406f565b60405180910390f35b3480156106f8575f80fd5b50610713600480360381019061070e9190614035565b611e40565b604051610720919061406f565b60405180910390f35b348015610734575f80fd5b5061074f600480360381019061074a9190614035565b611e51565b005b34801561075c575f80fd5b5061077760048036038101906107729190613e09565b611e63565b6040516107849190613e4c565b60405180910390f35b348015610798575f80fd5b506107a1611f18565b005b3480156107ae575f80fd5b506107b7611f2b565b6040516107c49190614226565b60405180910390f35b3480156107d8575f80fd5b506107f360048036038101906107ee9190614631565b611f5c565b005b348015610800575f80fd5b5061081b600480360381019061081691906143f7565b611f7e565b005b348015610828575f80fd5b50610831612028565b005b61084d600480360381019061084891906143cc565b612042565b005b34801561085a575f80fd5b506108636123fd565b6040516108709190613e4c565b60405180910390f35b348015610884575f80fd5b5061088d612423565b60405161089a919061406f565b60405180910390f35b3480156108ae575f80fd5b506108b761244b565b6040516108c49190613feb565b60405180910390f35b3480156108d8575f80fd5b506108f360048036038101906108ee91906146a2565b6124db565b005b348015610900575f80fd5b506109096125e1565b6040516109169190614226565b60405180910390f35b6109396004803603810190610934919061477e565b612612565b005b348015610946575f80fd5b50610961600480360381019061095c9190614035565b612684565b60405161096e9190613feb565b60405180910390f35b348015610982575f80fd5b5061099d600480360381019061099891906142e9565b6127d4565b005b3480156109aa575f80fd5b506109b361286b565b6040516109c09190613e4c565b60405180910390f35b3480156109d4575f80fd5b506109ef60048036038101906109ea9190614451565b612871565b005b3480156109fc575f80fd5b50610a176004803603810190610a1291906147fe565b612995565b005b348015610a24575f80fd5b50610a3f6004803603810190610a3a91906143cc565b612a22565b005b348015610a4c575f80fd5b50610a676004803603810190610a629190613e09565b612ae4565b604051610a749190613e4c565b60405180910390f35b348015610a88575f80fd5b50610aa36004803603810190610a9e9190614858565b612b53565b604051610ab09190613df0565b60405180910390f35b348015610ac4575f80fd5b50610acd612be1565b604051610ada9190613e4c565b60405180910390f35b348015610aee575f80fd5b50610b096004803603810190610b049190613e09565b612c07565b005b348015610b16575f80fd5b50610b1f612c89565b005b5f805f1b600b86604051610b3591906148d0565b90815260200160405180910390206003015403610b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7e90614930565b60405180910390fd5b610bb4848484600b89604051610b9d91906148d0565b908152602001604051809103902060030154610f56565b15610bc25760019050610bc6565b5f90505b949350505050565b5f600f604051610bdd90614998565b90815260200160405180910390205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1660ff169050919050565b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c9757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cc75750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600d5f9054906101000a900460ff1681565b606060028054610cef906149d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1b906149d9565b8015610d665780601f10610d3d57610100808354040283529160200191610d66565b820191905f5260205f20905b815481529060010190602001808311610d4957829003601f168201915b5050505050905090565b5f610d7a82612c9b565b610db0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610df482611e40565b90508073ffffffffffffffffffffffffffffffffffffffff16610e15612cf5565b73ffffffffffffffffffffffffffffffffffffffff1614610e7857610e4181610e3c612cf5565b612b53565b610e77576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260065f8481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600c818051602081018201805184825260208301602085012081835280955050505050505f915090505481565b5f8085604051602001610f699190614a4e565b604051602081830303815290604052805190602001209050610fcc8585808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f820116905080830192505050505050508483612cfc565b915050949350505050565b600f82805160208101820180518482526020830160208501208183528095505050505050602052805f5260405f205f915091509054906101000a900460ff1681565b5f611022612d12565b6001545f540303905090565b611036612d16565b5f801b600b8360405161104991906148d0565b9081526020016040518091039020600301540361109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290614ab2565b60405180910390fd5b80600b836040516110ac91906148d0565b9081526020016040518091039020600301819055505050565b6010602052805f5260405f205f915054906101000a900460ff1681565b5f6110ec82612d94565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611153576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8061115e84612e57565b91509150611174818761116f612cf5565b612e7a565b6111c05761118986611184612cf5565b612b53565b6111bf576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611225576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112328686866001612ebd565b801561123c575f82555b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815460010191905081905550611304856112e0888887612ec3565b7c020000000000000000000000000000000000000000000000000000000017612eea565b60045f8681526020019081526020015f20819055505f7c0200000000000000000000000000000000000000000000000000000000841603611380575f6001850190505f60045f8381526020019081526020015f20540361137e575f54811461137d578360045f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113e88686866001612f14565b505050505050565b6113f8612d16565b5f801b600b8360405161140b91906148d0565b9081526020016040518091039020600301540361145d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145490614b1a565b60405180910390fd5b80600b8360405161146e91906148d0565b9081526020016040518091039020600201819055505050565b5f805f805f805f600f8960405161149e91906148d0565b90815260200160405180910390205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050600d5f9054906101000a900460ff16600281111561151757611516613ee5565b5b600b8a60405161152791906148d0565b90815260200160405180910390205f015f9054906101000a900460ff16600b8b60405161155491906148d0565b908152602001604051809103902060020154600b8c60405161157691906148d0565b908152602001604051809103902060010154600c8d60405161159891906148d0565b90815260200160405180910390205485965096509650965096509650509295509295509295565b6115c7612d16565b8060ff1660028111156115dd576115dc613ee5565b5b600d5f6101000a81548160ff02191690836002811115611600576115ff613ee5565b5b0217905550600d5f9054906101000a900460ff16600281111561162657611625613ee5565b5b60ff16423373ffffffffffffffffffffffffffffffffffffffff167f7d7f6ed6d84cc6a4531c22effb48bb76d643459a9d3398dab7ddb04f6fb01ebc60405160405180910390a450565b611678612d16565b5f801b600b8360405161168b91906148d0565b908152602001604051809103902060030154036116dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d490614b1a565b60405180910390fd5b80600b836040516116ee91906148d0565b90815260200160405180910390205f015f6101000a81548160ff021916908360ff1602179055505050565b61173383838360405180602001604052805f815250612612565b505050565b611740612d16565b5f6040518060a001604052808760ff1681526020018660ff16815260200185815260200184815260200183815250905080600b8860405161178191906148d0565b90815260200160405180910390205f820151815f015f6101000a81548160ff021916908360ff1602179055506020820151815f0160016101000a81548160ff021916908360ff16021790555060408201518160010155606082015181600201556080820151816003015590505050505050505050565b6117ff612f1a565b611807612f69565b6001600281111561181b5761181a613ee5565b5b600d5f9054906101000a900460ff16600281111561183c5761183b613ee5565b5b1461187c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187390614b82565b60405180910390fd5b5f6040518060400160405280600281526020017f574c00000000000000000000000000000000000000000000000000000000000081525090505f6118e3338585600b866040516118cc91906148d0565b908152602001604051809103902060030154610f56565b611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191990614c10565b60405180910390fd5b600b8260405161193291906148d0565b9081526020016040518091039020600101548560ff16600c8460405161195891906148d0565b9081526020016040518091039020546119719190614c5b565b11156119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a990614cfe565b60405180910390fd5b600b826040516119c291906148d0565b90815260200160405180910390205f015f9054906101000a900460ff1660ff168560ff161115611a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1e90614d8c565b60405180910390fd5b600b82604051611a3791906148d0565b90815260200160405180910390205f015f9054906101000a900460ff1660ff1685600f84604051611a6891906148d0565b90815260200160405180910390205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611ac89190614daa565b60ff161115611b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0390614e74565b60405180910390fd5b5f60105f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1660ff161115611bda578460ff16600b83604051611b7491906148d0565b908152602001604051809103902060020154611b909190614e92565b905080341015611bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcc90614f43565b60405180910390fd5b611d8a565b60018560ff1603611c78575f60105f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1660ff1614611c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6a90614f43565b60405180910390fd5b611d33565b60018560ff161115611d3257600b82604051611c9491906148d0565b90815260200160405180910390205f0160019054906101000a900460ff1685611cbd9190614f61565b60ff16600b83604051611cd091906148d0565b908152602001604051809103902060020154611cec9190614e92565b905080341015611d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2890614f43565b60405180910390fd5b5b5b600160105f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908360ff1602179055505b611d92612423565b73ffffffffffffffffffffffffffffffffffffffff166108fc3490811502906040515f60405180830381858888f19350505050158015611dd4573d5f803e3d5ffd5b50611de0828683612fb3565b5050611dea613214565b505050565b5f600860149054906101000a900460ff16905090565b60118181548110611e14575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f611e4a82612d94565b9050919050565b611e59612d16565b80600a8190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ec9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b611f20612d16565b611f295f61321e565b565b5f600b604051611f3a90614998565b90815260200160405180910390205f015f9054906101000a900460ff16905090565b611f64612d16565b8060139080519060200190611f7a929190613a73565b5050565b611f86612d16565b5f801b600b83604051611f9991906148d0565b90815260200160405180910390206003015403611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe290614b1a565b60405180910390fd5b80600b83604051611ffc91906148d0565b90815260200160405180910390205f0160016101000a81548160ff021916908360ff1602179055505050565b612030612d16565b612038612f69565b6120406132e1565b565b61204a612f1a565b612052612f69565b5f600281111561206557612064613ee5565b5b600d5f9054906101000a900460ff16600281111561208657612085613ee5565b5b036120c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bd90614b82565b60405180910390fd5b5f6040518060400160405280600681526020017f5055424c494300000000000000000000000000000000000000000000000000008152509050600b8160405161210f91906148d0565b90815260200160405180910390205f015f9054906101000a900460ff1660ff168260ff161115612174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216b90614d8c565b60405180910390fd5b600b8160405161218491906148d0565b90815260200160405180910390205f015f9054906101000a900460ff1660ff1682600f836040516121b591906148d0565b90815260200160405180910390205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166122159190614daa565b60ff161115612259576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225090614e74565b60405180910390fd5b6001600281111561226d5761226c613ee5565b5b600d5f9054906101000a900460ff16600281111561228e5761228d613ee5565b5b0361232457600b816040516122a391906148d0565b9081526020016040518091039020600101548260ff16600c836040516122c991906148d0565b9081526020016040518091039020546122e29190614c5b565b1115612323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231a90614cfe565b60405180910390fd5b5b5f8260ff16600b8360405161233991906148d0565b9081526020016040518091039020600201546123559190614e92565b90508034101561239a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239190614f43565b60405180910390fd5b6123a2612423565b73ffffffffffffffffffffffffffffffffffffffff166108fc3490811502906040515f60405180830381858888f193505050501580156123e4573d5f803e3d5ffd5b506123f0828483612fb3565b50506123fa613214565b50565b5f600b60405161240c90614fdf565b908152602001604051809103902060020154905090565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461245a906149d9565b80601f0160208091040260200160405190810160405280929190818152602001828054612486906149d9565b80156124d15780601f106124a8576101008083540402835291602001916124d1565b820191905f5260205f20905b8154815290600101906020018083116124b457829003601f168201915b5050505050905090565b8060075f6124e7612cf5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612590612cf5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125d59190613df0565b60405180910390a35050565b5f600b6040516125f090614fdf565b90815260200160405180910390205f015f9054906101000a900460ff16905090565b61261d8484846110e2565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1461267e5761264784848484613344565b61267d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061268f82612c9b565b6126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c590615063565b60405180910390fd5b60145f9054906101000a900460ff16156127145760126126ed8361348f565b6040516020016126fe92919061515d565b60405160208183030381529060405290506127cf565b5f6013805490508361272691906151b8565b90506013818154811061273c5761273b6151e8565b5b905f5260205f2001805461274f906149d9565b80601f016020809104026020016040519081016040528092919081815260200182805461277b906149d9565b80156127c65780601f1061279d576101008083540402835291602001916127c6565b820191905f5260205f20905b8154815290600101906020018083116127a957829003601f168201915b50505050509150505b919050565b6127dc612d16565b5f801b600b836040516127ef91906148d0565b90815260200160405180910390206003015403612841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283890614b1a565b60405180910390fd5b80600b8360405161285291906148d0565b9081526020016040518091039020600101819055505050565b600a5481565b612879612d16565b5f801b600b8760405161288c91906148d0565b908152602001604051809103902060030154036128de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d590614b1a565b60405180910390fd5b5f6040518060a001604052808760ff1681526020018660ff16815260200185815260200184815260200183815250905080600b8860405161291f91906148d0565b90815260200160405180910390205f820151815f015f6101000a81548160ff021916908360ff1602179055506020820151815f0160016101000a81548160ff021916908360ff16021790555060408201518160010155606082015181600201556080820151816003015590505050505050505050565b61299d612d16565b8060145f6101000a81548160ff02191690831515021790555081601290816129c591906153a0565b5060145f9054906101000a900460ff1615612a1e573373ffffffffffffffffffffffffffffffffffffffff167f2a10c355cd3f8130b128e45782d3e92e6c0b4ba2e844d06f49a48ee23f1f21f760405160405180910390a25b5050565b612a2a612d16565b600a548160ff16612a39613559565b612a439190614c5b565b1115612a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7b906154b9565b60405180910390fd5b612a91338260ff1661356a565b3373ffffffffffffffffffffffffffffffffffffffff167fc06d53176829f80e4279d4c047b74872abc9e10a4c210a24abff21de3d077740825f604051612ad9929190615510565b60405180910390a250565b5f600f604051612af390614fdf565b90815260200160405180910390205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1660ff169050919050565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f600b604051612bf090614998565b908152602001604051809103902060020154905090565b612c0f612d16565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c74906155a7565b60405180910390fd5b612c868161321e565b50565b612c91612d16565b612c99613587565b565b5f81612ca5612d12565b11158015612cb357505f5482105b8015612cee57505f7c010000000000000000000000000000000000000000000000000000000060045f8581526020019081526020015f205416145b9050919050565b5f33905090565b5f82612d0885846135e9565b1490509392505050565b5f90565b612d1e61363d565b73ffffffffffffffffffffffffffffffffffffffff16612d3c612423565b73ffffffffffffffffffffffffffffffffffffffff1614612d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d899061560f565b60405180910390fd5b565b5f8082905080612da2612d12565b11612e20575f54811015612e1f575f60045f8381526020019081526020015f205490505f7c0100000000000000000000000000000000000000000000000000000000821603612e1d575b5f8103612e135760045f836001900393508381526020019081526020015f20549050612dec565b8092505050612e52565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f60065f8581526020019081526020015f2090508092508254915050915091565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b5f8060e883901c905060e8612ed9868684613644565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600260095403612f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5690615677565b60405180910390fd5b6002600981905550565b612f71611def565b15612fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa8906156df565b60405180910390fd5b565b600a548260ff16612fc2613559565b612fcc9190614c5b565b111561300d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300490615747565b60405180910390fd5b5f8260ff1611613052576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613049906157d5565b60405180910390fd5b61305f338360ff1661356a565b8160ff16600c8460405161307391906148d0565b90815260200160405180910390205f82825461308f9190614c5b565b9250508190555081600f846040516130a791906148d0565b90815260200160405180910390205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282829054906101000a900460ff1661310a9190614daa565b92506101000a81548160ff021916908360ff160217905550601133908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff167fc06d53176829f80e4279d4c047b74872abc9e10a4c210a24abff21de3d07774083836040516131ca9291906157f3565b60405180910390a2600a546131dd613559565b1061320f577f52df9fe5b9c9a7b0b4fdc2c9f89387959e35e4209c2a8d133a2b8165edad2a0460405160405180910390a15b505050565b6001600981905550565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6132e9612f69565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861332d61363d565b60405161333a919061406f565b60405180910390a1565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613369612cf5565b8786866040518563ffffffff1660e01b815260040161338b949392919061586c565b6020604051808303815f875af19250505080156133c657506040513d601f19601f820116820180604052508101906133c391906158ca565b60015b61343c573d805f81146133f4576040519150601f19603f3d011682016040523d82523d5f602084013e6133f9565b606091505b505f815103613434576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60605f600161349d8461364c565b0190505f8167ffffffffffffffff8111156134bb576134ba613b6e565b5b6040519080825280601f01601f1916602001820160405280156134ed5781602001600182028036833780820191505090505b5090505f82602001820190505b60011561354e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816135435761354261518b565b5b0494505f85036134fa575b819350505050919050565b5f613562612d12565b5f5403905090565b613583828260405180602001604052805f81525061379d565b5050565b61358f613834565b5f600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6135d261363d565b6040516135df919061406f565b60405180910390a1565b5f808290505f5b84518110156136325761361d828683815181106136105761360f6151e8565b5b602002602001015161387d565b9150808061362a906158f5565b9150506135f0565b508091505092915050565b5f33905090565b5f9392505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106136a8577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161369e5761369d61518b565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106136e5576d04ee2d6d415b85acef810000000083816136db576136da61518b565b5b0492506020810190505b662386f26fc10000831061371457662386f26fc10000838161370a5761370961518b565b5b0492506010810190505b6305f5e100831061373d576305f5e10083816137335761373261518b565b5b0492506008810190505b61271083106137625761271083816137585761375761518b565b5b0492506004810190505b60648310613785576064838161377b5761377a61518b565b5b0492506002810190505b600a8310613794576001810190505b80915050919050565b6137a783836138a7565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1461382f575f805490505f83820390505b6137e35f868380600101945086613344565b613819576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106137d157815f541461382c575f80fd5b50505b505050565b61383c611def565b61387b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161387290615986565b60405180910390fd5b565b5f8183106138945761388f8284613a50565b61389f565b61389e8383613a50565b5b905092915050565b5f805490505f82036138e5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6138f15f848385612ebd565b600160406001901b17820260055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550613963836139545f865f612ec3565b61395d85613a64565b17612eea565b60045f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b8181146139fd5780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a46001810190506139c4565b505f8203613a37576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819055505050613a4b5f848385612f14565b505050565b5f825f528160205260405f20905092915050565b5f6001821460e11b9050919050565b828054828255905f5260205f20908101928215613ab9579160200282015b82811115613ab8578251829081613aa891906153a0565b5091602001919060010190613a91565b5b509050613ac69190613aca565b5090565b5b80821115613ae9575f8181613ae09190613aed565b50600101613acb565b5090565b508054613af9906149d9565b5f825580601f10613b0a5750613b27565b601f0160209004905f5260205f2090810190613b269190613b2a565b5b50565b5b80821115613b41575f815f905550600101613b2b565b5090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613ba482613b5e565b810181811067ffffffffffffffff82111715613bc357613bc2613b6e565b5b80604052505050565b5f613bd5613b45565b9050613be18282613b9b565b919050565b5f67ffffffffffffffff821115613c0057613bff613b6e565b5b613c0982613b5e565b9050602081019050919050565b828183375f83830152505050565b5f613c36613c3184613be6565b613bcc565b905082815260208101848484011115613c5257613c51613b5a565b5b613c5d848285613c16565b509392505050565b5f82601f830112613c7957613c78613b56565b5b8135613c89848260208601613c24565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613cbb82613c92565b9050919050565b613ccb81613cb1565b8114613cd5575f80fd5b50565b5f81359050613ce681613cc2565b92915050565b5f80fd5b5f80fd5b5f8083601f840112613d0957613d08613b56565b5b8235905067ffffffffffffffff811115613d2657613d25613cec565b5b602083019150836020820283011115613d4257613d41613cf0565b5b9250929050565b5f805f8060608587031215613d6157613d60613b4e565b5b5f85013567ffffffffffffffff811115613d7e57613d7d613b52565b5b613d8a87828801613c65565b9450506020613d9b87828801613cd8565b935050604085013567ffffffffffffffff811115613dbc57613dbb613b52565b5b613dc887828801613cf4565b925092505092959194509250565b5f8115159050919050565b613dea81613dd6565b82525050565b5f602082019050613e035f830184613de1565b92915050565b5f60208284031215613e1e57613e1d613b4e565b5b5f613e2b84828501613cd8565b91505092915050565b5f819050919050565b613e4681613e34565b82525050565b5f602082019050613e5f5f830184613e3d565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613e9981613e65565b8114613ea3575f80fd5b50565b5f81359050613eb481613e90565b92915050565b5f60208284031215613ecf57613ece613b4e565b5b5f613edc84828501613ea6565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60038110613f2357613f22613ee5565b5b50565b5f819050613f3382613f12565b919050565b5f613f4282613f26565b9050919050565b613f5281613f38565b82525050565b5f602082019050613f6b5f830184613f49565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613fa8578082015181840152602081019050613f8d565b5f8484015250505050565b5f613fbd82613f71565b613fc78185613f7b565b9350613fd7818560208601613f8b565b613fe081613b5e565b840191505092915050565b5f6020820190508181035f8301526140038184613fb3565b905092915050565b61401481613e34565b811461401e575f80fd5b50565b5f8135905061402f8161400b565b92915050565b5f6020828403121561404a57614049613b4e565b5b5f61405784828501614021565b91505092915050565b61406981613cb1565b82525050565b5f6020820190506140825f830184614060565b92915050565b5f806040838503121561409e5761409d613b4e565b5b5f6140ab85828601613cd8565b92505060206140bc85828601614021565b9150509250929050565b5f602082840312156140db576140da613b4e565b5b5f82013567ffffffffffffffff8111156140f8576140f7613b52565b5b61410484828501613c65565b91505092915050565b5f819050919050565b61411f8161410d565b8114614129575f80fd5b50565b5f8135905061413a81614116565b92915050565b5f805f806060858703121561415857614157613b4e565b5b5f61416587828801613cd8565b945050602085013567ffffffffffffffff81111561418657614185613b52565b5b61419287828801613cf4565b935093505060406141a58782880161412c565b91505092959194509250565b5f80604083850312156141c7576141c6613b4e565b5b5f83013567ffffffffffffffff8111156141e4576141e3613b52565b5b6141f085828601613c65565b925050602061420185828601613cd8565b9150509250929050565b5f60ff82169050919050565b6142208161420b565b82525050565b5f6020820190506142395f830184614217565b92915050565b5f806040838503121561425557614254613b4e565b5b5f83013567ffffffffffffffff81111561427257614271613b52565b5b61427e85828601613c65565b925050602061428f8582860161412c565b9150509250929050565b5f805f606084860312156142b0576142af613b4e565b5b5f6142bd86828701613cd8565b93505060206142ce86828701613cd8565b92505060406142df86828701614021565b9150509250925092565b5f80604083850312156142ff576142fe613b4e565b5b5f83013567ffffffffffffffff81111561431c5761431b613b52565b5b61432885828601613c65565b925050602061433985828601614021565b9150509250929050565b5f60c0820190506143565f830189614217565b6143636020830188614217565b6143706040830187613e3d565b61437d6060830186613e3d565b61438a6080830185613e3d565b61439760a0830184614217565b979650505050505050565b6143ab8161420b565b81146143b5575f80fd5b50565b5f813590506143c6816143a2565b92915050565b5f602082840312156143e1576143e0613b4e565b5b5f6143ee848285016143b8565b91505092915050565b5f806040838503121561440d5761440c613b4e565b5b5f83013567ffffffffffffffff81111561442a57614429613b52565b5b61443685828601613c65565b9250506020614447858286016143b8565b9150509250929050565b5f805f805f8060c0878903121561446b5761446a613b4e565b5b5f87013567ffffffffffffffff81111561448857614487613b52565b5b61449489828a01613c65565b96505060206144a589828a016143b8565b95505060406144b689828a016143b8565b94505060606144c789828a01614021565b93505060806144d889828a01614021565b92505060a06144e989828a0161412c565b9150509295509295509295565b5f805f6040848603121561450d5761450c613b4e565b5b5f61451a868287016143b8565b935050602084013567ffffffffffffffff81111561453b5761453a613b52565b5b61454786828701613cf4565b92509250509250925092565b5f67ffffffffffffffff82111561456d5761456c613b6e565b5b602082029050602081019050919050565b5f61459061458b84614553565b613bcc565b905080838252602082019050602084028301858111156145b3576145b2613cf0565b5b835b818110156145fa57803567ffffffffffffffff8111156145d8576145d7613b56565b5b8086016145e58982613c65565b855260208501945050506020810190506145b5565b5050509392505050565b5f82601f83011261461857614617613b56565b5b813561462884826020860161457e565b91505092915050565b5f6020828403121561464657614645613b4e565b5b5f82013567ffffffffffffffff81111561466357614662613b52565b5b61466f84828501614604565b91505092915050565b61468181613dd6565b811461468b575f80fd5b50565b5f8135905061469c81614678565b92915050565b5f80604083850312156146b8576146b7613b4e565b5b5f6146c585828601613cd8565b92505060206146d68582860161468e565b9150509250929050565b5f67ffffffffffffffff8211156146fa576146f9613b6e565b5b61470382613b5e565b9050602081019050919050565b5f61472261471d846146e0565b613bcc565b90508281526020810184848401111561473e5761473d613b5a565b5b614749848285613c16565b509392505050565b5f82601f83011261476557614764613b56565b5b8135614775848260208601614710565b91505092915050565b5f805f806080858703121561479657614795613b4e565b5b5f6147a387828801613cd8565b94505060206147b487828801613cd8565b93505060406147c587828801614021565b925050606085013567ffffffffffffffff8111156147e6576147e5613b52565b5b6147f287828801614751565b91505092959194509250565b5f806040838503121561481457614813613b4e565b5b5f83013567ffffffffffffffff81111561483157614830613b52565b5b61483d85828601613c65565b925050602061484e8582860161468e565b9150509250929050565b5f806040838503121561486e5761486d613b4e565b5b5f61487b85828601613cd8565b925050602061488c85828601613cd8565b9150509250929050565b5f81905092915050565b5f6148aa82613f71565b6148b48185614896565b93506148c4818560208601613f8b565b80840191505092915050565b5f6148db82846148a0565b915081905092915050565b7f4552524f523a204d696e7465722054797065206e6f7420666f756e642e0000005f82015250565b5f61491a601d83613f7b565b9150614925826148e6565b602082019050919050565b5f6020820190508181035f8301526149478161490e565b9050919050565b7f574c0000000000000000000000000000000000000000000000000000000000005f82015250565b5f614982600283614896565b915061498d8261494e565b600282019050919050565b5f6149a282614976565b9150819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806149f057607f821691505b602082108103614a0357614a026149ac565b5b50919050565b5f8160601b9050919050565b5f614a1f82614a09565b9050919050565b5f614a3082614a15565b9050919050565b614a48614a4382613cb1565b614a26565b82525050565b5f614a598284614a37565b60148201915081905092915050565b7f4552524f523a204d696e74657273496e666f206e6f7420666f756e642e0000005f82015250565b5f614a9c601d83613f7b565b9150614aa782614a68565b602082019050919050565b5f6020820190508181035f830152614ac981614a90565b9050919050565b7f4d696e74657273496e666f206e6f7420666f756e642e000000000000000000005f82015250565b5f614b04601683613f7b565b9150614b0f82614ad0565b602082019050919050565b5f6020820190508181035f830152614b3181614af8565b9050919050565b7f4552524f523a204d696e74206973206e6f74206163746976652e0000000000005f82015250565b5f614b6c601a83613f7b565b9150614b7782614b38565b602082019050919050565b5f6020820190508181035f830152614b9981614b60565b9050919050565b7f4552524f523a20596f7520617265206e6f7420616c6c6f77656420746f206d695f8201527f6e74206f6e20746869732070686173652e000000000000000000000000000000602082015250565b5f614bfa603183613f7b565b9150614c0582614ba0565b604082019050919050565b5f6020820190508181035f830152614c2781614bee565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614c6582613e34565b9150614c7083613e34565b9250828201905080821115614c8857614c87614c2e565b5b92915050565b7f4552524f523a204d6178696d756d206e756d626572206f66206d696e7473206f5f8201527f6e207468697320706861736520686173206265656e2072656163686564000000602082015250565b5f614ce8603d83613f7b565b9150614cf382614c8e565b604082019050919050565b5f6020820190508181035f830152614d1581614cdc565b9050919050565b7f4552524f523a204d6178696d756d206e756d626572206f66206d696e747320705f8201527f6572207472616e73616374696f6e206578636565646564000000000000000000602082015250565b5f614d76603783613f7b565b9150614d8182614d1c565b604082019050919050565b5f6020820190508181035f830152614da381614d6a565b9050919050565b5f614db48261420b565b9150614dbf8361420b565b9250828201905060ff811115614dd857614dd7614c2e565b5b92915050565b7f4552524f523a20596f7572206d6178696d756d204e4654206d696e74207065725f8201527f2077616c6c6574206f6e207468697320706861736520686173206265656e207260208201527f6561636865642e00000000000000000000000000000000000000000000000000604082015250565b5f614e5e604783613f7b565b9150614e6982614dde565b606082019050919050565b5f6020820190508181035f830152614e8b81614e52565b9050919050565b5f614e9c82613e34565b9150614ea783613e34565b9250828202614eb581613e34565b91508282048414831517614ecc57614ecb614c2e565b5b5092915050565b7f4552524f523a20596f7520646f206e6f74206861766520656e6f7567682066755f8201527f6e647320746f206d696e742e0000000000000000000000000000000000000000602082015250565b5f614f2d602c83613f7b565b9150614f3882614ed3565b604082019050919050565b5f6020820190508181035f830152614f5a81614f21565b9050919050565b5f614f6b8261420b565b9150614f768361420b565b9250828203905060ff811115614f8f57614f8e614c2e565b5b92915050565b7f5055424c494300000000000000000000000000000000000000000000000000005f82015250565b5f614fc9600683614896565b9150614fd482614f95565b600682019050919050565b5f614fe982614fbd565b9150819050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f61504d602f83613f7b565b915061505882614ff3565b604082019050919050565b5f6020820190508181035f83015261507a81615041565b9050919050565b5f819050815f5260205f209050919050565b5f815461509f816149d9565b6150a98186614896565b9450600182165f81146150c357600181146150d85761510a565b60ff198316865281151582028601935061510a565b6150e185615081565b5f5b83811015615102578154818901526001820191506020810190506150e3565b838801955050505b50505092915050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f615147600583614896565b915061515282615113565b600582019050919050565b5f6151688285615093565b915061517482846148a0565b915061517f8261513b565b91508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6151c282613e34565b91506151cd83613e34565b9250826151dd576151dc61518b565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261525f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615224565b6152698683615224565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6152a461529f61529a84613e34565b615281565b613e34565b9050919050565b5f819050919050565b6152bd8361528a565b6152d16152c9826152ab565b848454615230565b825550505050565b5f90565b6152e56152d9565b6152f08184846152b4565b505050565b5b81811015615313576153085f826152dd565b6001810190506152f6565b5050565b601f8211156153585761532981615081565b61533284615215565b81016020851015615341578190505b61535561534d85615215565b8301826152f5565b50505b505050565b5f82821c905092915050565b5f6153785f198460080261535d565b1980831691505092915050565b5f6153908383615369565b9150826002028217905092915050565b6153a982613f71565b67ffffffffffffffff8111156153c2576153c1613b6e565b5b6153cc82546149d9565b6153d7828285615317565b5f60209050601f831160018114615408575f84156153f6578287015190505b6154008582615385565b865550615467565b601f19841661541686615081565b5f5b8281101561543d57848901518255600182019150602085019450602081019050615418565b8683101561545a5784890151615456601f891682615369565b8355505b6001600288020188555050505b505050505050565b7f4552524f523a204e6f7420656e6f75676820746f6b656e7300000000000000005f82015250565b5f6154a3601883613f7b565b91506154ae8261546f565b602082019050919050565b5f6020820190508181035f8301526154d081615497565b9050919050565b5f819050919050565b5f6154fa6154f56154f0846154d7565b615281565b613e34565b9050919050565b61550a816154e0565b82525050565b5f6040820190506155235f830185614217565b6155306020830184615501565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f615591602683613f7b565b915061559c82615537565b604082019050919050565b5f6020820190508181035f8301526155be81615585565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6155f9602083613f7b565b9150615604826155c5565b602082019050919050565b5f6020820190508181035f830152615626816155ed565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f615661601f83613f7b565b915061566c8261562d565b602082019050919050565b5f6020820190508181035f83015261568e81615655565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f6156c9601083613f7b565b91506156d482615695565b602082019050919050565b5f6020820190508181035f8301526156f6816156bd565b9050919050565b7f4552524f523a204e6f20746f6b656e73206c65667420746f206d696e740000005f82015250565b5f615731601d83613f7b565b915061573c826156fd565b602082019050919050565b5f6020820190508181035f83015261575e81615725565b9050919050565b7f4552524f523a204e756d626572206f6620746f6b656e732073686f756c6420625f8201527f652067726561746572207468616e207a65726f00000000000000000000000000602082015250565b5f6157bf603383613f7b565b91506157ca82615765565b604082019050919050565b5f6020820190508181035f8301526157ec816157b3565b9050919050565b5f6040820190506158065f830185614217565b6158136020830184613e3d565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f61583e8261581a565b6158488185615824565b9350615858818560208601613f8b565b61586181613b5e565b840191505092915050565b5f60808201905061587f5f830187614060565b61588c6020830186614060565b6158996040830185613e3d565b81810360608301526158ab8184615834565b905095945050505050565b5f815190506158c481613e90565b92915050565b5f602082840312156158df576158de613b4e565b5b5f6158ec848285016158b6565b91505092915050565b5f6158ff82613e34565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361593157615930614c2e565b5b600182019050919050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f615970601483613f7b565b915061597b8261593c565b602082019050919050565b5f6020820190508181035f83015261599d81615964565b905091905056fea264697066735822122015eb023ad3733e3f606f1a0b181ee462c5baebdccae5dbec8946121fd11a113c64736f6c63430008140033

Deployed Bytecode

0x6080604052600436106102ac575f3560e01c80636f8b44b011610174578063ad5a6dc5116100db578063e1c6780511610094578063e985e9c51161006e578063e985e9c514610a7d578063ed7c7fe814610ab9578063f2fde38b14610ae3578063f7b188a514610b0b576102ac565b8063e1c67805146109f1578063e7d9793714610a19578063e85ada7214610a41576102ac565b8063ad5a6dc5146108f5578063b88d4fde1461091f578063c87b56dd1461093b578063cf7c0b4914610977578063d5abeb011461099f578063d89a7574146109c9576102ac565b80638456cb591161012d5780638456cb591461081d578063858e83b5146108335780638a4d367b1461084f5780638da5cb5b1461087957806395d89b41146108a3578063a22cb465146108cd576102ac565b80636f8b44b01461072957806370a0823114610751578063715018a61461078d578063733428bf146107a3578063792a873e146107cd5780637e454447146107f5576102ac565b8063209848011161021857806342842e0e116101d157806342842e0e1461062757806347d4f57814610643578063583816691461066b5780635c975abb146106875780636107896e146106b15780636352211e146106ed576102ac565b8063209848011461051657806323b872dd14610552578063293227ab1461056e5780632b5619a41461059657806331c07bbf146105d7578063411d1be5146105ff576102ac565b8063095ea7b31161026a578063095ea7b3146103f457806309945734146104105780630e6f52721461044c57806315587fc31461048857806318160ddd146104c4578063189b83bd146104ee576102ac565b8062377580146102b057806301c392f0146102ec57806301ffc9a714610328578063055ad42e1461036457806306fdde031461038e578063081812fc146103b8575b5f80fd5b3480156102bb575f80fd5b506102d660048036038101906102d19190613d49565b610b21565b6040516102e39190613df0565b60405180910390f35b3480156102f7575f80fd5b50610312600480360381019061030d9190613e09565b610bce565b60405161031f9190613e4c565b60405180910390f35b348015610333575f80fd5b5061034e60048036038101906103499190613eba565b610c3d565b60405161035b9190613df0565b60405180910390f35b34801561036f575f80fd5b50610378610cce565b6040516103859190613f58565b60405180910390f35b348015610399575f80fd5b506103a2610ce0565b6040516103af9190613feb565b60405180910390f35b3480156103c3575f80fd5b506103de60048036038101906103d99190614035565b610d70565b6040516103eb919061406f565b60405180910390f35b61040e60048036038101906104099190614088565b610dea565b005b34801561041b575f80fd5b50610436600480360381019061043191906140c6565b610f29565b6040516104439190613e4c565b60405180910390f35b348015610457575f80fd5b50610472600480360381019061046d9190614140565b610f56565b60405161047f9190613df0565b60405180910390f35b348015610493575f80fd5b506104ae60048036038101906104a991906141b1565b610fd7565b6040516104bb9190614226565b60405180910390f35b3480156104cf575f80fd5b506104d8611019565b6040516104e59190613e4c565b60405180910390f35b3480156104f9575f80fd5b50610514600480360381019061050f919061423f565b61102e565b005b348015610521575f80fd5b5061053c60048036038101906105379190613e09565b6110c5565b6040516105499190614226565b60405180910390f35b61056c60048036038101906105679190614299565b6110e2565b005b348015610579575f80fd5b50610594600480360381019061058f91906142e9565b6113f0565b005b3480156105a1575f80fd5b506105bc60048036038101906105b791906141b1565b611487565b6040516105ce96959493929190614343565b60405180910390f35b3480156105e2575f80fd5b506105fd60048036038101906105f891906143cc565b6115bf565b005b34801561060a575f80fd5b50610625600480360381019061062091906143f7565b611670565b005b610641600480360381019061063c9190614299565b611719565b005b34801561064e575f80fd5b5061066960048036038101906106649190614451565b611738565b005b610685600480360381019061068091906144f6565b6117f7565b005b348015610692575f80fd5b5061069b611def565b6040516106a89190613df0565b60405180910390f35b3480156106bc575f80fd5b506106d760048036038101906106d29190614035565b611e05565b6040516106e4919061406f565b60405180910390f35b3480156106f8575f80fd5b50610713600480360381019061070e9190614035565b611e40565b604051610720919061406f565b60405180910390f35b348015610734575f80fd5b5061074f600480360381019061074a9190614035565b611e51565b005b34801561075c575f80fd5b5061077760048036038101906107729190613e09565b611e63565b6040516107849190613e4c565b60405180910390f35b348015610798575f80fd5b506107a1611f18565b005b3480156107ae575f80fd5b506107b7611f2b565b6040516107c49190614226565b60405180910390f35b3480156107d8575f80fd5b506107f360048036038101906107ee9190614631565b611f5c565b005b348015610800575f80fd5b5061081b600480360381019061081691906143f7565b611f7e565b005b348015610828575f80fd5b50610831612028565b005b61084d600480360381019061084891906143cc565b612042565b005b34801561085a575f80fd5b506108636123fd565b6040516108709190613e4c565b60405180910390f35b348015610884575f80fd5b5061088d612423565b60405161089a919061406f565b60405180910390f35b3480156108ae575f80fd5b506108b761244b565b6040516108c49190613feb565b60405180910390f35b3480156108d8575f80fd5b506108f360048036038101906108ee91906146a2565b6124db565b005b348015610900575f80fd5b506109096125e1565b6040516109169190614226565b60405180910390f35b6109396004803603810190610934919061477e565b612612565b005b348015610946575f80fd5b50610961600480360381019061095c9190614035565b612684565b60405161096e9190613feb565b60405180910390f35b348015610982575f80fd5b5061099d600480360381019061099891906142e9565b6127d4565b005b3480156109aa575f80fd5b506109b361286b565b6040516109c09190613e4c565b60405180910390f35b3480156109d4575f80fd5b506109ef60048036038101906109ea9190614451565b612871565b005b3480156109fc575f80fd5b50610a176004803603810190610a1291906147fe565b612995565b005b348015610a24575f80fd5b50610a3f6004803603810190610a3a91906143cc565b612a22565b005b348015610a4c575f80fd5b50610a676004803603810190610a629190613e09565b612ae4565b604051610a749190613e4c565b60405180910390f35b348015610a88575f80fd5b50610aa36004803603810190610a9e9190614858565b612b53565b604051610ab09190613df0565b60405180910390f35b348015610ac4575f80fd5b50610acd612be1565b604051610ada9190613e4c565b60405180910390f35b348015610aee575f80fd5b50610b096004803603810190610b049190613e09565b612c07565b005b348015610b16575f80fd5b50610b1f612c89565b005b5f805f1b600b86604051610b3591906148d0565b90815260200160405180910390206003015403610b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7e90614930565b60405180910390fd5b610bb4848484600b89604051610b9d91906148d0565b908152602001604051809103902060030154610f56565b15610bc25760019050610bc6565b5f90505b949350505050565b5f600f604051610bdd90614998565b90815260200160405180910390205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1660ff169050919050565b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c9757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cc75750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600d5f9054906101000a900460ff1681565b606060028054610cef906149d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1b906149d9565b8015610d665780601f10610d3d57610100808354040283529160200191610d66565b820191905f5260205f20905b815481529060010190602001808311610d4957829003601f168201915b5050505050905090565b5f610d7a82612c9b565b610db0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610df482611e40565b90508073ffffffffffffffffffffffffffffffffffffffff16610e15612cf5565b73ffffffffffffffffffffffffffffffffffffffff1614610e7857610e4181610e3c612cf5565b612b53565b610e77576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260065f8481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600c818051602081018201805184825260208301602085012081835280955050505050505f915090505481565b5f8085604051602001610f699190614a4e565b604051602081830303815290604052805190602001209050610fcc8585808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f820116905080830192505050505050508483612cfc565b915050949350505050565b600f82805160208101820180518482526020830160208501208183528095505050505050602052805f5260405f205f915091509054906101000a900460ff1681565b5f611022612d12565b6001545f540303905090565b611036612d16565b5f801b600b8360405161104991906148d0565b9081526020016040518091039020600301540361109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290614ab2565b60405180910390fd5b80600b836040516110ac91906148d0565b9081526020016040518091039020600301819055505050565b6010602052805f5260405f205f915054906101000a900460ff1681565b5f6110ec82612d94565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611153576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8061115e84612e57565b91509150611174818761116f612cf5565b612e7a565b6111c05761118986611184612cf5565b612b53565b6111bf576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611225576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112328686866001612ebd565b801561123c575f82555b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815460010191905081905550611304856112e0888887612ec3565b7c020000000000000000000000000000000000000000000000000000000017612eea565b60045f8681526020019081526020015f20819055505f7c0200000000000000000000000000000000000000000000000000000000841603611380575f6001850190505f60045f8381526020019081526020015f20540361137e575f54811461137d578360045f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46113e88686866001612f14565b505050505050565b6113f8612d16565b5f801b600b8360405161140b91906148d0565b9081526020016040518091039020600301540361145d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145490614b1a565b60405180910390fd5b80600b8360405161146e91906148d0565b9081526020016040518091039020600201819055505050565b5f805f805f805f600f8960405161149e91906148d0565b90815260200160405180910390205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050600d5f9054906101000a900460ff16600281111561151757611516613ee5565b5b600b8a60405161152791906148d0565b90815260200160405180910390205f015f9054906101000a900460ff16600b8b60405161155491906148d0565b908152602001604051809103902060020154600b8c60405161157691906148d0565b908152602001604051809103902060010154600c8d60405161159891906148d0565b90815260200160405180910390205485965096509650965096509650509295509295509295565b6115c7612d16565b8060ff1660028111156115dd576115dc613ee5565b5b600d5f6101000a81548160ff02191690836002811115611600576115ff613ee5565b5b0217905550600d5f9054906101000a900460ff16600281111561162657611625613ee5565b5b60ff16423373ffffffffffffffffffffffffffffffffffffffff167f7d7f6ed6d84cc6a4531c22effb48bb76d643459a9d3398dab7ddb04f6fb01ebc60405160405180910390a450565b611678612d16565b5f801b600b8360405161168b91906148d0565b908152602001604051809103902060030154036116dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d490614b1a565b60405180910390fd5b80600b836040516116ee91906148d0565b90815260200160405180910390205f015f6101000a81548160ff021916908360ff1602179055505050565b61173383838360405180602001604052805f815250612612565b505050565b611740612d16565b5f6040518060a001604052808760ff1681526020018660ff16815260200185815260200184815260200183815250905080600b8860405161178191906148d0565b90815260200160405180910390205f820151815f015f6101000a81548160ff021916908360ff1602179055506020820151815f0160016101000a81548160ff021916908360ff16021790555060408201518160010155606082015181600201556080820151816003015590505050505050505050565b6117ff612f1a565b611807612f69565b6001600281111561181b5761181a613ee5565b5b600d5f9054906101000a900460ff16600281111561183c5761183b613ee5565b5b1461187c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187390614b82565b60405180910390fd5b5f6040518060400160405280600281526020017f574c00000000000000000000000000000000000000000000000000000000000081525090505f6118e3338585600b866040516118cc91906148d0565b908152602001604051809103902060030154610f56565b611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191990614c10565b60405180910390fd5b600b8260405161193291906148d0565b9081526020016040518091039020600101548560ff16600c8460405161195891906148d0565b9081526020016040518091039020546119719190614c5b565b11156119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a990614cfe565b60405180910390fd5b600b826040516119c291906148d0565b90815260200160405180910390205f015f9054906101000a900460ff1660ff168560ff161115611a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1e90614d8c565b60405180910390fd5b600b82604051611a3791906148d0565b90815260200160405180910390205f015f9054906101000a900460ff1660ff1685600f84604051611a6891906148d0565b90815260200160405180910390205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611ac89190614daa565b60ff161115611b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0390614e74565b60405180910390fd5b5f60105f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1660ff161115611bda578460ff16600b83604051611b7491906148d0565b908152602001604051809103902060020154611b909190614e92565b905080341015611bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcc90614f43565b60405180910390fd5b611d8a565b60018560ff1603611c78575f60105f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1660ff1614611c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6a90614f43565b60405180910390fd5b611d33565b60018560ff161115611d3257600b82604051611c9491906148d0565b90815260200160405180910390205f0160019054906101000a900460ff1685611cbd9190614f61565b60ff16600b83604051611cd091906148d0565b908152602001604051809103902060020154611cec9190614e92565b905080341015611d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2890614f43565b60405180910390fd5b5b5b600160105f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908360ff1602179055505b611d92612423565b73ffffffffffffffffffffffffffffffffffffffff166108fc3490811502906040515f60405180830381858888f19350505050158015611dd4573d5f803e3d5ffd5b50611de0828683612fb3565b5050611dea613214565b505050565b5f600860149054906101000a900460ff16905090565b60118181548110611e14575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f611e4a82612d94565b9050919050565b611e59612d16565b80600a8190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ec9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b611f20612d16565b611f295f61321e565b565b5f600b604051611f3a90614998565b90815260200160405180910390205f015f9054906101000a900460ff16905090565b611f64612d16565b8060139080519060200190611f7a929190613a73565b5050565b611f86612d16565b5f801b600b83604051611f9991906148d0565b90815260200160405180910390206003015403611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe290614b1a565b60405180910390fd5b80600b83604051611ffc91906148d0565b90815260200160405180910390205f0160016101000a81548160ff021916908360ff1602179055505050565b612030612d16565b612038612f69565b6120406132e1565b565b61204a612f1a565b612052612f69565b5f600281111561206557612064613ee5565b5b600d5f9054906101000a900460ff16600281111561208657612085613ee5565b5b036120c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bd90614b82565b60405180910390fd5b5f6040518060400160405280600681526020017f5055424c494300000000000000000000000000000000000000000000000000008152509050600b8160405161210f91906148d0565b90815260200160405180910390205f015f9054906101000a900460ff1660ff168260ff161115612174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216b90614d8c565b60405180910390fd5b600b8160405161218491906148d0565b90815260200160405180910390205f015f9054906101000a900460ff1660ff1682600f836040516121b591906148d0565b90815260200160405180910390205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166122159190614daa565b60ff161115612259576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225090614e74565b60405180910390fd5b6001600281111561226d5761226c613ee5565b5b600d5f9054906101000a900460ff16600281111561228e5761228d613ee5565b5b0361232457600b816040516122a391906148d0565b9081526020016040518091039020600101548260ff16600c836040516122c991906148d0565b9081526020016040518091039020546122e29190614c5b565b1115612323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231a90614cfe565b60405180910390fd5b5b5f8260ff16600b8360405161233991906148d0565b9081526020016040518091039020600201546123559190614e92565b90508034101561239a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239190614f43565b60405180910390fd5b6123a2612423565b73ffffffffffffffffffffffffffffffffffffffff166108fc3490811502906040515f60405180830381858888f193505050501580156123e4573d5f803e3d5ffd5b506123f0828483612fb3565b50506123fa613214565b50565b5f600b60405161240c90614fdf565b908152602001604051809103902060020154905090565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461245a906149d9565b80601f0160208091040260200160405190810160405280929190818152602001828054612486906149d9565b80156124d15780601f106124a8576101008083540402835291602001916124d1565b820191905f5260205f20905b8154815290600101906020018083116124b457829003601f168201915b5050505050905090565b8060075f6124e7612cf5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612590612cf5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125d59190613df0565b60405180910390a35050565b5f600b6040516125f090614fdf565b90815260200160405180910390205f015f9054906101000a900460ff16905090565b61261d8484846110e2565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1461267e5761264784848484613344565b61267d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061268f82612c9b565b6126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c590615063565b60405180910390fd5b60145f9054906101000a900460ff16156127145760126126ed8361348f565b6040516020016126fe92919061515d565b60405160208183030381529060405290506127cf565b5f6013805490508361272691906151b8565b90506013818154811061273c5761273b6151e8565b5b905f5260205f2001805461274f906149d9565b80601f016020809104026020016040519081016040528092919081815260200182805461277b906149d9565b80156127c65780601f1061279d576101008083540402835291602001916127c6565b820191905f5260205f20905b8154815290600101906020018083116127a957829003601f168201915b50505050509150505b919050565b6127dc612d16565b5f801b600b836040516127ef91906148d0565b90815260200160405180910390206003015403612841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283890614b1a565b60405180910390fd5b80600b8360405161285291906148d0565b9081526020016040518091039020600101819055505050565b600a5481565b612879612d16565b5f801b600b8760405161288c91906148d0565b908152602001604051809103902060030154036128de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d590614b1a565b60405180910390fd5b5f6040518060a001604052808760ff1681526020018660ff16815260200185815260200184815260200183815250905080600b8860405161291f91906148d0565b90815260200160405180910390205f820151815f015f6101000a81548160ff021916908360ff1602179055506020820151815f0160016101000a81548160ff021916908360ff16021790555060408201518160010155606082015181600201556080820151816003015590505050505050505050565b61299d612d16565b8060145f6101000a81548160ff02191690831515021790555081601290816129c591906153a0565b5060145f9054906101000a900460ff1615612a1e573373ffffffffffffffffffffffffffffffffffffffff167f2a10c355cd3f8130b128e45782d3e92e6c0b4ba2e844d06f49a48ee23f1f21f760405160405180910390a25b5050565b612a2a612d16565b600a548160ff16612a39613559565b612a439190614c5b565b1115612a84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7b906154b9565b60405180910390fd5b612a91338260ff1661356a565b3373ffffffffffffffffffffffffffffffffffffffff167fc06d53176829f80e4279d4c047b74872abc9e10a4c210a24abff21de3d077740825f604051612ad9929190615510565b60405180910390a250565b5f600f604051612af390614fdf565b90815260200160405180910390205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1660ff169050919050565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f600b604051612bf090614998565b908152602001604051809103902060020154905090565b612c0f612d16565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c74906155a7565b60405180910390fd5b612c868161321e565b50565b612c91612d16565b612c99613587565b565b5f81612ca5612d12565b11158015612cb357505f5482105b8015612cee57505f7c010000000000000000000000000000000000000000000000000000000060045f8581526020019081526020015f205416145b9050919050565b5f33905090565b5f82612d0885846135e9565b1490509392505050565b5f90565b612d1e61363d565b73ffffffffffffffffffffffffffffffffffffffff16612d3c612423565b73ffffffffffffffffffffffffffffffffffffffff1614612d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d899061560f565b60405180910390fd5b565b5f8082905080612da2612d12565b11612e20575f54811015612e1f575f60045f8381526020019081526020015f205490505f7c0100000000000000000000000000000000000000000000000000000000821603612e1d575b5f8103612e135760045f836001900393508381526020019081526020015f20549050612dec565b8092505050612e52565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f60065f8581526020019081526020015f2090508092508254915050915091565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b5f8060e883901c905060e8612ed9868684613644565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600260095403612f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5690615677565b60405180910390fd5b6002600981905550565b612f71611def565b15612fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa8906156df565b60405180910390fd5b565b600a548260ff16612fc2613559565b612fcc9190614c5b565b111561300d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300490615747565b60405180910390fd5b5f8260ff1611613052576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613049906157d5565b60405180910390fd5b61305f338360ff1661356a565b8160ff16600c8460405161307391906148d0565b90815260200160405180910390205f82825461308f9190614c5b565b9250508190555081600f846040516130a791906148d0565b90815260200160405180910390205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282829054906101000a900460ff1661310a9190614daa565b92506101000a81548160ff021916908360ff160217905550601133908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff167fc06d53176829f80e4279d4c047b74872abc9e10a4c210a24abff21de3d07774083836040516131ca9291906157f3565b60405180910390a2600a546131dd613559565b1061320f577f52df9fe5b9c9a7b0b4fdc2c9f89387959e35e4209c2a8d133a2b8165edad2a0460405160405180910390a15b505050565b6001600981905550565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6132e9612f69565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861332d61363d565b60405161333a919061406f565b60405180910390a1565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613369612cf5565b8786866040518563ffffffff1660e01b815260040161338b949392919061586c565b6020604051808303815f875af19250505080156133c657506040513d601f19601f820116820180604052508101906133c391906158ca565b60015b61343c573d805f81146133f4576040519150601f19603f3d011682016040523d82523d5f602084013e6133f9565b606091505b505f815103613434576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60605f600161349d8461364c565b0190505f8167ffffffffffffffff8111156134bb576134ba613b6e565b5b6040519080825280601f01601f1916602001820160405280156134ed5781602001600182028036833780820191505090505b5090505f82602001820190505b60011561354e578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816135435761354261518b565b5b0494505f85036134fa575b819350505050919050565b5f613562612d12565b5f5403905090565b613583828260405180602001604052805f81525061379d565b5050565b61358f613834565b5f600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6135d261363d565b6040516135df919061406f565b60405180910390a1565b5f808290505f5b84518110156136325761361d828683815181106136105761360f6151e8565b5b602002602001015161387d565b9150808061362a906158f5565b9150506135f0565b508091505092915050565b5f33905090565b5f9392505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106136a8577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161369e5761369d61518b565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106136e5576d04ee2d6d415b85acef810000000083816136db576136da61518b565b5b0492506020810190505b662386f26fc10000831061371457662386f26fc10000838161370a5761370961518b565b5b0492506010810190505b6305f5e100831061373d576305f5e10083816137335761373261518b565b5b0492506008810190505b61271083106137625761271083816137585761375761518b565b5b0492506004810190505b60648310613785576064838161377b5761377a61518b565b5b0492506002810190505b600a8310613794576001810190505b80915050919050565b6137a783836138a7565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1461382f575f805490505f83820390505b6137e35f868380600101945086613344565b613819576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106137d157815f541461382c575f80fd5b50505b505050565b61383c611def565b61387b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161387290615986565b60405180910390fd5b565b5f8183106138945761388f8284613a50565b61389f565b61389e8383613a50565b5b905092915050565b5f805490505f82036138e5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6138f15f848385612ebd565b600160406001901b17820260055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550613963836139545f865f612ec3565b61395d85613a64565b17612eea565b60045f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b8181146139fd5780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a46001810190506139c4565b505f8203613a37576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f819055505050613a4b5f848385612f14565b505050565b5f825f528160205260405f20905092915050565b5f6001821460e11b9050919050565b828054828255905f5260205f20908101928215613ab9579160200282015b82811115613ab8578251829081613aa891906153a0565b5091602001919060010190613a91565b5b509050613ac69190613aca565b5090565b5b80821115613ae9575f8181613ae09190613aed565b50600101613acb565b5090565b508054613af9906149d9565b5f825580601f10613b0a5750613b27565b601f0160209004905f5260205f2090810190613b269190613b2a565b5b50565b5b80821115613b41575f815f905550600101613b2b565b5090565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613ba482613b5e565b810181811067ffffffffffffffff82111715613bc357613bc2613b6e565b5b80604052505050565b5f613bd5613b45565b9050613be18282613b9b565b919050565b5f67ffffffffffffffff821115613c0057613bff613b6e565b5b613c0982613b5e565b9050602081019050919050565b828183375f83830152505050565b5f613c36613c3184613be6565b613bcc565b905082815260208101848484011115613c5257613c51613b5a565b5b613c5d848285613c16565b509392505050565b5f82601f830112613c7957613c78613b56565b5b8135613c89848260208601613c24565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613cbb82613c92565b9050919050565b613ccb81613cb1565b8114613cd5575f80fd5b50565b5f81359050613ce681613cc2565b92915050565b5f80fd5b5f80fd5b5f8083601f840112613d0957613d08613b56565b5b8235905067ffffffffffffffff811115613d2657613d25613cec565b5b602083019150836020820283011115613d4257613d41613cf0565b5b9250929050565b5f805f8060608587031215613d6157613d60613b4e565b5b5f85013567ffffffffffffffff811115613d7e57613d7d613b52565b5b613d8a87828801613c65565b9450506020613d9b87828801613cd8565b935050604085013567ffffffffffffffff811115613dbc57613dbb613b52565b5b613dc887828801613cf4565b925092505092959194509250565b5f8115159050919050565b613dea81613dd6565b82525050565b5f602082019050613e035f830184613de1565b92915050565b5f60208284031215613e1e57613e1d613b4e565b5b5f613e2b84828501613cd8565b91505092915050565b5f819050919050565b613e4681613e34565b82525050565b5f602082019050613e5f5f830184613e3d565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613e9981613e65565b8114613ea3575f80fd5b50565b5f81359050613eb481613e90565b92915050565b5f60208284031215613ecf57613ece613b4e565b5b5f613edc84828501613ea6565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60038110613f2357613f22613ee5565b5b50565b5f819050613f3382613f12565b919050565b5f613f4282613f26565b9050919050565b613f5281613f38565b82525050565b5f602082019050613f6b5f830184613f49565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613fa8578082015181840152602081019050613f8d565b5f8484015250505050565b5f613fbd82613f71565b613fc78185613f7b565b9350613fd7818560208601613f8b565b613fe081613b5e565b840191505092915050565b5f6020820190508181035f8301526140038184613fb3565b905092915050565b61401481613e34565b811461401e575f80fd5b50565b5f8135905061402f8161400b565b92915050565b5f6020828403121561404a57614049613b4e565b5b5f61405784828501614021565b91505092915050565b61406981613cb1565b82525050565b5f6020820190506140825f830184614060565b92915050565b5f806040838503121561409e5761409d613b4e565b5b5f6140ab85828601613cd8565b92505060206140bc85828601614021565b9150509250929050565b5f602082840312156140db576140da613b4e565b5b5f82013567ffffffffffffffff8111156140f8576140f7613b52565b5b61410484828501613c65565b91505092915050565b5f819050919050565b61411f8161410d565b8114614129575f80fd5b50565b5f8135905061413a81614116565b92915050565b5f805f806060858703121561415857614157613b4e565b5b5f61416587828801613cd8565b945050602085013567ffffffffffffffff81111561418657614185613b52565b5b61419287828801613cf4565b935093505060406141a58782880161412c565b91505092959194509250565b5f80604083850312156141c7576141c6613b4e565b5b5f83013567ffffffffffffffff8111156141e4576141e3613b52565b5b6141f085828601613c65565b925050602061420185828601613cd8565b9150509250929050565b5f60ff82169050919050565b6142208161420b565b82525050565b5f6020820190506142395f830184614217565b92915050565b5f806040838503121561425557614254613b4e565b5b5f83013567ffffffffffffffff81111561427257614271613b52565b5b61427e85828601613c65565b925050602061428f8582860161412c565b9150509250929050565b5f805f606084860312156142b0576142af613b4e565b5b5f6142bd86828701613cd8565b93505060206142ce86828701613cd8565b92505060406142df86828701614021565b9150509250925092565b5f80604083850312156142ff576142fe613b4e565b5b5f83013567ffffffffffffffff81111561431c5761431b613b52565b5b61432885828601613c65565b925050602061433985828601614021565b9150509250929050565b5f60c0820190506143565f830189614217565b6143636020830188614217565b6143706040830187613e3d565b61437d6060830186613e3d565b61438a6080830185613e3d565b61439760a0830184614217565b979650505050505050565b6143ab8161420b565b81146143b5575f80fd5b50565b5f813590506143c6816143a2565b92915050565b5f602082840312156143e1576143e0613b4e565b5b5f6143ee848285016143b8565b91505092915050565b5f806040838503121561440d5761440c613b4e565b5b5f83013567ffffffffffffffff81111561442a57614429613b52565b5b61443685828601613c65565b9250506020614447858286016143b8565b9150509250929050565b5f805f805f8060c0878903121561446b5761446a613b4e565b5b5f87013567ffffffffffffffff81111561448857614487613b52565b5b61449489828a01613c65565b96505060206144a589828a016143b8565b95505060406144b689828a016143b8565b94505060606144c789828a01614021565b93505060806144d889828a01614021565b92505060a06144e989828a0161412c565b9150509295509295509295565b5f805f6040848603121561450d5761450c613b4e565b5b5f61451a868287016143b8565b935050602084013567ffffffffffffffff81111561453b5761453a613b52565b5b61454786828701613cf4565b92509250509250925092565b5f67ffffffffffffffff82111561456d5761456c613b6e565b5b602082029050602081019050919050565b5f61459061458b84614553565b613bcc565b905080838252602082019050602084028301858111156145b3576145b2613cf0565b5b835b818110156145fa57803567ffffffffffffffff8111156145d8576145d7613b56565b5b8086016145e58982613c65565b855260208501945050506020810190506145b5565b5050509392505050565b5f82601f83011261461857614617613b56565b5b813561462884826020860161457e565b91505092915050565b5f6020828403121561464657614645613b4e565b5b5f82013567ffffffffffffffff81111561466357614662613b52565b5b61466f84828501614604565b91505092915050565b61468181613dd6565b811461468b575f80fd5b50565b5f8135905061469c81614678565b92915050565b5f80604083850312156146b8576146b7613b4e565b5b5f6146c585828601613cd8565b92505060206146d68582860161468e565b9150509250929050565b5f67ffffffffffffffff8211156146fa576146f9613b6e565b5b61470382613b5e565b9050602081019050919050565b5f61472261471d846146e0565b613bcc565b90508281526020810184848401111561473e5761473d613b5a565b5b614749848285613c16565b509392505050565b5f82601f83011261476557614764613b56565b5b8135614775848260208601614710565b91505092915050565b5f805f806080858703121561479657614795613b4e565b5b5f6147a387828801613cd8565b94505060206147b487828801613cd8565b93505060406147c587828801614021565b925050606085013567ffffffffffffffff8111156147e6576147e5613b52565b5b6147f287828801614751565b91505092959194509250565b5f806040838503121561481457614813613b4e565b5b5f83013567ffffffffffffffff81111561483157614830613b52565b5b61483d85828601613c65565b925050602061484e8582860161468e565b9150509250929050565b5f806040838503121561486e5761486d613b4e565b5b5f61487b85828601613cd8565b925050602061488c85828601613cd8565b9150509250929050565b5f81905092915050565b5f6148aa82613f71565b6148b48185614896565b93506148c4818560208601613f8b565b80840191505092915050565b5f6148db82846148a0565b915081905092915050565b7f4552524f523a204d696e7465722054797065206e6f7420666f756e642e0000005f82015250565b5f61491a601d83613f7b565b9150614925826148e6565b602082019050919050565b5f6020820190508181035f8301526149478161490e565b9050919050565b7f574c0000000000000000000000000000000000000000000000000000000000005f82015250565b5f614982600283614896565b915061498d8261494e565b600282019050919050565b5f6149a282614976565b9150819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806149f057607f821691505b602082108103614a0357614a026149ac565b5b50919050565b5f8160601b9050919050565b5f614a1f82614a09565b9050919050565b5f614a3082614a15565b9050919050565b614a48614a4382613cb1565b614a26565b82525050565b5f614a598284614a37565b60148201915081905092915050565b7f4552524f523a204d696e74657273496e666f206e6f7420666f756e642e0000005f82015250565b5f614a9c601d83613f7b565b9150614aa782614a68565b602082019050919050565b5f6020820190508181035f830152614ac981614a90565b9050919050565b7f4d696e74657273496e666f206e6f7420666f756e642e000000000000000000005f82015250565b5f614b04601683613f7b565b9150614b0f82614ad0565b602082019050919050565b5f6020820190508181035f830152614b3181614af8565b9050919050565b7f4552524f523a204d696e74206973206e6f74206163746976652e0000000000005f82015250565b5f614b6c601a83613f7b565b9150614b7782614b38565b602082019050919050565b5f6020820190508181035f830152614b9981614b60565b9050919050565b7f4552524f523a20596f7520617265206e6f7420616c6c6f77656420746f206d695f8201527f6e74206f6e20746869732070686173652e000000000000000000000000000000602082015250565b5f614bfa603183613f7b565b9150614c0582614ba0565b604082019050919050565b5f6020820190508181035f830152614c2781614bee565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614c6582613e34565b9150614c7083613e34565b9250828201905080821115614c8857614c87614c2e565b5b92915050565b7f4552524f523a204d6178696d756d206e756d626572206f66206d696e7473206f5f8201527f6e207468697320706861736520686173206265656e2072656163686564000000602082015250565b5f614ce8603d83613f7b565b9150614cf382614c8e565b604082019050919050565b5f6020820190508181035f830152614d1581614cdc565b9050919050565b7f4552524f523a204d6178696d756d206e756d626572206f66206d696e747320705f8201527f6572207472616e73616374696f6e206578636565646564000000000000000000602082015250565b5f614d76603783613f7b565b9150614d8182614d1c565b604082019050919050565b5f6020820190508181035f830152614da381614d6a565b9050919050565b5f614db48261420b565b9150614dbf8361420b565b9250828201905060ff811115614dd857614dd7614c2e565b5b92915050565b7f4552524f523a20596f7572206d6178696d756d204e4654206d696e74207065725f8201527f2077616c6c6574206f6e207468697320706861736520686173206265656e207260208201527f6561636865642e00000000000000000000000000000000000000000000000000604082015250565b5f614e5e604783613f7b565b9150614e6982614dde565b606082019050919050565b5f6020820190508181035f830152614e8b81614e52565b9050919050565b5f614e9c82613e34565b9150614ea783613e34565b9250828202614eb581613e34565b91508282048414831517614ecc57614ecb614c2e565b5b5092915050565b7f4552524f523a20596f7520646f206e6f74206861766520656e6f7567682066755f8201527f6e647320746f206d696e742e0000000000000000000000000000000000000000602082015250565b5f614f2d602c83613f7b565b9150614f3882614ed3565b604082019050919050565b5f6020820190508181035f830152614f5a81614f21565b9050919050565b5f614f6b8261420b565b9150614f768361420b565b9250828203905060ff811115614f8f57614f8e614c2e565b5b92915050565b7f5055424c494300000000000000000000000000000000000000000000000000005f82015250565b5f614fc9600683614896565b9150614fd482614f95565b600682019050919050565b5f614fe982614fbd565b9150819050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f61504d602f83613f7b565b915061505882614ff3565b604082019050919050565b5f6020820190508181035f83015261507a81615041565b9050919050565b5f819050815f5260205f209050919050565b5f815461509f816149d9565b6150a98186614896565b9450600182165f81146150c357600181146150d85761510a565b60ff198316865281151582028601935061510a565b6150e185615081565b5f5b83811015615102578154818901526001820191506020810190506150e3565b838801955050505b50505092915050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f615147600583614896565b915061515282615113565b600582019050919050565b5f6151688285615093565b915061517482846148a0565b915061517f8261513b565b91508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6151c282613e34565b91506151cd83613e34565b9250826151dd576151dc61518b565b5b828206905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261525f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615224565b6152698683615224565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6152a461529f61529a84613e34565b615281565b613e34565b9050919050565b5f819050919050565b6152bd8361528a565b6152d16152c9826152ab565b848454615230565b825550505050565b5f90565b6152e56152d9565b6152f08184846152b4565b505050565b5b81811015615313576153085f826152dd565b6001810190506152f6565b5050565b601f8211156153585761532981615081565b61533284615215565b81016020851015615341578190505b61535561534d85615215565b8301826152f5565b50505b505050565b5f82821c905092915050565b5f6153785f198460080261535d565b1980831691505092915050565b5f6153908383615369565b9150826002028217905092915050565b6153a982613f71565b67ffffffffffffffff8111156153c2576153c1613b6e565b5b6153cc82546149d9565b6153d7828285615317565b5f60209050601f831160018114615408575f84156153f6578287015190505b6154008582615385565b865550615467565b601f19841661541686615081565b5f5b8281101561543d57848901518255600182019150602085019450602081019050615418565b8683101561545a5784890151615456601f891682615369565b8355505b6001600288020188555050505b505050505050565b7f4552524f523a204e6f7420656e6f75676820746f6b656e7300000000000000005f82015250565b5f6154a3601883613f7b565b91506154ae8261546f565b602082019050919050565b5f6020820190508181035f8301526154d081615497565b9050919050565b5f819050919050565b5f6154fa6154f56154f0846154d7565b615281565b613e34565b9050919050565b61550a816154e0565b82525050565b5f6040820190506155235f830185614217565b6155306020830184615501565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f615591602683613f7b565b915061559c82615537565b604082019050919050565b5f6020820190508181035f8301526155be81615585565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6155f9602083613f7b565b9150615604826155c5565b602082019050919050565b5f6020820190508181035f830152615626816155ed565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f615661601f83613f7b565b915061566c8261562d565b602082019050919050565b5f6020820190508181035f83015261568e81615655565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f6156c9601083613f7b565b91506156d482615695565b602082019050919050565b5f6020820190508181035f8301526156f6816156bd565b9050919050565b7f4552524f523a204e6f20746f6b656e73206c65667420746f206d696e740000005f82015250565b5f615731601d83613f7b565b915061573c826156fd565b602082019050919050565b5f6020820190508181035f83015261575e81615725565b9050919050565b7f4552524f523a204e756d626572206f6620746f6b656e732073686f756c6420625f8201527f652067726561746572207468616e207a65726f00000000000000000000000000602082015250565b5f6157bf603383613f7b565b91506157ca82615765565b604082019050919050565b5f6020820190508181035f8301526157ec816157b3565b9050919050565b5f6040820190506158065f830185614217565b6158136020830184613e3d565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f61583e8261581a565b6158488185615824565b9350615858818560208601613f8b565b61586181613b5e565b840191505092915050565b5f60808201905061587f5f830187614060565b61588c6020830186614060565b6158996040830185613e3d565b81810360608301526158ab8184615834565b905095945050505050565b5f815190506158c481613e90565b92915050565b5f602082840312156158df576158de613b4e565b5b5f6158ec848285016158b6565b91505092915050565b5f6158ff82613e34565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361593157615930614c2e565b5b600182019050919050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f615970601483613f7b565b915061597b8261593c565b602082019050919050565b5f6020820190508181035f83015261599d81615964565b905091905056fea264697066735822122015eb023ad3733e3f606f1a0b181ee462c5baebdccae5dbec8946121fd11a113c64736f6c63430008140033

Deployed Bytecode Sourcemap

91363:13259:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96933:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;101712:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57963:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92013:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58865:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65356:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64789:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91853:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104303:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92120:65;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54616:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102074:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92256:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68995:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99435:270;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100674:512;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;97906:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100285:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71916:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;98247:495;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93782:1922;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35886:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92366:33;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60258:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98093:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55800:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38744:103;;;;;;;;;;;;;:::i;:::-;;101430:129;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102327:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99993:284;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102776:75;;;;;;;;;;;;;:::i;:::-;;95712:1213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;101309:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38103:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59041:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65914:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;101567:137;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72707:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97300:598;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99713:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91436:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98804:623;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102460:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102859:264;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;101857:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66305:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;101196:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39002:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102703:65;;;;;;;;;;;;;:::i;:::-;;96933:359;97057:4;97119:1;97111:10;;97082:7;97090:11;97082:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;:39;97074:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;97170:65;97185:8;97195:12;;97209:7;97217:11;97209:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;97170:14;:65::i;:::-;97166:95;;;97257:4;97250:11;;;;97166:95;97279:5;97272:12;;96933:359;;;;;;;:::o;101712:137::-;101782:7;101809:13;:19;;;;;:::i;:::-;;;;;;;;;;;;;:32;101829:11;101809:32;;;;;;;;;;;;;;;;;;;;;;;;;101802:39;;;;101712:137;;;:::o;57963:639::-;58048:4;58387:10;58372:25;;:11;:25;;;;:102;;;;58464:10;58449:25;;:11;:25;;;;58372:102;:179;;;;58541:10;58526:25;;:11;:25;;;;58372:179;58352:199;;57963:639;;;:::o;92013:26::-;;;;;;;;;;;;;:::o;58865:100::-;58919:13;58952:5;58945:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58865:100;:::o;65356:218::-;65432:7;65457:16;65465:7;65457;:16::i;:::-;65452:64;;65482:34;;;;;;;;;;;;;;65452:64;65536:15;:24;65552:7;65536:24;;;;;;;;;;;:30;;;;;;;;;;;;65529:37;;65356:218;;;:::o;64789:408::-;64878:13;64894:16;64902:7;64894;:16::i;:::-;64878:32;;64950:5;64927:28;;:19;:17;:19::i;:::-;:28;;;64923:175;;64975:44;64992:5;64999:19;:17;:19::i;:::-;64975:16;:44::i;:::-;64970:128;;65047:35;;;;;;;;;;;;;;64970:128;64923:175;65143:2;65110:15;:24;65126:7;65110:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;65181:7;65177:2;65161:28;;65170:5;65161:28;;;;;;;;;;;;64867:330;64789:408;;:::o;91853:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;104303:308::-;104460:4;104477:13;104520:11;104503:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;104493:40;;;;;;104477:56;;104551:52;104570:12;;104551:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104584:11;104597:5;104551:18;:52::i;:::-;104544:59;;;104303:308;;;;;;:::o;92120:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54616:323::-;54677:7;54905:15;:13;:15::i;:::-;54890:12;;54874:13;;:28;:46;54867:53;;54616:323;:::o;102074:245::-;37989:13;:11;:13::i;:::-;102219:1:::1;102211:10:::0;::::1;102182:7;102190:11;102182:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;:39:::0;102174:81:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;102303:8;102275:7;102283:11;102275:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;:36;;;;102074:245:::0;;:::o;92256:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;68995:2825::-;69137:27;69167;69186:7;69167:18;:27::i;:::-;69137:57;;69252:4;69211:45;;69227:19;69211:45;;;69207:86;;69265:28;;;;;;;;;;;;;;69207:86;69307:27;69336:23;69363:35;69390:7;69363:26;:35::i;:::-;69306:92;;;;69498:68;69523:15;69540:4;69546:19;:17;:19::i;:::-;69498:24;:68::i;:::-;69493:180;;69586:43;69603:4;69609:19;:17;:19::i;:::-;69586:16;:43::i;:::-;69581:92;;69638:35;;;;;;;;;;;;;;69581:92;69493:180;69704:1;69690:16;;:2;:16;;;69686:52;;69715:23;;;;;;;;;;;;;;69686:52;69751:43;69773:4;69779:2;69783:7;69792:1;69751:21;:43::i;:::-;69887:15;69884:160;;;70027:1;70006:19;69999:30;69884:160;70424:18;:24;70443:4;70424:24;;;;;;;;;;;;;;;;70422:26;;;;;;;;;;;;70493:18;:22;70512:2;70493:22;;;;;;;;;;;;;;;;70491:24;;;;;;;;;;;70815:146;70852:2;70901:45;70916:4;70922:2;70926:19;70901:14;:45::i;:::-;51015:8;70873:73;70815:18;:146::i;:::-;70786:17;:26;70804:7;70786:26;;;;;;;;;;;:175;;;;71132:1;51015:8;71081:19;:47;:52;71077:627;;71154:19;71186:1;71176:7;:11;71154:33;;71343:1;71309:17;:30;71327:11;71309:30;;;;;;;;;;;;:35;71305:384;;71447:13;;71432:11;:28;71428:242;;71627:19;71594:17;:30;71612:11;71594:30;;;;;;;;;;;:52;;;;71428:242;71305:384;71135:569;71077:627;71751:7;71747:2;71732:27;;71741:4;71732:27;;;;;;;;;;;;71770:42;71791:4;71797:2;71801:7;71810:1;71770:20;:42::i;:::-;69126:2694;;;68995:2825;;;:::o;99435:270::-;37989:13;:11;:13::i;:::-;99613:1:::1;99605:10:::0;::::1;99576:7;99584:11;99576:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;:39:::0;99568:74:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;99685:12;99653:7;99661:11;99653:20;;;;;;:::i;:::-;;;;;;;;;;;;;:29;;:44;;;;99435:270:::0;;:::o;100674:512::-;100765:5;100772;100779:7;100788;100797;100806:5;100826:20;100849:13;100863:11;100849:26;;;;;;:::i;:::-;;;;;;;;;;;;;:40;100876:12;100849:40;;;;;;;;;;;;;;;;;;;;;;;;;100826:63;;100941:12;;;;;;;;;;;100935:19;;;;;;;;:::i;:::-;;100969:7;100977:11;100969:20;;;;;;:::i;:::-;;;;;;;;;;;;;:42;;;;;;;;;;;;101026:7;101034:11;101026:20;;;;;;:::i;:::-;;;;;;;;;;;;;:29;;;101071:7;101079:11;101071:20;;;;;;:::i;:::-;;;;;;;;;;;;;:27;;;101114:11;101126;101114:24;;;;;;:::i;:::-;;;;;;;;;;;;;;101153:14;100900:278;;;;;;;;;;;;;100674:512;;;;;;;;:::o;97906:179::-;37989:13;:11;:13::i;:::-;97992:6:::1;97985:14;;;;;;;;;;:::i;:::-;;97970:12;;:29;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;98063:12;;;;;;;;;;;98057:19;;;;;;;;:::i;:::-;;98015:62;;98040:15;98028:10;98015:62;;;;;;;;;;;;97906:179:::0;:::o;100285:320::-;37989:13;:11;:13::i;:::-;100487:1:::1;100479:10:::0;::::1;100450:7;100458:11;100450:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;:39:::0;100442:74:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;100572:25;100527:7;100535:11;100527:20;;;;;;:::i;:::-;;;;;;;;;;;;;:42;;;:70;;;;;;;;;;;;;;;;;;100285:320:::0;;:::o;71916:193::-;72062:39;72079:4;72085:2;72089:7;72062:39;;;;;;;;;;;;:16;:39::i;:::-;71916:193;;;:::o;98247:495::-;37989:13;:11;:13::i;:::-;98493:33:::1;98529:157;;;;;;;;98555:22;98529:157;;;;;;98592:17;98529:157;;;;;;98624:7;98529:157;;;;98646:9;98529:157;;;;98670:5;98529:157;;::::0;98493:193:::1;;98720:14;98697:7;98705:11;98697:20;;;;;;:::i;:::-;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;98482:260;98247:495:::0;;;;;;:::o;93782:1922::-;12379:21;:19;:21::i;:::-;35491:19:::1;:17;:19::i;:::-;93934:13:::2;93918:29;;;;;;;;:::i;:::-;;:12;;;;;;;;;;;:29;;;;;;;;:::i;:::-;;;93910:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;93989:25;:32;;;;;;;;;;;;;;;;::::0;::::2;;94059:18;94126:60;94141:10;94153:5;;94160:7;94168:11;94160:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;94126:14;:60::i;:::-;94118:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;94306:7;94314:11;94306:20;;;;;;:::i;:::-;;;;;;;;;;;;;:27;;;94288:14;94261:41;;:11;94273;94261:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:41;;;;:::i;:::-;:72;;94253:146;;;;;;;;;;;;:::i;:::-;;;;;;;;;94436:7;94444:11;94436:20;;;;;;:::i;:::-;;;;;;;;;;;;;:42;;;;;;;;;;;;94418:60;;:14;:60;;;;94410:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;94618:7;94626:11;94618:20;;;;;;:::i;:::-;;;;;;;;;;;;;:42;;;;;;;;;;;;94557:103;;94599:14;94558:13;94572:11;94558:26;;;;;;:::i;:::-;;;;;;;;;;;;;:38;94585:10;94558:38;;;;;;;;;;;;;;;;;;;;;;;;;:55;;;;:::i;:::-;94557:103;;;;94549:187;;;;;;;;;;;;:::i;:::-;;;;;;;;;94806:1;94781:10;:22;94792:10;94781:22;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;94776:810;;;94872:14;94840:46;;:7;94848:11;94840:20;;;;;;:::i;:::-;;;;;;;;;;;;;:29;;;:46;;;;:::i;:::-;94827:59;;94922:10;94909:9;:23;;94901:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;94776:810;;;95075:1;95057:14;:19;;::::0;95053:445:::2;;95149:1;95123:10;:22;95134:10;95123:22;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;95115:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;95053:445;;;95244:1;95227:14;:18;;;95223:275;;;95331:7;95339:11;95331:20;;;;;;:::i;:::-;;;;;;;;;;;;;:37;;;;;;;;;;;;95314:14;:54;;;;:::i;:::-;95281:88;;:7;95289:11;95281:20;;;;;;:::i;:::-;;;;;;;;;;;;;:29;;;:88;;;;:::i;:::-;95268:101;;95409:10;95396:9;:23;;95388:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;95223:275;95053:445;95551:1;95526:10;:22;95537:10;95526:22;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;94776:810;95606:7;:5;:7::i;:::-;95598:25;;:36;95624:9;95598:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;95645:51;95656:11;95669:14;95685:10;95645;:51::i;:::-;93897:1807;;12423:20:::0;:18;:20::i;:::-;93782:1922;;;:::o;35886:86::-;35933:4;35957:7;;;;;;;;;;;35950:14;;35886:86;:::o;92366:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60258:152::-;60330:7;60373:27;60392:7;60373:18;:27::i;:::-;60350:52;;60258:152;;;:::o;98093:100::-;37989:13;:11;:13::i;:::-;98175:10:::1;98163:9;:22;;;;98093:100:::0;:::o;55800:233::-;55872:7;55913:1;55896:19;;:5;:19;;;55892:60;;55924:28;;;;;;;;;;;;;;55892:60;49959:13;55970:18;:25;55989:5;55970:25;;;;;;;;;;;;;;;;:55;55963:62;;55800:233;;;:::o;38744:103::-;37989:13;:11;:13::i;:::-;38809:30:::1;38836:1;38809:18;:30::i;:::-;38744:103::o:0;101430:129::-;101491:5;101516:7;:13;;;;;:::i;:::-;;;;;;;;;;;;;:35;;;;;;;;;;;;101509:42;;101430:129;:::o;102327:125::-;37989:13;:11;:13::i;:::-;102435:9:::1;102413:19;:31;;;;;;;;;;;;:::i;:::-;;102327:125:::0;:::o;99993:284::-;37989:13;:11;:13::i;:::-;100172:1:::1;100164:10:::0;::::1;100135:7;100143:11;100135:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;:39:::0;100127:74:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;100252:17;100212:7;100220:11;100212:20;;;;;;:::i;:::-;;;;;;;;;;;;;:37;;;:57;;;;;;;;;;;;;;;;;;99993:284:::0;;:::o;102776:75::-;37989:13;:11;:13::i;:::-;35491:19:::1;:17;:19::i;:::-;102835:8:::2;:6;:8::i;:::-;102776:75::o:0;95712:1213::-;12379:21;:19;:21::i;:::-;35491:19:::1;:17;:19::i;:::-;95843:8:::2;95827:24;;;;;;;;:::i;:::-;;:12;;;;;;;;;;;:24;;;;;;;;:::i;:::-;;::::0;95819:63:::2;;;;;;;;;;;;:::i;:::-;;;;;;;;;95893:25;:36;;;;;;;;;;;;;;;;::::0;::::2;;95968:7;95976:11;95968:20;;;;;;:::i;:::-;;;;;;;;;;;;;:42;;;;;;;;;;;;95950:60;;:14;:60;;;;95942:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;96150:7;96158:11;96150:20;;;;;;:::i;:::-;;;;;;;;;;;;;:42;;;;;;;;;;;;96089:103;;96131:14;96090:13;96104:11;96090:26;;;;;;:::i;:::-;;;;;;;;;;;;;:38;96117:10;96090:38;;;;;;;;;;;;;;;;;;;;;;;;;:55;;;;:::i;:::-;96089:103;;;;96081:187;;;;;;;;;;;;:::i;:::-;;;;;;;;;96301:13;96285:29;;;;;;;;:::i;:::-;;:12;;;;;;;;;;;:29;;;;;;;;:::i;:::-;;::::0;96281:316:::2;;96492:7;96500:11;96492:20;;;;;;:::i;:::-;;;;;;;;;;;;;:27;;;96474:14;96447:41;;:11;96459;96447:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:41;;;;:::i;:::-;:72;;96439:146;;;;;;;;;;;;:::i;:::-;;;;;;;;;96281:316;96609:18;96683:14;96651:46;;:7;96659:11;96651:20;;;;;;:::i;:::-;;;;;;;;;;;;;:29;;;:46;;;;:::i;:::-;96638:59;;96729:10;96716:9;:23;;96708:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;96807:7;:5;:7::i;:::-;96799:25;;:36;96825:9;96799:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;96856:51;96867:11;96880:14;96896:10;96856;:51::i;:::-;95798:1127;;12423:20:::0;:18;:20::i;:::-;95712:1213;:::o;101309:113::-;101361:7;101388;:17;;;;;:::i;:::-;;;;;;;;;;;;;:26;;;101381:33;;101309:113;:::o;38103:87::-;38149:7;38176:6;;;;;;;;;;;38169:13;;38103:87;:::o;59041:104::-;59097:13;59130:7;59123:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59041:104;:::o;65914:234::-;66061:8;66009:18;:39;66028:19;:17;:19::i;:::-;66009:39;;;;;;;;;;;;;;;:49;66049:8;66009:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;66121:8;66085:55;;66100:19;:17;:19::i;:::-;66085:55;;;66131:8;66085:55;;;;;;:::i;:::-;;;;;;;;65914:234;;:::o;101567:137::-;101632:5;101657:7;:17;;;;;:::i;:::-;;;;;;;;;;;;;:39;;;;;;;;;;;;101650:46;;101567:137;:::o;72707:407::-;72882:31;72895:4;72901:2;72905:7;72882:12;:31::i;:::-;72946:1;72928:2;:14;;;:19;72924:183;;72967:56;72998:4;73004:2;73008:7;73017:5;72967:30;:56::i;:::-;72962:145;;73051:40;;;;;;;;;;;;;;72962:145;72924:183;72707:407;;;;:::o;97300:598::-;97419:13;97472:17;97480:8;97472:7;:17::i;:::-;97450:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;97581:10;;;;;;;;;;;97577:151;;;97670:7;97679:26;97696:8;97679:16;:26::i;:::-;97653:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;97639:77;;;;97577:151;97740:15;97769:19;:26;;;;97758:8;:37;;;;:::i;:::-;97740:55;;97859:19;97879:10;97859:31;;;;;;;;:::i;:::-;;;;;;;;;97852:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97300:598;;;;:::o;99713:272::-;37989:13;:11;:13::i;:::-;99892:1:::1;99884:10:::0;::::1;99855:7;99863:11;99855:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;:39:::0;99847:74:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;99962:15;99932:7;99940:11;99932:20;;;;;;:::i;:::-;;;;;;;;;;;;;:27;;:45;;;;99713:272:::0;;:::o;91436:31::-;;;;:::o;98804:623::-;37989:13;:11;:13::i;:::-;99113:1:::1;99105:10:::0;::::1;99076:7;99084:11;99076:20;;;;;;:::i;:::-;;;;;;;;;;;;;:25;;;:39:::0;99068:74:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;99153:37;99193:172;;;;;;;;99219:25;99193:172;;;;;;99259:20;99193:172;;;;;;99294:10;99193:172;;;;99319:12;99193:172;;;;99346:8;99193:172;;::::0;99153:212:::1;;99401:18;99378:7;99386:11;99378:20;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;99057:370;98804:623:::0;;;;;;:::o;102460:235::-;37989:13;:11;:13::i;:::-;102570:11:::1;102557:10;;:24;;;;;;;;;;;;;;;;;;102602:8;102592:7;:18;;;;;;:::i;:::-;;102627:10;;;;;;;;;;;102623:64;;;102676:10;102657:30;;;;;;;;;;;;102623:64;102460:235:::0;;:::o;102859:264::-;37989:13;:11;:13::i;:::-;102976:9:::1;;102957:14;102940:31;;:14;:12;:14::i;:::-;:31;;;;:::i;:::-;102939:46;;102931:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;103025:37;103035:10;103047:14;103025:37;;:9;:37::i;:::-;103085:10;103078:37;;;103097:14;103113:1;103078:37;;;;;;;:::i;:::-;;;;;;;;102859:264:::0;:::o;101857:145::-;101931:7;101958:13;:23;;;;;:::i;:::-;;;;;;;;;;;;;:36;101982:11;101958:36;;;;;;;;;;;;;;;;;;;;;;;;;101951:43;;;;101857:145;;;:::o;66305:164::-;66402:4;66426:18;:25;66445:5;66426:25;;;;;;;;;;;;;;;:35;66452:8;66426:35;;;;;;;;;;;;;;;;;;;;;;;;;66419:42;;66305:164;;;;:::o;101196:105::-;101244:7;101271;:13;;;;;:::i;:::-;;;;;;;;;;;;;:22;;;101264:29;;101196:105;:::o;39002:201::-;37989:13;:11;:13::i;:::-;39111:1:::1;39091:22;;:8;:22;;::::0;39083:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;39167:28;39186:8;39167:18;:28::i;:::-;39002:201:::0;:::o;102703:65::-;37989:13;:11;:13::i;:::-;102750:10:::1;:8;:10::i;:::-;102703:65::o:0;66727:282::-;66792:4;66848:7;66829:15;:13;:15::i;:::-;:26;;:66;;;;;66882:13;;66872:7;:23;66829:66;:153;;;;;66981:1;50735:8;66933:17;:26;66951:7;66933:26;;;;;;;;;;;;:44;:49;66829:153;66809:173;;66727:282;;;:::o;89035:105::-;89095:7;89122:10;89115:17;;89035:105;:::o;1336:156::-;1427:4;1480;1451:25;1464:5;1471:4;1451:12;:25::i;:::-;:33;1444:40;;1336:156;;;;;:::o;54132:92::-;54188:7;54132:92;:::o;38268:132::-;38343:12;:10;:12::i;:::-;38332:23;;:7;:5;:7::i;:::-;:23;;;38324:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38268:132::o;61413:1275::-;61480:7;61500:12;61515:7;61500:22;;61583:4;61564:15;:13;:15::i;:::-;:23;61560:1061;;61617:13;;61610:4;:20;61606:1015;;;61655:14;61672:17;:23;61690:4;61672:23;;;;;;;;;;;;61655:40;;61789:1;50735:8;61761:6;:24;:29;61757:845;;62426:113;62443:1;62433:6;:11;62426:113;;62486:17;:25;62504:6;;;;;;;62486:25;;;;;;;;;;;;62477:34;;62426:113;;;62572:6;62565:13;;;;;;61757:845;61632:989;61606:1015;61560:1061;62649:31;;;;;;;;;;;;;;61413:1275;;;;:::o;67890:485::-;67992:27;68021:23;68062:38;68103:15;:24;68119:7;68103:24;;;;;;;;;;;68062:65;;68280:18;68257:41;;68337:19;68331:26;68312:45;;68242:126;67890:485;;;:::o;67118:659::-;67267:11;67432:16;67425:5;67421:28;67412:37;;67592:16;67581:9;67577:32;67564:45;;67742:15;67731:9;67728:30;67720:5;67709:9;67706:20;67703:56;67693:66;;67118:659;;;;;:::o;73776:159::-;;;;;:::o;88344:311::-;88479:7;88499:16;51139:3;88525:19;:41;;88499:68;;51139:3;88593:31;88604:4;88610:2;88614:9;88593:10;:31::i;:::-;88585:40;;:62;;88578:69;;;88344:311;;;;;:::o;63236:450::-;63316:14;63484:16;63477:5;63473:28;63464:37;;63661:5;63647:11;63622:23;63618:41;63615:52;63608:5;63605:63;63595:73;;63236:450;;;;:::o;74600:158::-;;;;;:::o;12459:293::-;11861:1;12593:7;;:19;12585:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;11861:1;12726:7;:18;;;;12459:293::o;36045:108::-;36116:8;:6;:8::i;:::-;36115:9;36107:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;36045:108::o;103131:1136::-;103297:9;;103277:15;103260:32;;:14;:12;:14::i;:::-;:32;;;;:::i;:::-;103259:47;;103251:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;103377:1;103359:15;:19;;;103351:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;103447:38;103457:10;103469:15;103447:38;;:9;:38::i;:::-;103557:15;103529:43;;:11;103541;103529:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;103819:15;103777:13;103791:11;103777:26;;;;;;:::i;:::-;;;;;;;;;;;;;:38;103804:10;103777:38;;;;;;;;;;;;;;;;:57;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;103917:16;103939:10;103917:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104024:10;104017:47;;;104036:15;104053:10;104017:47;;;;;;;:::i;:::-;;;;;;;;104179:9;;104161:14;:12;:14::i;:::-;:27;104157:99;;104210:9;;;;;;;;;;104157:99;103131:1136;;;:::o;12760:213::-;11817:1;12943:7;:22;;;;12760:213::o;39363:191::-;39437:16;39456:6;;;;;;;;;;;39437:25;;39482:8;39473:6;;:17;;;;;;;;;;;;;;;;;;39537:8;39506:40;;39527:8;39506:40;;;;;;;;;;;;39426:128;39363:191;:::o;36482:118::-;35491:19;:17;:19::i;:::-;36552:4:::1;36542:7;;:14;;;;;;;;;;;;;;;;;;36572:20;36579:12;:10;:12::i;:::-;36572:20;;;;;;:::i;:::-;;;;;;;;36482:118::o:0;75198:716::-;75361:4;75407:2;75382:45;;;75428:19;:17;:19::i;:::-;75449:4;75455:7;75464:5;75382:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;75378:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75682:1;75665:6;:13;:18;75661:235;;75711:40;;;;;;;;;;;;;;75661:235;75854:6;75848:13;75839:6;75835:2;75831:15;75824:38;75378:529;75551:54;;;75541:64;;;:6;:64;;;;75534:71;;;75198:716;;;;;;:::o;30769:718::-;30825:13;30876:14;30913:1;30893:17;30904:5;30893:10;:17::i;:::-;:21;30876:38;;30929:20;30963:6;30952:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30929:41;;30985:11;31114:6;31110:2;31106:15;31098:6;31094:28;31087:35;;31151:290;31158:4;31151:290;;;31183:5;;;;;;;;31325:10;31320:2;31313:5;31309:14;31304:32;31299:3;31291:46;31383:2;31374:11;;;;;;:::i;:::-;;;;;31417:1;31408:5;:10;31151:290;31404:21;31151:290;31462:6;31455:13;;;;;30769:718;;;:::o;55037:296::-;55092:7;55299:15;:13;:15::i;:::-;55283:13;;:31;55276:38;;55037:296;:::o;82867:112::-;82944:27;82954:2;82958:8;82944:27;;;;;;;;;;;;:9;:27::i;:::-;82867:112;;:::o;36741:120::-;35750:16;:14;:16::i;:::-;36810:5:::1;36800:7;;:15;;;;;;;;;;;;;;;;;;36831:22;36840:12;:10;:12::i;:::-;36831:22;;;;;;:::i;:::-;;;;;;;;36741:120::o:0;2055:296::-;2138:7;2158:20;2181:4;2158:27;;2201:9;2196:118;2220:5;:12;2216:1;:16;2196:118;;;2269:33;2279:12;2293:5;2299:1;2293:8;;;;;;;;:::i;:::-;;;;;;;;2269:9;:33::i;:::-;2254:48;;2234:3;;;;;:::i;:::-;;;;2196:118;;;;2331:12;2324:19;;;2055:296;;;;:::o;33999:98::-;34052:7;34079:10;34072:17;;33999:98;:::o;88045:147::-;88182:6;88045:147;;;;;:::o;27173:948::-;27226:7;27246:14;27263:1;27246:18;;27313:8;27304:5;:17;27300:106;;27351:8;27342:17;;;;;;:::i;:::-;;;;;27388:2;27378:12;;;;27300:106;27433:8;27424:5;:17;27420:106;;27471:8;27462:17;;;;;;:::i;:::-;;;;;27508:2;27498:12;;;;27420:106;27553:8;27544:5;:17;27540:106;;27591:8;27582:17;;;;;;:::i;:::-;;;;;27628:2;27618:12;;;;27540:106;27673:7;27664:5;:16;27660:103;;27710:7;27701:16;;;;;;:::i;:::-;;;;;27746:1;27736:11;;;;27660:103;27790:7;27781:5;:16;27777:103;;27827:7;27818:16;;;;;;:::i;:::-;;;;;27863:1;27853:11;;;;27777:103;27907:7;27898:5;:16;27894:103;;27944:7;27935:16;;;;;;:::i;:::-;;;;;27980:1;27970:11;;;;27894:103;28024:7;28015:5;:16;28011:68;;28062:1;28052:11;;;;28011:68;28107:6;28100:13;;;27173:948;;;:::o;82094:689::-;82225:19;82231:2;82235:8;82225:5;:19::i;:::-;82304:1;82286:2;:14;;;:19;82282:483;;82326:11;82340:13;;82326:27;;82372:13;82394:8;82388:3;:14;82372:30;;82421:233;82452:62;82491:1;82495:2;82499:7;;;;;;82508:5;82452:30;:62::i;:::-;82447:167;;82550:40;;;;;;;;;;;;;;82447:167;82649:3;82641:5;:11;82421:233;;82736:3;82719:13;;:20;82715:34;;82741:8;;;82715:34;82307:458;;82282:483;82094:689;;;:::o;36230:108::-;36297:8;:6;:8::i;:::-;36289:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;36230:108::o;9485:149::-;9548:7;9579:1;9575;:5;:51;;9606:20;9621:1;9624;9606:14;:20::i;:::-;9575:51;;;9583:20;9598:1;9601;9583:14;:20::i;:::-;9575:51;9568:58;;9485:149;;;;:::o;76376:2966::-;76449:20;76472:13;;76449:36;;76512:1;76500:8;:13;76496:44;;76522:18;;;;;;;;;;;;;;76496:44;76553:61;76583:1;76587:2;76591:12;76605:8;76553:21;:61::i;:::-;77097:1;50097:2;77067:1;:26;;77066:32;77054:8;:45;77028:18;:22;77047:2;77028:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;77376:139;77413:2;77467:33;77490:1;77494:2;77498:1;77467:14;:33::i;:::-;77434:30;77455:8;77434:20;:30::i;:::-;:66;77376:18;:139::i;:::-;77342:17;:31;77360:12;77342:31;;;;;;;;;;;:173;;;;77532:16;77563:11;77592:8;77577:12;:23;77563:37;;78113:16;78109:2;78105:25;78093:37;;78485:12;78445:8;78404:1;78342:25;78283:1;78222;78195:335;78856:1;78842:12;78838:20;78796:346;78897:3;78888:7;78885:16;78796:346;;79115:7;79105:8;79102:1;79075:25;79072:1;79069;79064:59;78950:1;78941:7;78937:15;78926:26;;78796:346;;;78800:77;79187:1;79175:8;:13;79171:45;;79197:19;;;;;;;;;;;;;;79171:45;79249:3;79233:13;:19;;;;76802:2462;;79274:60;79303:1;79307:2;79311:12;79325:8;79274:20;:60::i;:::-;76438:2904;76376:2966;;:::o;9759:268::-;9827:13;9934:1;9928:4;9921:15;9963:1;9957:4;9950:15;10004:4;9998;9988:21;9979:30;;9759:268;;;;:::o;63788:324::-;63858:14;64091:1;64081:8;64078:15;64052:24;64048:46;64038:56;;63788:324;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::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:117;443:1;440;433:12;457:117;566:1;563;556:12;580:102;621:6;672:2;668:7;663:2;656:5;652:14;648:28;638:38;;580:102;;;:::o;688:180::-;736:77;733:1;726:88;833:4;830:1;823:15;857:4;854:1;847:15;874:281;957:27;979:4;957:27;:::i;:::-;949:6;945:40;1087:6;1075:10;1072:22;1051:18;1039:10;1036:34;1033:62;1030:88;;;1098:18;;:::i;:::-;1030:88;1138:10;1134:2;1127:22;917:238;874:281;;:::o;1161:129::-;1195:6;1222:20;;:::i;:::-;1212:30;;1251:33;1279:4;1271:6;1251:33;:::i;:::-;1161:129;;;:::o;1296:308::-;1358:4;1448:18;1440:6;1437:30;1434:56;;;1470:18;;:::i;:::-;1434:56;1508:29;1530:6;1508:29;:::i;:::-;1500:37;;1592:4;1586;1582:15;1574:23;;1296:308;;;:::o;1610:146::-;1707:6;1702:3;1697;1684:30;1748:1;1739:6;1734:3;1730:16;1723:27;1610:146;;;:::o;1762:425::-;1840:5;1865:66;1881:49;1923:6;1881:49;:::i;:::-;1865:66;:::i;:::-;1856:75;;1954:6;1947:5;1940:21;1992:4;1985:5;1981:16;2030:3;2021:6;2016:3;2012:16;2009:25;2006:112;;;2037:79;;:::i;:::-;2006:112;2127:54;2174:6;2169:3;2164;2127:54;:::i;:::-;1846:341;1762:425;;;;;:::o;2207:340::-;2263:5;2312:3;2305:4;2297:6;2293:17;2289:27;2279:122;;2320:79;;:::i;:::-;2279:122;2437:6;2424:20;2462:79;2537:3;2529:6;2522:4;2514:6;2510:17;2462:79;:::i;:::-;2453:88;;2269:278;2207:340;;;;:::o;2553:126::-;2590:7;2630:42;2623:5;2619:54;2608:65;;2553:126;;;:::o;2685:96::-;2722:7;2751:24;2769:5;2751:24;:::i;:::-;2740:35;;2685:96;;;:::o;2787:122::-;2860:24;2878:5;2860:24;:::i;:::-;2853:5;2850:35;2840:63;;2899:1;2896;2889:12;2840:63;2787:122;:::o;2915:139::-;2961:5;2999:6;2986:20;2977:29;;3015:33;3042:5;3015:33;:::i;:::-;2915:139;;;;:::o;3060:117::-;3169:1;3166;3159:12;3183:117;3292:1;3289;3282:12;3323:568;3396:8;3406:6;3456:3;3449:4;3441:6;3437:17;3433:27;3423:122;;3464:79;;:::i;:::-;3423:122;3577:6;3564:20;3554:30;;3607:18;3599:6;3596:30;3593:117;;;3629:79;;:::i;:::-;3593:117;3743:4;3735:6;3731:17;3719:29;;3797:3;3789:4;3781:6;3777:17;3767:8;3763:32;3760:41;3757:128;;;3804:79;;:::i;:::-;3757:128;3323:568;;;;;:::o;3897:1029::-;4011:6;4019;4027;4035;4084:2;4072:9;4063:7;4059:23;4055:32;4052:119;;;4090:79;;:::i;:::-;4052:119;4238:1;4227:9;4223:17;4210:31;4268:18;4260:6;4257:30;4254:117;;;4290:79;;:::i;:::-;4254:117;4395:63;4450:7;4441:6;4430:9;4426:22;4395:63;:::i;:::-;4385:73;;4181:287;4507:2;4533:53;4578:7;4569:6;4558:9;4554:22;4533:53;:::i;:::-;4523:63;;4478:118;4663:2;4652:9;4648:18;4635:32;4694:18;4686:6;4683:30;4680:117;;;4716:79;;:::i;:::-;4680:117;4829:80;4901:7;4892:6;4881:9;4877:22;4829:80;:::i;:::-;4811:98;;;;4606:313;3897:1029;;;;;;;:::o;4932:90::-;4966:7;5009:5;5002:13;4995:21;4984:32;;4932:90;;;:::o;5028:109::-;5109:21;5124:5;5109:21;:::i;:::-;5104:3;5097:34;5028:109;;:::o;5143:210::-;5230:4;5268:2;5257:9;5253:18;5245:26;;5281:65;5343:1;5332:9;5328:17;5319:6;5281:65;:::i;:::-;5143:210;;;;:::o;5359:329::-;5418:6;5467:2;5455:9;5446:7;5442:23;5438:32;5435:119;;;5473:79;;:::i;:::-;5435:119;5593:1;5618:53;5663:7;5654:6;5643:9;5639:22;5618:53;:::i;:::-;5608:63;;5564:117;5359:329;;;;:::o;5694:77::-;5731:7;5760:5;5749:16;;5694:77;;;:::o;5777:118::-;5864:24;5882:5;5864:24;:::i;:::-;5859:3;5852:37;5777:118;;:::o;5901:222::-;5994:4;6032:2;6021:9;6017:18;6009:26;;6045:71;6113:1;6102:9;6098:17;6089:6;6045:71;:::i;:::-;5901:222;;;;:::o;6129:149::-;6165:7;6205:66;6198:5;6194:78;6183:89;;6129:149;;;:::o;6284:120::-;6356:23;6373:5;6356:23;:::i;:::-;6349:5;6346:34;6336:62;;6394:1;6391;6384:12;6336:62;6284:120;:::o;6410:137::-;6455:5;6493:6;6480:20;6471:29;;6509:32;6535:5;6509:32;:::i;:::-;6410:137;;;;:::o;6553:327::-;6611:6;6660:2;6648:9;6639:7;6635:23;6631:32;6628:119;;;6666:79;;:::i;:::-;6628:119;6786:1;6811:52;6855:7;6846:6;6835:9;6831:22;6811:52;:::i;:::-;6801:62;;6757:116;6553:327;;;;:::o;6886:180::-;6934:77;6931:1;6924:88;7031:4;7028:1;7021:15;7055:4;7052:1;7045:15;7072:116;7156:1;7149:5;7146:12;7136:46;;7162:18;;:::i;:::-;7136:46;7072:116;:::o;7194:133::-;7242:7;7271:5;7260:16;;7277:44;7315:5;7277:44;:::i;:::-;7194:133;;;:::o;7333:::-;7392:9;7425:35;7454:5;7425:35;:::i;:::-;7412:48;;7333:133;;;:::o;7472:149::-;7568:46;7608:5;7568:46;:::i;:::-;7563:3;7556:59;7472:149;;:::o;7627:240::-;7729:4;7767:2;7756:9;7752:18;7744:26;;7780:80;7857:1;7846:9;7842:17;7833:6;7780:80;:::i;:::-;7627:240;;;;:::o;7873:99::-;7925:6;7959:5;7953:12;7943:22;;7873:99;;;:::o;7978:169::-;8062:11;8096:6;8091:3;8084:19;8136:4;8131:3;8127:14;8112:29;;7978:169;;;;:::o;8153:246::-;8234:1;8244:113;8258:6;8255:1;8252:13;8244:113;;;8343:1;8338:3;8334:11;8328:18;8324:1;8319:3;8315:11;8308:39;8280:2;8277:1;8273:10;8268:15;;8244:113;;;8391:1;8382:6;8377:3;8373:16;8366:27;8215:184;8153:246;;;:::o;8405:377::-;8493:3;8521:39;8554:5;8521:39;:::i;:::-;8576:71;8640:6;8635:3;8576:71;:::i;:::-;8569:78;;8656:65;8714:6;8709:3;8702:4;8695:5;8691:16;8656:65;:::i;:::-;8746:29;8768:6;8746:29;:::i;:::-;8741:3;8737:39;8730:46;;8497:285;8405:377;;;;:::o;8788:313::-;8901:4;8939:2;8928:9;8924:18;8916:26;;8988:9;8982:4;8978:20;8974:1;8963:9;8959:17;8952:47;9016:78;9089:4;9080:6;9016:78;:::i;:::-;9008:86;;8788:313;;;;:::o;9107:122::-;9180:24;9198:5;9180:24;:::i;:::-;9173:5;9170:35;9160:63;;9219:1;9216;9209:12;9160:63;9107:122;:::o;9235:139::-;9281:5;9319:6;9306:20;9297:29;;9335:33;9362:5;9335:33;:::i;:::-;9235:139;;;;:::o;9380:329::-;9439:6;9488:2;9476:9;9467:7;9463:23;9459:32;9456:119;;;9494:79;;:::i;:::-;9456:119;9614:1;9639:53;9684:7;9675:6;9664:9;9660:22;9639:53;:::i;:::-;9629:63;;9585:117;9380:329;;;;:::o;9715:118::-;9802:24;9820:5;9802:24;:::i;:::-;9797:3;9790:37;9715:118;;:::o;9839:222::-;9932:4;9970:2;9959:9;9955:18;9947:26;;9983:71;10051:1;10040:9;10036:17;10027:6;9983:71;:::i;:::-;9839:222;;;;:::o;10067:474::-;10135:6;10143;10192:2;10180:9;10171:7;10167:23;10163:32;10160:119;;;10198:79;;:::i;:::-;10160:119;10318:1;10343:53;10388:7;10379:6;10368:9;10364:22;10343:53;:::i;:::-;10333:63;;10289:117;10445:2;10471:53;10516:7;10507:6;10496:9;10492:22;10471:53;:::i;:::-;10461:63;;10416:118;10067:474;;;;;:::o;10547:509::-;10616:6;10665:2;10653:9;10644:7;10640:23;10636:32;10633:119;;;10671:79;;:::i;:::-;10633:119;10819:1;10808:9;10804:17;10791:31;10849:18;10841:6;10838:30;10835:117;;;10871:79;;:::i;:::-;10835:117;10976:63;11031:7;11022:6;11011:9;11007:22;10976:63;:::i;:::-;10966:73;;10762:287;10547:509;;;;:::o;11062:77::-;11099:7;11128:5;11117:16;;11062:77;;;:::o;11145:122::-;11218:24;11236:5;11218:24;:::i;:::-;11211:5;11208:35;11198:63;;11257:1;11254;11247:12;11198:63;11145:122;:::o;11273:139::-;11319:5;11357:6;11344:20;11335:29;;11373:33;11400:5;11373:33;:::i;:::-;11273:139;;;;:::o;11418:849::-;11522:6;11530;11538;11546;11595:2;11583:9;11574:7;11570:23;11566:32;11563:119;;;11601:79;;:::i;:::-;11563:119;11721:1;11746:53;11791:7;11782:6;11771:9;11767:22;11746:53;:::i;:::-;11736:63;;11692:117;11876:2;11865:9;11861:18;11848:32;11907:18;11899:6;11896:30;11893:117;;;11929:79;;:::i;:::-;11893:117;12042:80;12114:7;12105:6;12094:9;12090:22;12042:80;:::i;:::-;12024:98;;;;11819:313;12171:2;12197:53;12242:7;12233:6;12222:9;12218:22;12197:53;:::i;:::-;12187:63;;12142:118;11418:849;;;;;;;:::o;12273:654::-;12351:6;12359;12408:2;12396:9;12387:7;12383:23;12379:32;12376:119;;;12414:79;;:::i;:::-;12376:119;12562:1;12551:9;12547:17;12534:31;12592:18;12584:6;12581:30;12578:117;;;12614:79;;:::i;:::-;12578:117;12719:63;12774:7;12765:6;12754:9;12750:22;12719:63;:::i;:::-;12709:73;;12505:287;12831:2;12857:53;12902:7;12893:6;12882:9;12878:22;12857:53;:::i;:::-;12847:63;;12802:118;12273:654;;;;;:::o;12933:86::-;12968:7;13008:4;13001:5;12997:16;12986:27;;12933:86;;;:::o;13025:112::-;13108:22;13124:5;13108:22;:::i;:::-;13103:3;13096:35;13025:112;;:::o;13143:214::-;13232:4;13270:2;13259:9;13255:18;13247:26;;13283:67;13347:1;13336:9;13332:17;13323:6;13283:67;:::i;:::-;13143:214;;;;:::o;13363:654::-;13441:6;13449;13498:2;13486:9;13477:7;13473:23;13469:32;13466:119;;;13504:79;;:::i;:::-;13466:119;13652:1;13641:9;13637:17;13624:31;13682:18;13674:6;13671:30;13668:117;;;13704:79;;:::i;:::-;13668:117;13809:63;13864:7;13855:6;13844:9;13840:22;13809:63;:::i;:::-;13799:73;;13595:287;13921:2;13947:53;13992:7;13983:6;13972:9;13968:22;13947:53;:::i;:::-;13937:63;;13892:118;13363:654;;;;;:::o;14023:619::-;14100:6;14108;14116;14165:2;14153:9;14144:7;14140:23;14136:32;14133:119;;;14171:79;;:::i;:::-;14133:119;14291:1;14316:53;14361:7;14352:6;14341:9;14337:22;14316:53;:::i;:::-;14306:63;;14262:117;14418:2;14444:53;14489:7;14480:6;14469:9;14465:22;14444:53;:::i;:::-;14434:63;;14389:118;14546:2;14572:53;14617:7;14608:6;14597:9;14593:22;14572:53;:::i;:::-;14562:63;;14517:118;14023:619;;;;;:::o;14648:654::-;14726:6;14734;14783:2;14771:9;14762:7;14758:23;14754:32;14751:119;;;14789:79;;:::i;:::-;14751:119;14937:1;14926:9;14922:17;14909:31;14967:18;14959:6;14956:30;14953:117;;;14989:79;;:::i;:::-;14953:117;15094:63;15149:7;15140:6;15129:9;15125:22;15094:63;:::i;:::-;15084:73;;14880:287;15206:2;15232:53;15277:7;15268:6;15257:9;15253:22;15232:53;:::i;:::-;15222:63;;15177:118;14648:654;;;;;:::o;15308:751::-;15529:4;15567:3;15556:9;15552:19;15544:27;;15581:67;15645:1;15634:9;15630:17;15621:6;15581:67;:::i;:::-;15658:68;15722:2;15711:9;15707:18;15698:6;15658:68;:::i;:::-;15736:72;15804:2;15793:9;15789:18;15780:6;15736:72;:::i;:::-;15818;15886:2;15875:9;15871:18;15862:6;15818:72;:::i;:::-;15900:73;15968:3;15957:9;15953:19;15944:6;15900:73;:::i;:::-;15983:69;16047:3;16036:9;16032:19;16023:6;15983:69;:::i;:::-;15308:751;;;;;;;;;:::o;16065:118::-;16136:22;16152:5;16136:22;:::i;:::-;16129:5;16126:33;16116:61;;16173:1;16170;16163:12;16116:61;16065:118;:::o;16189:135::-;16233:5;16271:6;16258:20;16249:29;;16287:31;16312:5;16287:31;:::i;:::-;16189:135;;;;:::o;16330:325::-;16387:6;16436:2;16424:9;16415:7;16411:23;16407:32;16404:119;;;16442:79;;:::i;:::-;16404:119;16562:1;16587:51;16630:7;16621:6;16610:9;16606:22;16587:51;:::i;:::-;16577:61;;16533:115;16330:325;;;;:::o;16661:650::-;16737:6;16745;16794:2;16782:9;16773:7;16769:23;16765:32;16762:119;;;16800:79;;:::i;:::-;16762:119;16948:1;16937:9;16933:17;16920:31;16978:18;16970:6;16967:30;16964:117;;;17000:79;;:::i;:::-;16964:117;17105:63;17160:7;17151:6;17140:9;17136:22;17105:63;:::i;:::-;17095:73;;16891:287;17217:2;17243:51;17286:7;17277:6;17266:9;17262:22;17243:51;:::i;:::-;17233:61;;17188:116;16661:650;;;;;:::o;17317:1229::-;17427:6;17435;17443;17451;17459;17467;17516:3;17504:9;17495:7;17491:23;17487:33;17484:120;;;17523:79;;:::i;:::-;17484:120;17671:1;17660:9;17656:17;17643:31;17701:18;17693:6;17690:30;17687:117;;;17723:79;;:::i;:::-;17687:117;17828:63;17883:7;17874:6;17863:9;17859:22;17828:63;:::i;:::-;17818:73;;17614:287;17940:2;17966:51;18009:7;18000:6;17989:9;17985:22;17966:51;:::i;:::-;17956:61;;17911:116;18066:2;18092:51;18135:7;18126:6;18115:9;18111:22;18092:51;:::i;:::-;18082:61;;18037:116;18192:2;18218:53;18263:7;18254:6;18243:9;18239:22;18218:53;:::i;:::-;18208:63;;18163:118;18320:3;18347:53;18392:7;18383:6;18372:9;18368:22;18347:53;:::i;:::-;18337:63;;18291:119;18449:3;18476:53;18521:7;18512:6;18501:9;18497:22;18476:53;:::i;:::-;18466:63;;18420:119;17317:1229;;;;;;;;:::o;18552:700::-;18645:6;18653;18661;18710:2;18698:9;18689:7;18685:23;18681:32;18678:119;;;18716:79;;:::i;:::-;18678:119;18836:1;18861:51;18904:7;18895:6;18884:9;18880:22;18861:51;:::i;:::-;18851:61;;18807:115;18989:2;18978:9;18974:18;18961:32;19020:18;19012:6;19009:30;19006:117;;;19042:79;;:::i;:::-;19006:117;19155:80;19227:7;19218:6;19207:9;19203:22;19155:80;:::i;:::-;19137:98;;;;18932:313;18552:700;;;;;:::o;19258:321::-;19345:4;19435:18;19427:6;19424:30;19421:56;;;19457:18;;:::i;:::-;19421:56;19507:4;19499:6;19495:17;19487:25;;19567:4;19561;19557:15;19549:23;;19258:321;;;:::o;19601:945::-;19707:5;19732:91;19748:74;19815:6;19748:74;:::i;:::-;19732:91;:::i;:::-;19723:100;;19843:5;19872:6;19865:5;19858:21;19906:4;19899:5;19895:16;19888:23;;19959:4;19951:6;19947:17;19939:6;19935:30;19988:3;19980:6;19977:15;19974:122;;;20007:79;;:::i;:::-;19974:122;20122:6;20105:435;20139:6;20134:3;20131:15;20105:435;;;20228:3;20215:17;20264:18;20251:11;20248:35;20245:122;;;20286:79;;:::i;:::-;20245:122;20410:11;20402:6;20398:24;20448:47;20491:3;20479:10;20448:47;:::i;:::-;20443:3;20436:60;20525:4;20520:3;20516:14;20509:21;;20181:359;;20165:4;20160:3;20156:14;20149:21;;20105:435;;;20109:21;19713:833;;19601:945;;;;;:::o;20568:390::-;20649:5;20698:3;20691:4;20683:6;20679:17;20675:27;20665:122;;20706:79;;:::i;:::-;20665:122;20823:6;20810:20;20848:104;20948:3;20940:6;20933:4;20925:6;20921:17;20848:104;:::i;:::-;20839:113;;20655:303;20568:390;;;;:::o;20964:559::-;21058:6;21107:2;21095:9;21086:7;21082:23;21078:32;21075:119;;;21113:79;;:::i;:::-;21075:119;21261:1;21250:9;21246:17;21233:31;21291:18;21283:6;21280:30;21277:117;;;21313:79;;:::i;:::-;21277:117;21418:88;21498:7;21489:6;21478:9;21474:22;21418:88;:::i;:::-;21408:98;;21204:312;20964:559;;;;:::o;21529:116::-;21599:21;21614:5;21599:21;:::i;:::-;21592:5;21589:32;21579:60;;21635:1;21632;21625:12;21579:60;21529:116;:::o;21651:133::-;21694:5;21732:6;21719:20;21710:29;;21748:30;21772:5;21748:30;:::i;:::-;21651:133;;;;:::o;21790:468::-;21855:6;21863;21912:2;21900:9;21891:7;21887:23;21883:32;21880:119;;;21918:79;;:::i;:::-;21880:119;22038:1;22063:53;22108:7;22099:6;22088:9;22084:22;22063:53;:::i;:::-;22053:63;;22009:117;22165:2;22191:50;22233:7;22224:6;22213:9;22209:22;22191:50;:::i;:::-;22181:60;;22136:115;21790:468;;;;;:::o;22264:307::-;22325:4;22415:18;22407:6;22404:30;22401:56;;;22437:18;;:::i;:::-;22401:56;22475:29;22497:6;22475:29;:::i;:::-;22467:37;;22559:4;22553;22549:15;22541:23;;22264:307;;;:::o;22577:423::-;22654:5;22679:65;22695:48;22736:6;22695:48;:::i;:::-;22679:65;:::i;:::-;22670:74;;22767:6;22760:5;22753:21;22805:4;22798:5;22794:16;22843:3;22834:6;22829:3;22825:16;22822:25;22819:112;;;22850:79;;:::i;:::-;22819:112;22940:54;22987:6;22982:3;22977;22940:54;:::i;:::-;22660:340;22577:423;;;;;:::o;23019:338::-;23074:5;23123:3;23116:4;23108:6;23104:17;23100:27;23090:122;;23131:79;;:::i;:::-;23090:122;23248:6;23235:20;23273:78;23347:3;23339:6;23332:4;23324:6;23320:17;23273:78;:::i;:::-;23264:87;;23080:277;23019:338;;;;:::o;23363:943::-;23458:6;23466;23474;23482;23531:3;23519:9;23510:7;23506:23;23502:33;23499:120;;;23538:79;;:::i;:::-;23499:120;23658:1;23683:53;23728:7;23719:6;23708:9;23704:22;23683:53;:::i;:::-;23673:63;;23629:117;23785:2;23811:53;23856:7;23847:6;23836:9;23832:22;23811:53;:::i;:::-;23801:63;;23756:118;23913:2;23939:53;23984:7;23975:6;23964:9;23960:22;23939:53;:::i;:::-;23929:63;;23884:118;24069:2;24058:9;24054:18;24041:32;24100:18;24092:6;24089:30;24086:117;;;24122:79;;:::i;:::-;24086:117;24227:62;24281:7;24272:6;24261:9;24257:22;24227:62;:::i;:::-;24217:72;;24012:287;23363:943;;;;;;;:::o;24312:648::-;24387:6;24395;24444:2;24432:9;24423:7;24419:23;24415:32;24412:119;;;24450:79;;:::i;:::-;24412:119;24598:1;24587:9;24583:17;24570:31;24628:18;24620:6;24617:30;24614:117;;;24650:79;;:::i;:::-;24614:117;24755:63;24810:7;24801:6;24790:9;24786:22;24755:63;:::i;:::-;24745:73;;24541:287;24867:2;24893:50;24935:7;24926:6;24915:9;24911:22;24893:50;:::i;:::-;24883:60;;24838:115;24312:648;;;;;:::o;24966:474::-;25034:6;25042;25091:2;25079:9;25070:7;25066:23;25062:32;25059:119;;;25097:79;;:::i;:::-;25059:119;25217:1;25242:53;25287:7;25278:6;25267:9;25263:22;25242:53;:::i;:::-;25232:63;;25188:117;25344:2;25370:53;25415:7;25406:6;25395:9;25391:22;25370:53;:::i;:::-;25360:63;;25315:118;24966:474;;;;;:::o;25446:148::-;25548:11;25585:3;25570:18;;25446:148;;;;:::o;25600:390::-;25706:3;25734:39;25767:5;25734:39;:::i;:::-;25789:89;25871:6;25866:3;25789:89;:::i;:::-;25782:96;;25887:65;25945:6;25940:3;25933:4;25926:5;25922:16;25887:65;:::i;:::-;25977:6;25972:3;25968:16;25961:23;;25710:280;25600:390;;;;:::o;25996:275::-;26128:3;26150:95;26241:3;26232:6;26150:95;:::i;:::-;26143:102;;26262:3;26255:10;;25996:275;;;;:::o;26277:179::-;26417:31;26413:1;26405:6;26401:14;26394:55;26277:179;:::o;26462:366::-;26604:3;26625:67;26689:2;26684:3;26625:67;:::i;:::-;26618:74;;26701:93;26790:3;26701:93;:::i;:::-;26819:2;26814:3;26810:12;26803:19;;26462:366;;;:::o;26834:419::-;27000:4;27038:2;27027:9;27023:18;27015:26;;27087:9;27081:4;27077:20;27073:1;27062:9;27058:17;27051:47;27115:131;27241:4;27115:131;:::i;:::-;27107:139;;26834:419;;;:::o;27259:152::-;27399:4;27395:1;27387:6;27383:14;27376:28;27259:152;:::o;27417:400::-;27577:3;27598:84;27680:1;27675:3;27598:84;:::i;:::-;27591:91;;27691:93;27780:3;27691:93;:::i;:::-;27809:1;27804:3;27800:11;27793:18;;27417:400;;;:::o;27823:381::-;28008:3;28030:148;28174:3;28030:148;:::i;:::-;28023:155;;28195:3;28188:10;;27823:381;;;:::o;28210:180::-;28258:77;28255:1;28248:88;28355:4;28352:1;28345:15;28379:4;28376:1;28369:15;28396:320;28440:6;28477:1;28471:4;28467:12;28457:22;;28524:1;28518:4;28514:12;28545:18;28535:81;;28601:4;28593:6;28589:17;28579:27;;28535:81;28663:2;28655:6;28652:14;28632:18;28629:38;28626:84;;28682:18;;:::i;:::-;28626:84;28447:269;28396:320;;;:::o;28722:94::-;28755:8;28803:5;28799:2;28795:14;28774:35;;28722:94;;;:::o;28822:::-;28861:7;28890:20;28904:5;28890:20;:::i;:::-;28879:31;;28822:94;;;:::o;28922:100::-;28961:7;28990:26;29010:5;28990:26;:::i;:::-;28979:37;;28922:100;;;:::o;29028:157::-;29133:45;29153:24;29171:5;29153:24;:::i;:::-;29133:45;:::i;:::-;29128:3;29121:58;29028:157;;:::o;29191:256::-;29303:3;29318:75;29389:3;29380:6;29318:75;:::i;:::-;29418:2;29413:3;29409:12;29402:19;;29438:3;29431:10;;29191:256;;;;:::o;29453:179::-;29593:31;29589:1;29581:6;29577:14;29570:55;29453:179;:::o;29638:366::-;29780:3;29801:67;29865:2;29860:3;29801:67;:::i;:::-;29794:74;;29877:93;29966:3;29877:93;:::i;:::-;29995:2;29990:3;29986:12;29979:19;;29638:366;;;:::o;30010:419::-;30176:4;30214:2;30203:9;30199:18;30191:26;;30263:9;30257:4;30253:20;30249:1;30238:9;30234:17;30227:47;30291:131;30417:4;30291:131;:::i;:::-;30283:139;;30010:419;;;:::o;30435:172::-;30575:24;30571:1;30563:6;30559:14;30552:48;30435:172;:::o;30613:366::-;30755:3;30776:67;30840:2;30835:3;30776:67;:::i;:::-;30769:74;;30852:93;30941:3;30852:93;:::i;:::-;30970:2;30965:3;30961:12;30954:19;;30613:366;;;:::o;30985:419::-;31151:4;31189:2;31178:9;31174:18;31166:26;;31238:9;31232:4;31228:20;31224:1;31213:9;31209:17;31202:47;31266:131;31392:4;31266:131;:::i;:::-;31258:139;;30985:419;;;:::o;31410:176::-;31550:28;31546:1;31538:6;31534:14;31527:52;31410:176;:::o;31592:366::-;31734:3;31755:67;31819:2;31814:3;31755:67;:::i;:::-;31748:74;;31831:93;31920:3;31831:93;:::i;:::-;31949:2;31944:3;31940:12;31933:19;;31592:366;;;:::o;31964:419::-;32130:4;32168:2;32157:9;32153:18;32145:26;;32217:9;32211:4;32207:20;32203:1;32192:9;32188:17;32181:47;32245:131;32371:4;32245:131;:::i;:::-;32237:139;;31964:419;;;:::o;32389:236::-;32529:34;32525:1;32517:6;32513:14;32506:58;32598:19;32593:2;32585:6;32581:15;32574:44;32389:236;:::o;32631:366::-;32773:3;32794:67;32858:2;32853:3;32794:67;:::i;:::-;32787:74;;32870:93;32959:3;32870:93;:::i;:::-;32988:2;32983:3;32979:12;32972:19;;32631:366;;;:::o;33003:419::-;33169:4;33207:2;33196:9;33192:18;33184:26;;33256:9;33250:4;33246:20;33242:1;33231:9;33227:17;33220:47;33284:131;33410:4;33284:131;:::i;:::-;33276:139;;33003:419;;;:::o;33428:180::-;33476:77;33473:1;33466:88;33573:4;33570:1;33563:15;33597:4;33594:1;33587:15;33614:191;33654:3;33673:20;33691:1;33673:20;:::i;:::-;33668:25;;33707:20;33725:1;33707:20;:::i;:::-;33702:25;;33750:1;33747;33743:9;33736:16;;33771:3;33768:1;33765:10;33762:36;;;33778:18;;:::i;:::-;33762:36;33614:191;;;;:::o;33811:248::-;33951:34;33947:1;33939:6;33935:14;33928:58;34020:31;34015:2;34007:6;34003:15;33996:56;33811:248;:::o;34065:366::-;34207:3;34228:67;34292:2;34287:3;34228:67;:::i;:::-;34221:74;;34304:93;34393:3;34304:93;:::i;:::-;34422:2;34417:3;34413:12;34406:19;;34065:366;;;:::o;34437:419::-;34603:4;34641:2;34630:9;34626:18;34618:26;;34690:9;34684:4;34680:20;34676:1;34665:9;34661:17;34654:47;34718:131;34844:4;34718:131;:::i;:::-;34710:139;;34437:419;;;:::o;34862:242::-;35002:34;34998:1;34990:6;34986:14;34979:58;35071:25;35066:2;35058:6;35054:15;35047:50;34862:242;:::o;35110:366::-;35252:3;35273:67;35337:2;35332:3;35273:67;:::i;:::-;35266:74;;35349:93;35438:3;35349:93;:::i;:::-;35467:2;35462:3;35458:12;35451:19;;35110:366;;;:::o;35482:419::-;35648:4;35686:2;35675:9;35671:18;35663:26;;35735:9;35729:4;35725:20;35721:1;35710:9;35706:17;35699:47;35763:131;35889:4;35763:131;:::i;:::-;35755:139;;35482:419;;;:::o;35907:188::-;35945:3;35964:18;35980:1;35964:18;:::i;:::-;35959:23;;35996:18;36012:1;35996:18;:::i;:::-;35991:23;;36037:1;36034;36030:9;36023:16;;36060:4;36055:3;36052:13;36049:39;;;36068:18;;:::i;:::-;36049:39;35907:188;;;;:::o;36101:295::-;36241:34;36237:1;36229:6;36225:14;36218:58;36310:34;36305:2;36297:6;36293:15;36286:59;36379:9;36374:2;36366:6;36362:15;36355:34;36101:295;:::o;36402:366::-;36544:3;36565:67;36629:2;36624:3;36565:67;:::i;:::-;36558:74;;36641:93;36730:3;36641:93;:::i;:::-;36759:2;36754:3;36750:12;36743:19;;36402:366;;;:::o;36774:419::-;36940:4;36978:2;36967:9;36963:18;36955:26;;37027:9;37021:4;37017:20;37013:1;37002:9;36998:17;36991:47;37055:131;37181:4;37055:131;:::i;:::-;37047:139;;36774:419;;;:::o;37199:410::-;37239:7;37262:20;37280:1;37262:20;:::i;:::-;37257:25;;37296:20;37314:1;37296:20;:::i;:::-;37291:25;;37351:1;37348;37344:9;37373:30;37391:11;37373:30;:::i;:::-;37362:41;;37552:1;37543:7;37539:15;37536:1;37533:22;37513:1;37506:9;37486:83;37463:139;;37582:18;;:::i;:::-;37463:139;37247:362;37199:410;;;;:::o;37615:231::-;37755:34;37751:1;37743:6;37739:14;37732:58;37824:14;37819:2;37811:6;37807:15;37800:39;37615:231;:::o;37852:366::-;37994:3;38015:67;38079:2;38074:3;38015:67;:::i;:::-;38008:74;;38091:93;38180:3;38091:93;:::i;:::-;38209:2;38204:3;38200:12;38193:19;;37852:366;;;:::o;38224:419::-;38390:4;38428:2;38417:9;38413:18;38405:26;;38477:9;38471:4;38467:20;38463:1;38452:9;38448:17;38441:47;38505:131;38631:4;38505:131;:::i;:::-;38497:139;;38224:419;;;:::o;38649:191::-;38687:4;38707:18;38723:1;38707:18;:::i;:::-;38702:23;;38739:18;38755:1;38739:18;:::i;:::-;38734:23;;38781:1;38778;38774:9;38766:17;;38805:4;38799;38796:14;38793:40;;;38813:18;;:::i;:::-;38793:40;38649:191;;;;:::o;38846:156::-;38986:8;38982:1;38974:6;38970:14;38963:32;38846:156;:::o;39008:400::-;39168:3;39189:84;39271:1;39266:3;39189:84;:::i;:::-;39182:91;;39282:93;39371:3;39282:93;:::i;:::-;39400:1;39395:3;39391:11;39384:18;;39008:400;;;:::o;39414:381::-;39599:3;39621:148;39765:3;39621:148;:::i;:::-;39614:155;;39786:3;39779:10;;39414:381;;;:::o;39801:234::-;39941:34;39937:1;39929:6;39925:14;39918:58;40010:17;40005:2;39997:6;39993:15;39986:42;39801:234;:::o;40041:366::-;40183:3;40204:67;40268:2;40263:3;40204:67;:::i;:::-;40197:74;;40280:93;40369:3;40280:93;:::i;:::-;40398:2;40393:3;40389:12;40382:19;;40041:366;;;:::o;40413:419::-;40579:4;40617:2;40606:9;40602:18;40594:26;;40666:9;40660:4;40656:20;40652:1;40641:9;40637:17;40630:47;40694:131;40820:4;40694:131;:::i;:::-;40686:139;;40413:419;;;:::o;40838:141::-;40887:4;40910:3;40902:11;;40933:3;40930:1;40923:14;40967:4;40964:1;40954:18;40946:26;;40838:141;;;:::o;41009:874::-;41112:3;41149:5;41143:12;41178:36;41204:9;41178:36;:::i;:::-;41230:89;41312:6;41307:3;41230:89;:::i;:::-;41223:96;;41350:1;41339:9;41335:17;41366:1;41361:166;;;;41541:1;41536:341;;;;41328:549;;41361:166;41445:4;41441:9;41430;41426:25;41421:3;41414:38;41507:6;41500:14;41493:22;41485:6;41481:35;41476:3;41472:45;41465:52;;41361:166;;41536:341;41603:38;41635:5;41603:38;:::i;:::-;41663:1;41677:154;41691:6;41688:1;41685:13;41677:154;;;41765:7;41759:14;41755:1;41750:3;41746:11;41739:35;41815:1;41806:7;41802:15;41791:26;;41713:4;41710:1;41706:12;41701:17;;41677:154;;;41860:6;41855:3;41851:16;41844:23;;41543:334;;41328:549;;41116:767;;41009:874;;;;:::o;41889:155::-;42029:7;42025:1;42017:6;42013:14;42006:31;41889:155;:::o;42050:400::-;42210:3;42231:84;42313:1;42308:3;42231:84;:::i;:::-;42224:91;;42324:93;42413:3;42324:93;:::i;:::-;42442:1;42437:3;42433:11;42426:18;;42050:400;;;:::o;42456:695::-;42734:3;42756:92;42844:3;42835:6;42756:92;:::i;:::-;42749:99;;42865:95;42956:3;42947:6;42865:95;:::i;:::-;42858:102;;42977:148;43121:3;42977:148;:::i;:::-;42970:155;;43142:3;43135:10;;42456:695;;;;;:::o;43157:180::-;43205:77;43202:1;43195:88;43302:4;43299:1;43292:15;43326:4;43323:1;43316:15;43343:176;43375:1;43392:20;43410:1;43392:20;:::i;:::-;43387:25;;43426:20;43444:1;43426:20;:::i;:::-;43421:25;;43465:1;43455:35;;43470:18;;:::i;:::-;43455:35;43511:1;43508;43504:9;43499:14;;43343:176;;;;:::o;43525:180::-;43573:77;43570:1;43563:88;43670:4;43667:1;43660:15;43694:4;43691:1;43684:15;43711:93;43748:6;43795:2;43790;43783:5;43779:14;43775:23;43765:33;;43711:93;;;:::o;43810:107::-;43854:8;43904:5;43898:4;43894:16;43873:37;;43810:107;;;;:::o;43923:393::-;43992:6;44042:1;44030:10;44026:18;44065:97;44095:66;44084:9;44065:97;:::i;:::-;44183:39;44213:8;44202:9;44183:39;:::i;:::-;44171:51;;44255:4;44251:9;44244:5;44240:21;44231:30;;44304:4;44294:8;44290:19;44283:5;44280:30;44270:40;;43999:317;;43923:393;;;;;:::o;44322:60::-;44350:3;44371:5;44364:12;;44322:60;;;:::o;44388:142::-;44438:9;44471:53;44489:34;44498:24;44516:5;44498:24;:::i;:::-;44489:34;:::i;:::-;44471:53;:::i;:::-;44458:66;;44388:142;;;:::o;44536:75::-;44579:3;44600:5;44593:12;;44536:75;;;:::o;44617:269::-;44727:39;44758:7;44727:39;:::i;:::-;44788:91;44837:41;44861:16;44837:41;:::i;:::-;44829:6;44822:4;44816:11;44788:91;:::i;:::-;44782:4;44775:105;44693:193;44617:269;;;:::o;44892:73::-;44937:3;44892:73;:::o;44971:189::-;45048:32;;:::i;:::-;45089:65;45147:6;45139;45133:4;45089:65;:::i;:::-;45024:136;44971:189;;:::o;45166:186::-;45226:120;45243:3;45236:5;45233:14;45226:120;;;45297:39;45334:1;45327:5;45297:39;:::i;:::-;45270:1;45263:5;45259:13;45250:22;;45226:120;;;45166:186;;:::o;45358:543::-;45459:2;45454:3;45451:11;45448:446;;;45493:38;45525:5;45493:38;:::i;:::-;45577:29;45595:10;45577:29;:::i;:::-;45567:8;45563:44;45760:2;45748:10;45745:18;45742:49;;;45781:8;45766:23;;45742:49;45804:80;45860:22;45878:3;45860:22;:::i;:::-;45850:8;45846:37;45833:11;45804:80;:::i;:::-;45463:431;;45448:446;45358:543;;;:::o;45907:117::-;45961:8;46011:5;46005:4;46001:16;45980:37;;45907:117;;;;:::o;46030:169::-;46074:6;46107:51;46155:1;46151:6;46143:5;46140:1;46136:13;46107:51;:::i;:::-;46103:56;46188:4;46182;46178:15;46168:25;;46081:118;46030:169;;;;:::o;46204:295::-;46280:4;46426:29;46451:3;46445:4;46426:29;:::i;:::-;46418:37;;46488:3;46485:1;46481:11;46475:4;46472:21;46464:29;;46204:295;;;;:::o;46504:1395::-;46621:37;46654:3;46621:37;:::i;:::-;46723:18;46715:6;46712:30;46709:56;;;46745:18;;:::i;:::-;46709:56;46789:38;46821:4;46815:11;46789:38;:::i;:::-;46874:67;46934:6;46926;46920:4;46874:67;:::i;:::-;46968:1;46992:4;46979:17;;47024:2;47016:6;47013:14;47041:1;47036:618;;;;47698:1;47715:6;47712:77;;;47764:9;47759:3;47755:19;47749:26;47740:35;;47712:77;47815:67;47875:6;47868:5;47815:67;:::i;:::-;47809:4;47802:81;47671:222;47006:887;;47036:618;47088:4;47084:9;47076:6;47072:22;47122:37;47154:4;47122:37;:::i;:::-;47181:1;47195:208;47209:7;47206:1;47203:14;47195:208;;;47288:9;47283:3;47279:19;47273:26;47265:6;47258:42;47339:1;47331:6;47327:14;47317:24;;47386:2;47375:9;47371:18;47358:31;;47232:4;47229:1;47225:12;47220:17;;47195:208;;;47431:6;47422:7;47419:19;47416:179;;;47489:9;47484:3;47480:19;47474:26;47532:48;47574:4;47566:6;47562:17;47551:9;47532:48;:::i;:::-;47524:6;47517:64;47439:156;47416:179;47641:1;47637;47629:6;47625:14;47621:22;47615:4;47608:36;47043:611;;;47006:887;;46596:1303;;;46504:1395;;:::o;47905:174::-;48045:26;48041:1;48033:6;48029:14;48022:50;47905:174;:::o;48085:366::-;48227:3;48248:67;48312:2;48307:3;48248:67;:::i;:::-;48241:74;;48324:93;48413:3;48324:93;:::i;:::-;48442:2;48437:3;48433:12;48426:19;;48085:366;;;:::o;48457:419::-;48623:4;48661:2;48650:9;48646:18;48638:26;;48710:9;48704:4;48700:20;48696:1;48685:9;48681:17;48674:47;48738:131;48864:4;48738:131;:::i;:::-;48730:139;;48457:419;;;:::o;48882:85::-;48927:7;48956:5;48945:16;;48882:85;;;:::o;48973:158::-;49031:9;49064:61;49082:42;49091:32;49117:5;49091:32;:::i;:::-;49082:42;:::i;:::-;49064:61;:::i;:::-;49051:74;;48973:158;;;:::o;49137:147::-;49232:45;49271:5;49232:45;:::i;:::-;49227:3;49220:58;49137:147;;:::o;49290:340::-;49415:4;49453:2;49442:9;49438:18;49430:26;;49466:67;49530:1;49519:9;49515:17;49506:6;49466:67;:::i;:::-;49543:80;49619:2;49608:9;49604:18;49595:6;49543:80;:::i;:::-;49290:340;;;;;:::o;49636:225::-;49776:34;49772:1;49764:6;49760:14;49753:58;49845:8;49840:2;49832:6;49828:15;49821:33;49636:225;:::o;49867:366::-;50009:3;50030:67;50094:2;50089:3;50030:67;:::i;:::-;50023:74;;50106:93;50195:3;50106:93;:::i;:::-;50224:2;50219:3;50215:12;50208:19;;49867:366;;;:::o;50239:419::-;50405:4;50443:2;50432:9;50428:18;50420:26;;50492:9;50486:4;50482:20;50478:1;50467:9;50463:17;50456:47;50520:131;50646:4;50520:131;:::i;:::-;50512:139;;50239:419;;;:::o;50664:182::-;50804:34;50800:1;50792:6;50788:14;50781:58;50664:182;:::o;50852:366::-;50994:3;51015:67;51079:2;51074:3;51015:67;:::i;:::-;51008:74;;51091:93;51180:3;51091:93;:::i;:::-;51209:2;51204:3;51200:12;51193:19;;50852:366;;;:::o;51224:419::-;51390:4;51428:2;51417:9;51413:18;51405:26;;51477:9;51471:4;51467:20;51463:1;51452:9;51448:17;51441:47;51505:131;51631:4;51505:131;:::i;:::-;51497:139;;51224:419;;;:::o;51649:181::-;51789:33;51785:1;51777:6;51773:14;51766:57;51649:181;:::o;51836:366::-;51978:3;51999:67;52063:2;52058:3;51999:67;:::i;:::-;51992:74;;52075:93;52164:3;52075:93;:::i;:::-;52193:2;52188:3;52184:12;52177:19;;51836:366;;;:::o;52208:419::-;52374:4;52412:2;52401:9;52397:18;52389:26;;52461:9;52455:4;52451:20;52447:1;52436:9;52432:17;52425:47;52489:131;52615:4;52489:131;:::i;:::-;52481:139;;52208:419;;;:::o;52633:166::-;52773:18;52769:1;52761:6;52757:14;52750:42;52633:166;:::o;52805:366::-;52947:3;52968:67;53032:2;53027:3;52968:67;:::i;:::-;52961:74;;53044:93;53133:3;53044:93;:::i;:::-;53162:2;53157:3;53153:12;53146:19;;52805:366;;;:::o;53177:419::-;53343:4;53381:2;53370:9;53366:18;53358:26;;53430:9;53424:4;53420:20;53416:1;53405:9;53401:17;53394:47;53458:131;53584:4;53458:131;:::i;:::-;53450:139;;53177:419;;;:::o;53602:179::-;53742:31;53738:1;53730:6;53726:14;53719:55;53602:179;:::o;53787:366::-;53929:3;53950:67;54014:2;54009:3;53950:67;:::i;:::-;53943:74;;54026:93;54115:3;54026:93;:::i;:::-;54144:2;54139:3;54135:12;54128:19;;53787:366;;;:::o;54159:419::-;54325:4;54363:2;54352:9;54348:18;54340:26;;54412:9;54406:4;54402:20;54398:1;54387:9;54383:17;54376:47;54440:131;54566:4;54440:131;:::i;:::-;54432:139;;54159:419;;;:::o;54584:238::-;54724:34;54720:1;54712:6;54708:14;54701:58;54793:21;54788:2;54780:6;54776:15;54769:46;54584:238;:::o;54828:366::-;54970:3;54991:67;55055:2;55050:3;54991:67;:::i;:::-;54984:74;;55067:93;55156:3;55067:93;:::i;:::-;55185:2;55180:3;55176:12;55169:19;;54828:366;;;:::o;55200:419::-;55366:4;55404:2;55393:9;55389:18;55381:26;;55453:9;55447:4;55443:20;55439:1;55428:9;55424:17;55417:47;55481:131;55607:4;55481:131;:::i;:::-;55473:139;;55200:419;;;:::o;55625:324::-;55742:4;55780:2;55769:9;55765:18;55757:26;;55793:67;55857:1;55846:9;55842:17;55833:6;55793:67;:::i;:::-;55870:72;55938:2;55927:9;55923:18;55914:6;55870:72;:::i;:::-;55625:324;;;;;:::o;55955:98::-;56006:6;56040:5;56034:12;56024:22;;55955:98;;;:::o;56059:168::-;56142:11;56176:6;56171:3;56164:19;56216:4;56211:3;56207:14;56192:29;;56059:168;;;;:::o;56233:373::-;56319:3;56347:38;56379:5;56347:38;:::i;:::-;56401:70;56464:6;56459:3;56401:70;:::i;:::-;56394:77;;56480:65;56538:6;56533:3;56526:4;56519:5;56515:16;56480:65;:::i;:::-;56570:29;56592:6;56570:29;:::i;:::-;56565:3;56561:39;56554:46;;56323:283;56233:373;;;;:::o;56612:640::-;56807:4;56845:3;56834:9;56830:19;56822:27;;56859:71;56927:1;56916:9;56912:17;56903:6;56859:71;:::i;:::-;56940:72;57008:2;56997:9;56993:18;56984:6;56940:72;:::i;:::-;57022;57090:2;57079:9;57075:18;57066:6;57022:72;:::i;:::-;57141:9;57135:4;57131:20;57126:2;57115:9;57111:18;57104:48;57169:76;57240:4;57231:6;57169:76;:::i;:::-;57161:84;;56612:640;;;;;;;:::o;57258:141::-;57314:5;57345:6;57339:13;57330:22;;57361:32;57387:5;57361:32;:::i;:::-;57258:141;;;;:::o;57405:349::-;57474:6;57523:2;57511:9;57502:7;57498:23;57494:32;57491:119;;;57529:79;;:::i;:::-;57491:119;57649:1;57674:63;57729:7;57720:6;57709:9;57705:22;57674:63;:::i;:::-;57664:73;;57620:127;57405:349;;;;:::o;57760:233::-;57799:3;57822:24;57840:5;57822:24;:::i;:::-;57813:33;;57868:66;57861:5;57858:77;57855:103;;57938:18;;:::i;:::-;57855:103;57985:1;57978:5;57974:13;57967:20;;57760:233;;;:::o;57999:170::-;58139:22;58135:1;58127:6;58123:14;58116:46;57999:170;:::o;58175:366::-;58317:3;58338:67;58402:2;58397:3;58338:67;:::i;:::-;58331:74;;58414:93;58503:3;58414:93;:::i;:::-;58532:2;58527:3;58523:12;58516:19;;58175:366;;;:::o;58547:419::-;58713:4;58751:2;58740:9;58736:18;58728:26;;58800:9;58794:4;58790:20;58786:1;58775:9;58771:17;58764:47;58828:131;58954:4;58828:131;:::i;:::-;58820:139;;58547:419;;;:::o

Swarm Source

ipfs://15eb023ad3733e3f606f1a0b181ee462c5baebdccae5dbec8946121fd11a113c
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.