ETH Price: $2,490.41 (+3.37%)
 

Overview

Max Total Supply

1,203 PANDORA

Holders

874

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 PANDORA
0x03247A02b6870668b11c0aeE3A48e845A425e99E
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:
Pandora

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-18
*/

// SPDX-License-Identifier: MIT

// File: operator-filter-registry/src/IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

// File: operator-filter-registry/src/OperatorFilterer.sol


pragma solidity ^0.8.13;


abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (
                !(
                    operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)
                        && operatorFilterRegistry.isOperatorAllowed(address(this), from)
                )
            ) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}

// File: operator-filter-registry/src/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

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


// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @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 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}
     *
     * _Available since v4.7._
     */
    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.
     *
     * _Available since v4.4._
     */
    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}
     *
     * _Available since v4.7._
     */
    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.
     *
     * _Available since v4.7._
     */
    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.
     *
     * _Available since v4.7._
     */
    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).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild 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 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // 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 for 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) {
            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.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild 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 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // 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 for 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) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    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/utils/math/Math.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.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 anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing 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: contracts/pandoramint.sol


pragma solidity ^0.8.4;






contract Pandora is ERC721A, DefaultOperatorFilterer, Ownable {
    enum SaleStates {
        CLOSED,
        PUBLIC,
        WHITELIST
    }

    SaleStates public saleState;

    bytes32 public whitelistMerkleRoot;

    uint256 public maxSupply = 3333;
    uint256 public maxPublicTokens = 2556;
    uint256 public publicSalePrice = 0.022 ether;

    uint64 public maxPublicTokensPerWallet = 3;
    uint64 public maxWLTokensPerWallet = 1;

    string public baseURL;
    string public unRevealedURL;

    bool public isRevealed = false;

    constructor() ERC721A("Pandora", "PANDORA") {
        _mintERC2309(msg.sender, 25);
    }

    modifier isValidMerkleProof(bytes32[] calldata merkleProof, bytes32 root) {
        require(
            MerkleProof.verify(
                merkleProof,
                root,
                keccak256(abi.encodePacked(msg.sender))
            ),
            "Address does not exist in list"
        );
        _;
    }

    modifier canMint(uint256 numberOfTokens) {
        require(
            _totalMinted() + numberOfTokens <= maxSupply,
            "Not enough tokens remaining to mint"
        );
        _;
    }

    modifier checkState(SaleStates _saleState) {
        require(saleState == _saleState, "sale is not active");
        _;
    }

    function whitelistMint(
        bytes32[] calldata merkleProof,
        uint64 numberOfTokens
    )
        external
        isValidMerkleProof(merkleProof, whitelistMerkleRoot)
        canMint(numberOfTokens)
        checkState(SaleStates.WHITELIST)
    {
        uint64 userAuxilary = _getAux(msg.sender);
        require(
            userAuxilary + numberOfTokens <= maxWLTokensPerWallet,
            "Maximum minting limit exceeded"
        );

        /// @dev Set non-zero auxilary value to acknowledge that the caller has claimed their token.
        _setAux(msg.sender, userAuxilary + numberOfTokens);

        _mint(msg.sender, numberOfTokens);
    }

    function publicMint(uint64 numberOfTokens)
        external
        payable
        canMint(numberOfTokens)
        checkState(SaleStates.PUBLIC)
    {
        require(
            _totalMinted() + numberOfTokens <= maxPublicTokens,
            "Minted the maximum no of public tokens"
        );
        require(
            (_numberMinted(msg.sender) - _getAux(msg.sender)) +
                numberOfTokens <=
                maxPublicTokensPerWallet,
            "Maximum minting limit exceeded"
        );

        require(
            msg.value >= publicSalePrice * numberOfTokens,
            "Not enough ETH"
        );

        _mint(msg.sender, numberOfTokens);
    }

    function mintTo(address[] memory _to, uint256[] memory _numberOfTokens)
        external
        onlyOwner
    {
        require(
            _to.length == _numberOfTokens.length,
            "invalid arrays of address and number"
        );

        for (uint256 i = 0; i < _to.length; i++) {
            require(
                _totalMinted() + _numberOfTokens[i] <= maxSupply,
                "Not enough tokens remaining to mint"
            );
            _mint(_to[i], _numberOfTokens[i]);
        }
    }

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

        if (!isRevealed) {
            return unRevealedURL;
        }

        string memory currentBaseURI = _baseURI();
        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        Strings.toString(_tokenId),
                        ".json"
                    )
                )
                : "";
    }

    function _baseURI() internal view override returns (string memory) {
        return baseURL;
    }

    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    function numberMintedWl(address _account) external view returns (uint64) {
        return _getAux(_account);
    }

    function numberMinted(address _account) external view returns (uint256) {
        return _numberMinted(_account);
    }

    // Metadata
    function setBaseURL(string memory _baseURL) external onlyOwner {
        baseURL = _baseURL;
    }

    function setUnRevealedURL(string memory _unRevealedURL) external onlyOwner {
        unRevealedURL = _unRevealedURL;
    }

    function toggleRevealed() external onlyOwner {
        isRevealed = !isRevealed;
    }

    // Sale Price
    function setPublicSalePrice(uint256 _price) external onlyOwner {
        publicSalePrice = _price;
    }

    // CLOSED = 0, PUBLIC = 1, WHITELIST = 2
    function setSaleState(uint256 newSaleState) external onlyOwner {
        require(
            newSaleState <= uint256(SaleStates.WHITELIST),
            "sale state not valid"
        );
        saleState = SaleStates(newSaleState);
    }

    // Max Tokens Per Wallet
    function setMaxPublicTokensPerWallet(uint64 _maxPublicTokensPerWallet)
        external
        onlyOwner
    {
        maxPublicTokensPerWallet = _maxPublicTokensPerWallet;
    }

    function setMaxWLTokensPerWallet(uint64 _maxWLTokensPerWallet)
        external
        onlyOwner
    {
        maxWLTokensPerWallet = _maxWLTokensPerWallet;
    }

    function setWhitelistMerkleRoot(bytes32 merkleRoot) external onlyOwner {
        whitelistMerkleRoot = merkleRoot;
    }

    function setMaxPublicTokens(uint256 _maxPublicTokens) external onlyOwner {
        maxPublicTokens = _maxPublicTokens;
    }

    function setMaxSupply(uint256 _newMaxSupply) external onlyOwner {
        require(
            _newMaxSupply < maxSupply,
            "max supply cannot be more than current"
        );
        maxSupply = _newMaxSupply;
    }

    function withdraw() external onlyOwner {
        (bool ps, ) = payable(0x012D8E2cE2716B260718abE39062A76be15570B3).call{
            value: (address(this).balance * 6) / 100
        }("");
        require(ps);

        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public payable override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId, data);
    }
}

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":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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"},{"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":"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"baseURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicTokensPerWallet","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWLTokensPerWallet","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_numberOfTokens","type":"uint256[]"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"numberMintedWl","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"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":[{"internalType":"uint64","name":"numberOfTokens","type":"uint64"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":[],"name":"saleState","outputs":[{"internalType":"enum Pandora.SaleStates","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURL","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPublicTokens","type":"uint256"}],"name":"setMaxPublicTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_maxPublicTokensPerWallet","type":"uint64"}],"name":"setMaxPublicTokensPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_maxWLTokensPerWallet","type":"uint64"}],"name":"setMaxWLTokensPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPublicSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSaleState","type":"uint256"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_unRevealedURL","type":"string"}],"name":"setUnRevealedURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","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":[],"name":"toggleRevealed","outputs":[],"stateMutability":"nonpayable","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":"unRevealedURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint64","name":"numberOfTokens","type":"uint64"}],"name":"whitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052610d05600a556109fc600b55664e28e2290f0000600c556003600d60006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600d60086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000601060006101000a81548160ff0219169083151502179055503480156200009757600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600781526020017f50616e646f7261000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f50414e444f52410000000000000000000000000000000000000000000000000081525081600290816200012c919062000989565b5080600390816200013e919062000989565b506200014f6200038760201b60201c565b600081905550505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200034c57801562000212576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001d892919062000ab5565b600060405180830381600087803b158015620001f357600080fd5b505af115801562000208573d6000803e3d6000fd5b505050506200034b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002cc576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200029292919062000ab5565b600060405180830381600087803b158015620002ad57600080fd5b505af1158015620002c2573d6000803e3d6000fd5b505050506200034a565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000315919062000ae2565b600060405180830381600087803b1580156200033057600080fd5b505af115801562000345573d6000803e3d6000fd5b505050505b5b5b50506200036e620003626200039060201b60201c565b6200039860201b60201c565b620003813360196200045e60201b60201c565b62000b2d565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620004cb576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000820362000506576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61138882111562000543576040517f3db1f9af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200055860008483856200068f60201b60201c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550620005e783620005c960008660006200069560201b60201c565b620005da85620006c560201b60201c565b17620006d560201b60201c565b60046000838152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16827fdeaa91b6123d068f5821d0fb0678463d1a8a6079fe8af5de3ce5e896dcf9133d60018686010360405162000664919062000b10565b60405180910390a48181016000819055506200068a60008483856200070060201b60201c565b505050565b50505050565b60008060e883901c905060e8620006b48686846200070660201b60201c565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60009392505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200079157607f821691505b602082108103620007a757620007a662000749565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008117fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007d2565b6200081d8683620007d2565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200086a620008646200085e8462000835565b6200083f565b62000835565b9050919050565b6000819050919050565b620008868362000849565b6200089e620008958262000871565b848454620007df565b825550505050565b600090565b620008b5620008a6565b620008c28184846200087b565b505050565b5b81811015620008ea57620008de600082620008ab565b600181019050620008c8565b5050565b601f82111562000939576200090381620007ad565b6200090e84620007c2565b810160208510156200091e578190505b620009366200092d85620007c2565b830182620008c7565b50505b505050565b600082821c905092915050565b60006200095e600019846008026200093e565b1980831691505092915050565b60006200097983836200094b565b9150826002028217905092915050565b62000994826200070f565b67ffffffffffffffff811115620009b057620009af6200071a565b5b620009bc825462000778565b620009c9828285620008ee565b600060209050601f83116001811462000a015760008415620009ec578287015190505b620009f885826200096b565b86555062000a68565b601f19841662000a1186620007ad565b60005b8281101562000a3b5784890151825560018201915060208501945060208101905062000a14565b8683101562000a5b578489015162000a57601f8916826200094b565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a9d8262000a70565b9050919050565b62000aaf8162000a90565b82525050565b600060408201905062000acc600083018562000aa4565b62000adb602083018462000aa4565b9392505050565b600060208201905062000af9600083018462000aa4565b92915050565b62000b0a8162000835565b82525050565b600060208201905062000b27600083018462000aff565b92915050565b6149768062000b3d6000396000f3fe60806040526004361061025c5760003560e01c806369add11d11610144578063b88d4fde116100b6578063d5abeb011161007a578063d5abeb0114610867578063d93ecff914610892578063dc33e681146108bd578063e922fa3c146108fa578063e985e9c514610923578063f2fde38b146109605761025c565b8063b88d4fde1461078f578063bca9b530146107ab578063bd32fb66146107d6578063c87b56dd146107ff578063d447c7581461083c5761025c565b8063791a251911610108578063791a2519146106915780638da5cb5b146106ba57806395d89b41146106e55780639b6860c814610710578063a22cb4651461073b578063aa98e0c6146107645761025c565b806369add11d146105cf5780636afcb7b0146105f85780636f8b44b01461061457806370a082311461063d578063715018a61461067a5761025c565b806332366a61116101dd5780635117fb88116101a15780635117fb88146104bf57806352dc6ad9146104e857806354214f69146105255780635bc020bc14610550578063603f4d52146105675780636352211e146105925761025c565b806332366a611461040f5780633ccfd60b1461043857806340c84b0e1461044f57806342842e0e1461047a57806349f2553a146104965761025c565b8063095ea7b311610224578063095ea7b31461035a57806318160ddd146103765780631b004d25146103a1578063213f3ea2146103ca57806323b872dd146103f35761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063084c40881461030657806309008f0a1461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613128565b610989565b6040516102959190613170565b60405180910390f35b3480156102aa57600080fd5b506102b3610a1b565b6040516102c0919061321b565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613273565b610aad565b6040516102fd91906132e1565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190613273565b610b2c565b005b34801561033b57600080fd5b50610344610bc8565b604051610351919061321b565b60405180910390f35b610374600480360381019061036f9190613328565b610c56565b005b34801561038257600080fd5b5061038b610d9a565b6040516103989190613377565b60405180910390f35b3480156103ad57600080fd5b506103c860048036038101906103c39190613437565b610db1565b005b3480156103d657600080fd5b506103f160048036038101906103ec9190613273565b610ff9565b005b61040d60048036038101906104089190613497565b61100b565b005b34801561041b57600080fd5b50610436600480360381019061043191906134ea565b6111ed565b005b34801561044457600080fd5b5061044d611221565b005b34801561045b57600080fd5b5061046461134c565b604051610471919061321b565b60405180910390f35b610494600480360381019061048f9190613497565b6113da565b005b3480156104a257600080fd5b506104bd60048036038101906104b89190613647565b6115bc565b005b3480156104cb57600080fd5b506104e660048036038101906104e191906134ea565b6115d7565b005b3480156104f457600080fd5b5061050f600480360381019061050a9190613690565b61160b565b60405161051c91906136cc565b60405180910390f35b34801561053157600080fd5b5061053a61161d565b6040516105479190613170565b60405180910390f35b34801561055c57600080fd5b50610565611630565b005b34801561057357600080fd5b5061057c611664565b604051610589919061375e565b60405180910390f35b34801561059e57600080fd5b506105b960048036038101906105b49190613273565b611677565b6040516105c691906132e1565b60405180910390f35b3480156105db57600080fd5b506105f660048036038101906105f191906138ff565b611689565b005b610612600480360381019061060d91906134ea565b6117a8565b005b34801561062057600080fd5b5061063b60048036038101906106369190613273565b6119f2565b005b34801561064957600080fd5b50610664600480360381019061065f9190613690565b611a48565b6040516106719190613377565b60405180910390f35b34801561068657600080fd5b5061068f611b00565b005b34801561069d57600080fd5b506106b860048036038101906106b39190613273565b611b14565b005b3480156106c657600080fd5b506106cf611b26565b6040516106dc91906132e1565b60405180910390f35b3480156106f157600080fd5b506106fa611b50565b604051610707919061321b565b60405180910390f35b34801561071c57600080fd5b50610725611be2565b6040516107329190613377565b60405180910390f35b34801561074757600080fd5b50610762600480360381019061075d91906139a3565b611be8565b005b34801561077057600080fd5b50610779611cf3565b60405161078691906139fc565b60405180910390f35b6107a960048036038101906107a49190613ab8565b611cf9565b005b3480156107b757600080fd5b506107c0611ede565b6040516107cd91906136cc565b60405180910390f35b3480156107e257600080fd5b506107fd60048036038101906107f89190613b67565b611ef8565b005b34801561080b57600080fd5b5061082660048036038101906108219190613273565b611f0a565b604051610833919061321b565b60405180910390f35b34801561084857600080fd5b50610851612058565b60405161085e9190613377565b60405180910390f35b34801561087357600080fd5b5061087c61205e565b6040516108899190613377565b60405180910390f35b34801561089e57600080fd5b506108a7612064565b6040516108b491906136cc565b60405180910390f35b3480156108c957600080fd5b506108e460048036038101906108df9190613690565b61207e565b6040516108f19190613377565b60405180910390f35b34801561090657600080fd5b50610921600480360381019061091c9190613647565b612090565b005b34801561092f57600080fd5b5061094a60048036038101906109459190613b94565b6120ab565b6040516109579190613170565b60405180910390f35b34801561096c57600080fd5b5061098760048036038101906109829190613690565b61213f565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109e457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a145750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610a2a90613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5690613c03565b8015610aa35780601f10610a7857610100808354040283529160200191610aa3565b820191906000526020600020905b815481529060010190602001808311610a8657829003601f168201915b5050505050905090565b6000610ab8826121c2565b610aee576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610b34612221565b600280811115610b4757610b466136e7565b5b811115610b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8090613c80565b60405180910390fd5b806002811115610b9c57610b9b6136e7565b5b600860146101000a81548160ff02191690836002811115610bc057610bbf6136e7565b5b021790555050565b600f8054610bd590613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0190613c03565b8015610c4e5780601f10610c2357610100808354040283529160200191610c4e565b820191906000526020600020905b815481529060010190602001808311610c3157829003601f168201915b505050505081565b6000610c6182611677565b90508073ffffffffffffffffffffffffffffffffffffffff16610c8261229f565b73ffffffffffffffffffffffffffffffffffffffff1614610ce557610cae81610ca961229f565b6120ab565b610ce4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610da46122a7565b6001546000540303905090565b8282600954610e28838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508233604051602001610e0d9190613ce8565b604051602081830303815290604052805190602001206122b0565b610e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5e90613d4f565b60405180910390fd5b8367ffffffffffffffff16600a5481610e7e6122c7565b610e889190613d9e565b1115610ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec090613e44565b60405180910390fd5b6002806002811115610ede57610edd6136e7565b5b600860149054906101000a900460ff166002811115610f0057610eff6136e7565b5b14610f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3790613eb0565b60405180910390fd5b6000610f4b336122da565b9050600d60089054906101000a900467ffffffffffffffff1667ffffffffffffffff168782610f7a9190613ed0565b67ffffffffffffffff161115610fc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbc90613f58565b60405180910390fd5b610fda338883610fd59190613ed0565b612327565b610fee338867ffffffffffffffff166123dd565b505050505050505050565b611001612221565b80600b8190555050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156111db573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361107d57611078848484612598565b6111e7565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016110c6929190613f78565b602060405180830381865afa1580156110e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111079190613fb6565b801561119957506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611157929190613f78565b602060405180830381865afa158015611174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111989190613fb6565b5b6111da57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016111d191906132e1565b60405180910390fd5b5b6111e6848484612598565b5b50505050565b6111f5612221565b80600d60086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b611229612221565b600073012d8e2ce2716b260718abe39062a76be15570b373ffffffffffffffffffffffffffffffffffffffff1660646006476112659190613fe3565b61126f9190614054565b60405161127b906140b6565b60006040518083038185875af1925050503d80600081146112b8576040519150601f19603f3d011682016040523d82523d6000602084013e6112bd565b606091505b50509050806112cb57600080fd5b60006112d5611b26565b73ffffffffffffffffffffffffffffffffffffffff16476040516112f8906140b6565b60006040518083038185875af1925050503d8060008114611335576040519150601f19603f3d011682016040523d82523d6000602084013e61133a565b606091505b505090508061134857600080fd5b5050565b600e805461135990613c03565b80601f016020809104026020016040519081016040528092919081815260200182805461138590613c03565b80156113d25780601f106113a7576101008083540402835291602001916113d2565b820191906000526020600020905b8154815290600101906020018083116113b557829003601f168201915b505050505081565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156115aa573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361144c576114478484846128ba565b6115b6565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611495929190613f78565b602060405180830381865afa1580156114b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d69190613fb6565b801561156857506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611526929190613f78565b602060405180830381865afa158015611543573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115679190613fb6565b5b6115a957336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016115a091906132e1565b60405180910390fd5b5b6115b58484846128ba565b5b50505050565b6115c4612221565b80600e90816115d39190614277565b5050565b6115df612221565b80600d60006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b6000611616826122da565b9050919050565b601060009054906101000a900460ff1681565b611638612221565b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b600860149054906101000a900460ff1681565b6000611682826128da565b9050919050565b611691612221565b80518251146116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cc906143bb565b60405180910390fd5b60005b82518110156117a357600a548282815181106116f7576116f66143db565b5b60200260200101516117076122c7565b6117119190613d9e565b1115611752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174990613e44565b60405180910390fd5b611790838281518110611768576117676143db565b5b6020026020010151838381518110611783576117826143db565b5b60200260200101516123dd565b808061179b9061440a565b9150506116d8565b505050565b8067ffffffffffffffff16600a54816117bf6122c7565b6117c99190613d9e565b111561180a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180190613e44565b60405180910390fd5b600180600281111561181f5761181e6136e7565b5b600860149054906101000a900460ff166002811115611841576118406136e7565b5b14611881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187890613eb0565b60405180910390fd5b600b548367ffffffffffffffff166118976122c7565b6118a19190613d9e565b11156118e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d9906144c4565b60405180910390fd5b600d60009054906101000a900467ffffffffffffffff1667ffffffffffffffff168367ffffffffffffffff16611917336122da565b67ffffffffffffffff1661192a336129a6565b61193491906144e4565b61193e9190613d9e565b111561197f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197690613f58565b60405180910390fd5b8267ffffffffffffffff16600c546119979190613fe3565b3410156119d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d090614564565b60405180910390fd5b6119ed338467ffffffffffffffff166123dd565b505050565b6119fa612221565b600a548110611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a35906145f6565b60405180910390fd5b80600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611aaf576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611b08612221565b611b1260006129fd565b565b611b1c612221565b80600c8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611b5f90613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8b90613c03565b8015611bd85780601f10611bad57610100808354040283529160200191611bd8565b820191906000526020600020905b815481529060010190602001808311611bbb57829003601f168201915b5050505050905090565b600c5481565b8060076000611bf561229f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ca261229f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ce79190613170565b60405180910390a35050565b60095481565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611eca573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d6c57611d6785858585612ac3565b611ed7565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611db5929190613f78565b602060405180830381865afa158015611dd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df69190613fb6565b8015611e8857506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611e46929190613f78565b602060405180830381865afa158015611e63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e879190613fb6565b5b611ec957336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611ec091906132e1565b60405180910390fd5b5b611ed685858585612ac3565b5b5050505050565b600d60009054906101000a900467ffffffffffffffff1681565b611f00612221565b8060098190555050565b6060611f15826121c2565b611f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4b90614688565b60405180910390fd5b601060009054906101000a900460ff16611ffa57600f8054611f7590613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054611fa190613c03565b8015611fee5780601f10611fc357610100808354040283529160200191611fee565b820191906000526020600020905b815481529060010190602001808311611fd157829003601f168201915b50505050509050612053565b6000612004612b36565b90506000815111612024576040518060200160405280600081525061204f565b8061202e84612bc8565b60405160200161203f929190614730565b6040516020818303038152906040525b9150505b919050565b600b5481565b600a5481565b600d60089054906101000a900467ffffffffffffffff1681565b6000612089826129a6565b9050919050565b612098612221565b80600f90816120a79190614277565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612147612221565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036121b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ad906147d1565b60405180910390fd5b6121bf816129fd565b50565b6000816121cd6122a7565b111580156121dc575060005482105b801561221a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b612229612c96565b73ffffffffffffffffffffffffffffffffffffffff16612247611b26565b73ffffffffffffffffffffffffffffffffffffffff161461229d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122949061483d565b60405180910390fd5b565b600033905090565b60006001905090565b6000826122bd8584612c9e565b1490509392505050565b60006122d16122a7565b60005403905090565b600060c0600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600082905060c081901b77ffffffffffffffffffffffffffffffffffffffffffffffff831617915081600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050565b6000805490506000820361241d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61242a6000848385612cf4565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506124a1836124926000866000612cfa565b61249b85612d22565b17612d32565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461254257808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612507565b506000820361257d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506125936000848385612d5d565b505050565b60006125a3826128da565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461260a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061261684612d63565b9150915061262c818761262761229f565b612d8a565b612678576126418661263c61229f565b6120ab565b612677576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036126de576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126eb8686866001612cf4565b80156126f657600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506127c4856127a0888887612cfa565b7c020000000000000000000000000000000000000000000000000000000017612d32565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084160361284a5760006001850190506000600460008381526020019081526020016000205403612848576000548114612847578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128b28686866001612d5d565b505050505050565b6128d583838360405180602001604052806000815250611cf9565b505050565b600080829050806128e96122a7565b1161296f5760005481101561296e5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361296c575b60008103612962576004600083600190039350838152602001908152602001600020549050612938565b80925050506129a1565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ace84848461100b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612b3057612af984848484612dce565b612b2f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600e8054612b4590613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054612b7190613c03565b8015612bbe5780601f10612b9357610100808354040283529160200191612bbe565b820191906000526020600020905b815481529060010190602001808311612ba157829003601f168201915b5050505050905090565b606060006001612bd784612f1e565b01905060008167ffffffffffffffff811115612bf657612bf561351c565b5b6040519080825280601f01601f191660200182016040528015612c285781602001600182028036833780820191505090505b509050600082602001820190505b600115612c8b578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612c7f57612c7e614025565b5b04945060008503612c36575b819350505050919050565b600033905090565b60008082905060005b8451811015612ce957612cd482868381518110612cc757612cc66143db565b5b6020026020010151613071565b91508080612ce19061440a565b915050612ca7565b508091505092915050565b50505050565b60008060e883901c905060e8612d1186868461309c565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612df461229f565b8786866040518563ffffffff1660e01b8152600401612e1694939291906148b2565b6020604051808303816000875af1925050508015612e5257506040513d601f19601f82011682018060405250810190612e4f9190614913565b60015b612ecb573d8060008114612e82576040519150601f19603f3d011682016040523d82523d6000602084013e612e87565b606091505b506000815103612ec3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612f7c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612f7257612f71614025565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612fb9576d04ee2d6d415b85acef81000000008381612faf57612fae614025565b5b0492506020810190505b662386f26fc100008310612fe857662386f26fc100008381612fde57612fdd614025565b5b0492506010810190505b6305f5e1008310613011576305f5e100838161300757613006614025565b5b0492506008810190505b612710831061303657612710838161302c5761302b614025565b5b0492506004810190505b60648310613059576064838161304f5761304e614025565b5b0492506002810190505b600a8310613068576001810190505b80915050919050565b60008183106130895761308482846130a5565b613094565b61309383836130a5565b5b905092915050565b60009392505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613105816130d0565b811461311057600080fd5b50565b600081359050613122816130fc565b92915050565b60006020828403121561313e5761313d6130c6565b5b600061314c84828501613113565b91505092915050565b60008115159050919050565b61316a81613155565b82525050565b60006020820190506131856000830184613161565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131c55780820151818401526020810190506131aa565b60008484015250505050565b6000601f19601f8301169050919050565b60006131ed8261318b565b6131f78185613196565b93506132078185602086016131a7565b613210816131d1565b840191505092915050565b6000602082019050818103600083015261323581846131e2565b905092915050565b6000819050919050565b6132508161323d565b811461325b57600080fd5b50565b60008135905061326d81613247565b92915050565b600060208284031215613289576132886130c6565b5b60006132978482850161325e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132cb826132a0565b9050919050565b6132db816132c0565b82525050565b60006020820190506132f660008301846132d2565b92915050565b613305816132c0565b811461331057600080fd5b50565b600081359050613322816132fc565b92915050565b6000806040838503121561333f5761333e6130c6565b5b600061334d85828601613313565b925050602061335e8582860161325e565b9150509250929050565b6133718161323d565b82525050565b600060208201905061338c6000830184613368565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126133b7576133b6613392565b5b8235905067ffffffffffffffff8111156133d4576133d3613397565b5b6020830191508360208202830111156133f0576133ef61339c565b5b9250929050565b600067ffffffffffffffff82169050919050565b613414816133f7565b811461341f57600080fd5b50565b6000813590506134318161340b565b92915050565b6000806000604084860312156134505761344f6130c6565b5b600084013567ffffffffffffffff81111561346e5761346d6130cb565b5b61347a868287016133a1565b9350935050602061348d86828701613422565b9150509250925092565b6000806000606084860312156134b0576134af6130c6565b5b60006134be86828701613313565b93505060206134cf86828701613313565b92505060406134e08682870161325e565b9150509250925092565b600060208284031215613500576134ff6130c6565b5b600061350e84828501613422565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613554826131d1565b810181811067ffffffffffffffff821117156135735761357261351c565b5b80604052505050565b60006135866130bc565b9050613592828261354b565b919050565b600067ffffffffffffffff8211156135b2576135b161351c565b5b6135bb826131d1565b9050602081019050919050565b82818337600083830152505050565b60006135ea6135e584613597565b61357c565b90508281526020810184848401111561360657613605613517565b5b6136118482856135c8565b509392505050565b600082601f83011261362e5761362d613392565b5b813561363e8482602086016135d7565b91505092915050565b60006020828403121561365d5761365c6130c6565b5b600082013567ffffffffffffffff81111561367b5761367a6130cb565b5b61368784828501613619565b91505092915050565b6000602082840312156136a6576136a56130c6565b5b60006136b484828501613313565b91505092915050565b6136c6816133f7565b82525050565b60006020820190506136e160008301846136bd565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613727576137266136e7565b5b50565b600081905061373882613716565b919050565b60006137488261372a565b9050919050565b6137588161373d565b82525050565b6000602082019050613773600083018461374f565b92915050565b600067ffffffffffffffff8211156137945761379361351c565b5b602082029050602081019050919050565b60006137b86137b384613779565b61357c565b905080838252602082019050602084028301858111156137db576137da61339c565b5b835b8181101561380457806137f08882613313565b8452602084019350506020810190506137dd565b5050509392505050565b600082601f83011261382357613822613392565b5b81356138338482602086016137a5565b91505092915050565b600067ffffffffffffffff8211156138575761385661351c565b5b602082029050602081019050919050565b600061387b6138768461383c565b61357c565b9050808382526020820190506020840283018581111561389e5761389d61339c565b5b835b818110156138c757806138b3888261325e565b8452602084019350506020810190506138a0565b5050509392505050565b600082601f8301126138e6576138e5613392565b5b81356138f6848260208601613868565b91505092915050565b60008060408385031215613916576139156130c6565b5b600083013567ffffffffffffffff811115613934576139336130cb565b5b6139408582860161380e565b925050602083013567ffffffffffffffff811115613961576139606130cb565b5b61396d858286016138d1565b9150509250929050565b61398081613155565b811461398b57600080fd5b50565b60008135905061399d81613977565b92915050565b600080604083850312156139ba576139b96130c6565b5b60006139c885828601613313565b92505060206139d98582860161398e565b9150509250929050565b6000819050919050565b6139f6816139e3565b82525050565b6000602082019050613a1160008301846139ed565b92915050565b600067ffffffffffffffff821115613a3257613a3161351c565b5b613a3b826131d1565b9050602081019050919050565b6000613a5b613a5684613a17565b61357c565b905082815260208101848484011115613a7757613a76613517565b5b613a828482856135c8565b509392505050565b600082601f830112613a9f57613a9e613392565b5b8135613aaf848260208601613a48565b91505092915050565b60008060008060808587031215613ad257613ad16130c6565b5b6000613ae087828801613313565b9450506020613af187828801613313565b9350506040613b028782880161325e565b925050606085013567ffffffffffffffff811115613b2357613b226130cb565b5b613b2f87828801613a8a565b91505092959194509250565b613b44816139e3565b8114613b4f57600080fd5b50565b600081359050613b6181613b3b565b92915050565b600060208284031215613b7d57613b7c6130c6565b5b6000613b8b84828501613b52565b91505092915050565b60008060408385031215613bab57613baa6130c6565b5b6000613bb985828601613313565b9250506020613bca85828601613313565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c1b57607f821691505b602082108103613c2e57613c2d613bd4565b5b50919050565b7f73616c65207374617465206e6f742076616c6964000000000000000000000000600082015250565b6000613c6a601483613196565b9150613c7582613c34565b602082019050919050565b60006020820190508181036000830152613c9981613c5d565b9050919050565b60008160601b9050919050565b6000613cb882613ca0565b9050919050565b6000613cca82613cad565b9050919050565b613ce2613cdd826132c0565b613cbf565b82525050565b6000613cf48284613cd1565b60148201915081905092915050565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b6000613d39601e83613196565b9150613d4482613d03565b602082019050919050565b60006020820190508181036000830152613d6881613d2c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613da98261323d565b9150613db48361323d565b9250828201905080821115613dcc57613dcb613d6f565b5b92915050565b7f4e6f7420656e6f75676820746f6b656e732072656d61696e696e6720746f206d60008201527f696e740000000000000000000000000000000000000000000000000000000000602082015250565b6000613e2e602383613196565b9150613e3982613dd2565b604082019050919050565b60006020820190508181036000830152613e5d81613e21565b9050919050565b7f73616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b6000613e9a601283613196565b9150613ea582613e64565b602082019050919050565b60006020820190508181036000830152613ec981613e8d565b9050919050565b6000613edb826133f7565b9150613ee6836133f7565b9250828201905067ffffffffffffffff811115613f0657613f05613d6f565b5b92915050565b7f4d6178696d756d206d696e74696e67206c696d69742065786365656465640000600082015250565b6000613f42601e83613196565b9150613f4d82613f0c565b602082019050919050565b60006020820190508181036000830152613f7181613f35565b9050919050565b6000604082019050613f8d60008301856132d2565b613f9a60208301846132d2565b9392505050565b600081519050613fb081613977565b92915050565b600060208284031215613fcc57613fcb6130c6565b5b6000613fda84828501613fa1565b91505092915050565b6000613fee8261323d565b9150613ff98361323d565b92508282026140078161323d565b9150828204841483151761401e5761401d613d6f565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061405f8261323d565b915061406a8361323d565b92508261407a57614079614025565b5b828204905092915050565b600081905092915050565b50565b60006140a0600083614085565b91506140ab82614090565b600082019050919050565b60006140c182614093565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261412d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826140f0565b61413786836140f0565b95508019841693508086168417925050509392505050565b6000819050919050565b600061417461416f61416a8461323d565b61414f565b61323d565b9050919050565b6000819050919050565b61418e83614159565b6141a261419a8261417b565b8484546140fd565b825550505050565b600090565b6141b76141aa565b6141c2818484614185565b505050565b5b818110156141e6576141db6000826141af565b6001810190506141c8565b5050565b601f82111561422b576141fc816140cb565b614205846140e0565b81016020851015614214578190505b614228614220856140e0565b8301826141c7565b50505b505050565b600082821c905092915050565b600061424e60001984600802614230565b1980831691505092915050565b6000614267838361423d565b9150826002028217905092915050565b6142808261318b565b67ffffffffffffffff8111156142995761429861351c565b5b6142a38254613c03565b6142ae8282856141ea565b600060209050601f8311600181146142e157600084156142cf578287015190505b6142d9858261425b565b865550614341565b601f1984166142ef866140cb565b60005b82811015614317578489015182556001820191506020850194506020810190506142f2565b868310156143345784890151614330601f89168261423d565b8355505b6001600288020188555050505b505050505050565b7f696e76616c696420617272617973206f66206164647265737320616e64206e7560008201527f6d62657200000000000000000000000000000000000000000000000000000000602082015250565b60006143a5602483613196565b91506143b082614349565b604082019050919050565b600060208201905081810360008301526143d481614398565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006144158261323d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361444757614446613d6f565b5b600182019050919050565b7f4d696e74656420746865206d6178696d756d206e6f206f66207075626c69632060008201527f746f6b656e730000000000000000000000000000000000000000000000000000602082015250565b60006144ae602683613196565b91506144b982614452565b604082019050919050565b600060208201905081810360008301526144dd816144a1565b9050919050565b60006144ef8261323d565b91506144fa8361323d565b925082820390508181111561451257614511613d6f565b5b92915050565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b600061454e600e83613196565b915061455982614518565b602082019050919050565b6000602082019050818103600083015261457d81614541565b9050919050565b7f6d617820737570706c792063616e6e6f74206265206d6f7265207468616e206360008201527f757272656e740000000000000000000000000000000000000000000000000000602082015250565b60006145e0602683613196565b91506145eb82614584565b604082019050919050565b6000602082019050818103600083015261460f816145d3565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614672602f83613196565b915061467d82614616565b604082019050919050565b600060208201905081810360008301526146a181614665565b9050919050565b600081905092915050565b60006146be8261318b565b6146c881856146a8565b93506146d88185602086016131a7565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061471a6005836146a8565b9150614725826146e4565b600582019050919050565b600061473c82856146b3565b915061474882846146b3565b91506147538261470d565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006147bb602683613196565b91506147c68261475f565b604082019050919050565b600060208201905081810360008301526147ea816147ae565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614827602083613196565b9150614832826147f1565b602082019050919050565b600060208201905081810360008301526148568161481a565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006148848261485d565b61488e8185614868565b935061489e8185602086016131a7565b6148a7816131d1565b840191505092915050565b60006080820190506148c760008301876132d2565b6148d460208301866132d2565b6148e16040830185613368565b81810360608301526148f38184614879565b905095945050505050565b60008151905061490d816130fc565b92915050565b600060208284031215614929576149286130c6565b5b6000614937848285016148fe565b9150509291505056fea2646970667358221220f37c364f9479e5a9f17580f788c8fa42aa8166e6437cdfba7c7a77a38b3d004164736f6c63430008110033

Deployed Bytecode

0x60806040526004361061025c5760003560e01c806369add11d11610144578063b88d4fde116100b6578063d5abeb011161007a578063d5abeb0114610867578063d93ecff914610892578063dc33e681146108bd578063e922fa3c146108fa578063e985e9c514610923578063f2fde38b146109605761025c565b8063b88d4fde1461078f578063bca9b530146107ab578063bd32fb66146107d6578063c87b56dd146107ff578063d447c7581461083c5761025c565b8063791a251911610108578063791a2519146106915780638da5cb5b146106ba57806395d89b41146106e55780639b6860c814610710578063a22cb4651461073b578063aa98e0c6146107645761025c565b806369add11d146105cf5780636afcb7b0146105f85780636f8b44b01461061457806370a082311461063d578063715018a61461067a5761025c565b806332366a61116101dd5780635117fb88116101a15780635117fb88146104bf57806352dc6ad9146104e857806354214f69146105255780635bc020bc14610550578063603f4d52146105675780636352211e146105925761025c565b806332366a611461040f5780633ccfd60b1461043857806340c84b0e1461044f57806342842e0e1461047a57806349f2553a146104965761025c565b8063095ea7b311610224578063095ea7b31461035a57806318160ddd146103765780631b004d25146103a1578063213f3ea2146103ca57806323b872dd146103f35761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063084c40881461030657806309008f0a1461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613128565b610989565b6040516102959190613170565b60405180910390f35b3480156102aa57600080fd5b506102b3610a1b565b6040516102c0919061321b565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613273565b610aad565b6040516102fd91906132e1565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190613273565b610b2c565b005b34801561033b57600080fd5b50610344610bc8565b604051610351919061321b565b60405180910390f35b610374600480360381019061036f9190613328565b610c56565b005b34801561038257600080fd5b5061038b610d9a565b6040516103989190613377565b60405180910390f35b3480156103ad57600080fd5b506103c860048036038101906103c39190613437565b610db1565b005b3480156103d657600080fd5b506103f160048036038101906103ec9190613273565b610ff9565b005b61040d60048036038101906104089190613497565b61100b565b005b34801561041b57600080fd5b50610436600480360381019061043191906134ea565b6111ed565b005b34801561044457600080fd5b5061044d611221565b005b34801561045b57600080fd5b5061046461134c565b604051610471919061321b565b60405180910390f35b610494600480360381019061048f9190613497565b6113da565b005b3480156104a257600080fd5b506104bd60048036038101906104b89190613647565b6115bc565b005b3480156104cb57600080fd5b506104e660048036038101906104e191906134ea565b6115d7565b005b3480156104f457600080fd5b5061050f600480360381019061050a9190613690565b61160b565b60405161051c91906136cc565b60405180910390f35b34801561053157600080fd5b5061053a61161d565b6040516105479190613170565b60405180910390f35b34801561055c57600080fd5b50610565611630565b005b34801561057357600080fd5b5061057c611664565b604051610589919061375e565b60405180910390f35b34801561059e57600080fd5b506105b960048036038101906105b49190613273565b611677565b6040516105c691906132e1565b60405180910390f35b3480156105db57600080fd5b506105f660048036038101906105f191906138ff565b611689565b005b610612600480360381019061060d91906134ea565b6117a8565b005b34801561062057600080fd5b5061063b60048036038101906106369190613273565b6119f2565b005b34801561064957600080fd5b50610664600480360381019061065f9190613690565b611a48565b6040516106719190613377565b60405180910390f35b34801561068657600080fd5b5061068f611b00565b005b34801561069d57600080fd5b506106b860048036038101906106b39190613273565b611b14565b005b3480156106c657600080fd5b506106cf611b26565b6040516106dc91906132e1565b60405180910390f35b3480156106f157600080fd5b506106fa611b50565b604051610707919061321b565b60405180910390f35b34801561071c57600080fd5b50610725611be2565b6040516107329190613377565b60405180910390f35b34801561074757600080fd5b50610762600480360381019061075d91906139a3565b611be8565b005b34801561077057600080fd5b50610779611cf3565b60405161078691906139fc565b60405180910390f35b6107a960048036038101906107a49190613ab8565b611cf9565b005b3480156107b757600080fd5b506107c0611ede565b6040516107cd91906136cc565b60405180910390f35b3480156107e257600080fd5b506107fd60048036038101906107f89190613b67565b611ef8565b005b34801561080b57600080fd5b5061082660048036038101906108219190613273565b611f0a565b604051610833919061321b565b60405180910390f35b34801561084857600080fd5b50610851612058565b60405161085e9190613377565b60405180910390f35b34801561087357600080fd5b5061087c61205e565b6040516108899190613377565b60405180910390f35b34801561089e57600080fd5b506108a7612064565b6040516108b491906136cc565b60405180910390f35b3480156108c957600080fd5b506108e460048036038101906108df9190613690565b61207e565b6040516108f19190613377565b60405180910390f35b34801561090657600080fd5b50610921600480360381019061091c9190613647565b612090565b005b34801561092f57600080fd5b5061094a60048036038101906109459190613b94565b6120ab565b6040516109579190613170565b60405180910390f35b34801561096c57600080fd5b5061098760048036038101906109829190613690565b61213f565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109e457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a145750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610a2a90613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5690613c03565b8015610aa35780601f10610a7857610100808354040283529160200191610aa3565b820191906000526020600020905b815481529060010190602001808311610a8657829003601f168201915b5050505050905090565b6000610ab8826121c2565b610aee576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610b34612221565b600280811115610b4757610b466136e7565b5b811115610b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8090613c80565b60405180910390fd5b806002811115610b9c57610b9b6136e7565b5b600860146101000a81548160ff02191690836002811115610bc057610bbf6136e7565b5b021790555050565b600f8054610bd590613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0190613c03565b8015610c4e5780601f10610c2357610100808354040283529160200191610c4e565b820191906000526020600020905b815481529060010190602001808311610c3157829003601f168201915b505050505081565b6000610c6182611677565b90508073ffffffffffffffffffffffffffffffffffffffff16610c8261229f565b73ffffffffffffffffffffffffffffffffffffffff1614610ce557610cae81610ca961229f565b6120ab565b610ce4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610da46122a7565b6001546000540303905090565b8282600954610e28838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508233604051602001610e0d9190613ce8565b604051602081830303815290604052805190602001206122b0565b610e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5e90613d4f565b60405180910390fd5b8367ffffffffffffffff16600a5481610e7e6122c7565b610e889190613d9e565b1115610ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec090613e44565b60405180910390fd5b6002806002811115610ede57610edd6136e7565b5b600860149054906101000a900460ff166002811115610f0057610eff6136e7565b5b14610f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3790613eb0565b60405180910390fd5b6000610f4b336122da565b9050600d60089054906101000a900467ffffffffffffffff1667ffffffffffffffff168782610f7a9190613ed0565b67ffffffffffffffff161115610fc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbc90613f58565b60405180910390fd5b610fda338883610fd59190613ed0565b612327565b610fee338867ffffffffffffffff166123dd565b505050505050505050565b611001612221565b80600b8190555050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156111db573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361107d57611078848484612598565b6111e7565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016110c6929190613f78565b602060405180830381865afa1580156110e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111079190613fb6565b801561119957506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611157929190613f78565b602060405180830381865afa158015611174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111989190613fb6565b5b6111da57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016111d191906132e1565b60405180910390fd5b5b6111e6848484612598565b5b50505050565b6111f5612221565b80600d60086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b611229612221565b600073012d8e2ce2716b260718abe39062a76be15570b373ffffffffffffffffffffffffffffffffffffffff1660646006476112659190613fe3565b61126f9190614054565b60405161127b906140b6565b60006040518083038185875af1925050503d80600081146112b8576040519150601f19603f3d011682016040523d82523d6000602084013e6112bd565b606091505b50509050806112cb57600080fd5b60006112d5611b26565b73ffffffffffffffffffffffffffffffffffffffff16476040516112f8906140b6565b60006040518083038185875af1925050503d8060008114611335576040519150601f19603f3d011682016040523d82523d6000602084013e61133a565b606091505b505090508061134857600080fd5b5050565b600e805461135990613c03565b80601f016020809104026020016040519081016040528092919081815260200182805461138590613c03565b80156113d25780601f106113a7576101008083540402835291602001916113d2565b820191906000526020600020905b8154815290600101906020018083116113b557829003601f168201915b505050505081565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156115aa573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361144c576114478484846128ba565b6115b6565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611495929190613f78565b602060405180830381865afa1580156114b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d69190613fb6565b801561156857506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611526929190613f78565b602060405180830381865afa158015611543573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115679190613fb6565b5b6115a957336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016115a091906132e1565b60405180910390fd5b5b6115b58484846128ba565b5b50505050565b6115c4612221565b80600e90816115d39190614277565b5050565b6115df612221565b80600d60006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b6000611616826122da565b9050919050565b601060009054906101000a900460ff1681565b611638612221565b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b600860149054906101000a900460ff1681565b6000611682826128da565b9050919050565b611691612221565b80518251146116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cc906143bb565b60405180910390fd5b60005b82518110156117a357600a548282815181106116f7576116f66143db565b5b60200260200101516117076122c7565b6117119190613d9e565b1115611752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174990613e44565b60405180910390fd5b611790838281518110611768576117676143db565b5b6020026020010151838381518110611783576117826143db565b5b60200260200101516123dd565b808061179b9061440a565b9150506116d8565b505050565b8067ffffffffffffffff16600a54816117bf6122c7565b6117c99190613d9e565b111561180a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180190613e44565b60405180910390fd5b600180600281111561181f5761181e6136e7565b5b600860149054906101000a900460ff166002811115611841576118406136e7565b5b14611881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187890613eb0565b60405180910390fd5b600b548367ffffffffffffffff166118976122c7565b6118a19190613d9e565b11156118e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d9906144c4565b60405180910390fd5b600d60009054906101000a900467ffffffffffffffff1667ffffffffffffffff168367ffffffffffffffff16611917336122da565b67ffffffffffffffff1661192a336129a6565b61193491906144e4565b61193e9190613d9e565b111561197f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197690613f58565b60405180910390fd5b8267ffffffffffffffff16600c546119979190613fe3565b3410156119d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d090614564565b60405180910390fd5b6119ed338467ffffffffffffffff166123dd565b505050565b6119fa612221565b600a548110611a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a35906145f6565b60405180910390fd5b80600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611aaf576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611b08612221565b611b1260006129fd565b565b611b1c612221565b80600c8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611b5f90613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8b90613c03565b8015611bd85780601f10611bad57610100808354040283529160200191611bd8565b820191906000526020600020905b815481529060010190602001808311611bbb57829003601f168201915b5050505050905090565b600c5481565b8060076000611bf561229f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ca261229f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ce79190613170565b60405180910390a35050565b60095481565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611eca573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d6c57611d6785858585612ac3565b611ed7565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611db5929190613f78565b602060405180830381865afa158015611dd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df69190613fb6565b8015611e8857506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611e46929190613f78565b602060405180830381865afa158015611e63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e879190613fb6565b5b611ec957336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611ec091906132e1565b60405180910390fd5b5b611ed685858585612ac3565b5b5050505050565b600d60009054906101000a900467ffffffffffffffff1681565b611f00612221565b8060098190555050565b6060611f15826121c2565b611f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4b90614688565b60405180910390fd5b601060009054906101000a900460ff16611ffa57600f8054611f7590613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054611fa190613c03565b8015611fee5780601f10611fc357610100808354040283529160200191611fee565b820191906000526020600020905b815481529060010190602001808311611fd157829003601f168201915b50505050509050612053565b6000612004612b36565b90506000815111612024576040518060200160405280600081525061204f565b8061202e84612bc8565b60405160200161203f929190614730565b6040516020818303038152906040525b9150505b919050565b600b5481565b600a5481565b600d60089054906101000a900467ffffffffffffffff1681565b6000612089826129a6565b9050919050565b612098612221565b80600f90816120a79190614277565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612147612221565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036121b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ad906147d1565b60405180910390fd5b6121bf816129fd565b50565b6000816121cd6122a7565b111580156121dc575060005482105b801561221a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b612229612c96565b73ffffffffffffffffffffffffffffffffffffffff16612247611b26565b73ffffffffffffffffffffffffffffffffffffffff161461229d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122949061483d565b60405180910390fd5b565b600033905090565b60006001905090565b6000826122bd8584612c9e565b1490509392505050565b60006122d16122a7565b60005403905090565b600060c0600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600082905060c081901b77ffffffffffffffffffffffffffffffffffffffffffffffff831617915081600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050565b6000805490506000820361241d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61242a6000848385612cf4565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506124a1836124926000866000612cfa565b61249b85612d22565b17612d32565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461254257808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612507565b506000820361257d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506125936000848385612d5d565b505050565b60006125a3826128da565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461260a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061261684612d63565b9150915061262c818761262761229f565b612d8a565b612678576126418661263c61229f565b6120ab565b612677576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036126de576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126eb8686866001612cf4565b80156126f657600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506127c4856127a0888887612cfa565b7c020000000000000000000000000000000000000000000000000000000017612d32565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084160361284a5760006001850190506000600460008381526020019081526020016000205403612848576000548114612847578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128b28686866001612d5d565b505050505050565b6128d583838360405180602001604052806000815250611cf9565b505050565b600080829050806128e96122a7565b1161296f5760005481101561296e5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361296c575b60008103612962576004600083600190039350838152602001908152602001600020549050612938565b80925050506129a1565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ace84848461100b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612b3057612af984848484612dce565b612b2f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600e8054612b4590613c03565b80601f0160208091040260200160405190810160405280929190818152602001828054612b7190613c03565b8015612bbe5780601f10612b9357610100808354040283529160200191612bbe565b820191906000526020600020905b815481529060010190602001808311612ba157829003601f168201915b5050505050905090565b606060006001612bd784612f1e565b01905060008167ffffffffffffffff811115612bf657612bf561351c565b5b6040519080825280601f01601f191660200182016040528015612c285781602001600182028036833780820191505090505b509050600082602001820190505b600115612c8b578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612c7f57612c7e614025565b5b04945060008503612c36575b819350505050919050565b600033905090565b60008082905060005b8451811015612ce957612cd482868381518110612cc757612cc66143db565b5b6020026020010151613071565b91508080612ce19061440a565b915050612ca7565b508091505092915050565b50505050565b60008060e883901c905060e8612d1186868461309c565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612df461229f565b8786866040518563ffffffff1660e01b8152600401612e1694939291906148b2565b6020604051808303816000875af1925050508015612e5257506040513d601f19601f82011682018060405250810190612e4f9190614913565b60015b612ecb573d8060008114612e82576040519150601f19603f3d011682016040523d82523d6000602084013e612e87565b606091505b506000815103612ec3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612f7c577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612f7257612f71614025565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612fb9576d04ee2d6d415b85acef81000000008381612faf57612fae614025565b5b0492506020810190505b662386f26fc100008310612fe857662386f26fc100008381612fde57612fdd614025565b5b0492506010810190505b6305f5e1008310613011576305f5e100838161300757613006614025565b5b0492506008810190505b612710831061303657612710838161302c5761302b614025565b5b0492506004810190505b60648310613059576064838161304f5761304e614025565b5b0492506002810190505b600a8310613068576001810190505b80915050919050565b60008183106130895761308482846130a5565b613094565b61309383836130a5565b5b905092915050565b60009392505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613105816130d0565b811461311057600080fd5b50565b600081359050613122816130fc565b92915050565b60006020828403121561313e5761313d6130c6565b5b600061314c84828501613113565b91505092915050565b60008115159050919050565b61316a81613155565b82525050565b60006020820190506131856000830184613161565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131c55780820151818401526020810190506131aa565b60008484015250505050565b6000601f19601f8301169050919050565b60006131ed8261318b565b6131f78185613196565b93506132078185602086016131a7565b613210816131d1565b840191505092915050565b6000602082019050818103600083015261323581846131e2565b905092915050565b6000819050919050565b6132508161323d565b811461325b57600080fd5b50565b60008135905061326d81613247565b92915050565b600060208284031215613289576132886130c6565b5b60006132978482850161325e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132cb826132a0565b9050919050565b6132db816132c0565b82525050565b60006020820190506132f660008301846132d2565b92915050565b613305816132c0565b811461331057600080fd5b50565b600081359050613322816132fc565b92915050565b6000806040838503121561333f5761333e6130c6565b5b600061334d85828601613313565b925050602061335e8582860161325e565b9150509250929050565b6133718161323d565b82525050565b600060208201905061338c6000830184613368565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126133b7576133b6613392565b5b8235905067ffffffffffffffff8111156133d4576133d3613397565b5b6020830191508360208202830111156133f0576133ef61339c565b5b9250929050565b600067ffffffffffffffff82169050919050565b613414816133f7565b811461341f57600080fd5b50565b6000813590506134318161340b565b92915050565b6000806000604084860312156134505761344f6130c6565b5b600084013567ffffffffffffffff81111561346e5761346d6130cb565b5b61347a868287016133a1565b9350935050602061348d86828701613422565b9150509250925092565b6000806000606084860312156134b0576134af6130c6565b5b60006134be86828701613313565b93505060206134cf86828701613313565b92505060406134e08682870161325e565b9150509250925092565b600060208284031215613500576134ff6130c6565b5b600061350e84828501613422565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613554826131d1565b810181811067ffffffffffffffff821117156135735761357261351c565b5b80604052505050565b60006135866130bc565b9050613592828261354b565b919050565b600067ffffffffffffffff8211156135b2576135b161351c565b5b6135bb826131d1565b9050602081019050919050565b82818337600083830152505050565b60006135ea6135e584613597565b61357c565b90508281526020810184848401111561360657613605613517565b5b6136118482856135c8565b509392505050565b600082601f83011261362e5761362d613392565b5b813561363e8482602086016135d7565b91505092915050565b60006020828403121561365d5761365c6130c6565b5b600082013567ffffffffffffffff81111561367b5761367a6130cb565b5b61368784828501613619565b91505092915050565b6000602082840312156136a6576136a56130c6565b5b60006136b484828501613313565b91505092915050565b6136c6816133f7565b82525050565b60006020820190506136e160008301846136bd565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613727576137266136e7565b5b50565b600081905061373882613716565b919050565b60006137488261372a565b9050919050565b6137588161373d565b82525050565b6000602082019050613773600083018461374f565b92915050565b600067ffffffffffffffff8211156137945761379361351c565b5b602082029050602081019050919050565b60006137b86137b384613779565b61357c565b905080838252602082019050602084028301858111156137db576137da61339c565b5b835b8181101561380457806137f08882613313565b8452602084019350506020810190506137dd565b5050509392505050565b600082601f83011261382357613822613392565b5b81356138338482602086016137a5565b91505092915050565b600067ffffffffffffffff8211156138575761385661351c565b5b602082029050602081019050919050565b600061387b6138768461383c565b61357c565b9050808382526020820190506020840283018581111561389e5761389d61339c565b5b835b818110156138c757806138b3888261325e565b8452602084019350506020810190506138a0565b5050509392505050565b600082601f8301126138e6576138e5613392565b5b81356138f6848260208601613868565b91505092915050565b60008060408385031215613916576139156130c6565b5b600083013567ffffffffffffffff811115613934576139336130cb565b5b6139408582860161380e565b925050602083013567ffffffffffffffff811115613961576139606130cb565b5b61396d858286016138d1565b9150509250929050565b61398081613155565b811461398b57600080fd5b50565b60008135905061399d81613977565b92915050565b600080604083850312156139ba576139b96130c6565b5b60006139c885828601613313565b92505060206139d98582860161398e565b9150509250929050565b6000819050919050565b6139f6816139e3565b82525050565b6000602082019050613a1160008301846139ed565b92915050565b600067ffffffffffffffff821115613a3257613a3161351c565b5b613a3b826131d1565b9050602081019050919050565b6000613a5b613a5684613a17565b61357c565b905082815260208101848484011115613a7757613a76613517565b5b613a828482856135c8565b509392505050565b600082601f830112613a9f57613a9e613392565b5b8135613aaf848260208601613a48565b91505092915050565b60008060008060808587031215613ad257613ad16130c6565b5b6000613ae087828801613313565b9450506020613af187828801613313565b9350506040613b028782880161325e565b925050606085013567ffffffffffffffff811115613b2357613b226130cb565b5b613b2f87828801613a8a565b91505092959194509250565b613b44816139e3565b8114613b4f57600080fd5b50565b600081359050613b6181613b3b565b92915050565b600060208284031215613b7d57613b7c6130c6565b5b6000613b8b84828501613b52565b91505092915050565b60008060408385031215613bab57613baa6130c6565b5b6000613bb985828601613313565b9250506020613bca85828601613313565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c1b57607f821691505b602082108103613c2e57613c2d613bd4565b5b50919050565b7f73616c65207374617465206e6f742076616c6964000000000000000000000000600082015250565b6000613c6a601483613196565b9150613c7582613c34565b602082019050919050565b60006020820190508181036000830152613c9981613c5d565b9050919050565b60008160601b9050919050565b6000613cb882613ca0565b9050919050565b6000613cca82613cad565b9050919050565b613ce2613cdd826132c0565b613cbf565b82525050565b6000613cf48284613cd1565b60148201915081905092915050565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b6000613d39601e83613196565b9150613d4482613d03565b602082019050919050565b60006020820190508181036000830152613d6881613d2c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613da98261323d565b9150613db48361323d565b9250828201905080821115613dcc57613dcb613d6f565b5b92915050565b7f4e6f7420656e6f75676820746f6b656e732072656d61696e696e6720746f206d60008201527f696e740000000000000000000000000000000000000000000000000000000000602082015250565b6000613e2e602383613196565b9150613e3982613dd2565b604082019050919050565b60006020820190508181036000830152613e5d81613e21565b9050919050565b7f73616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b6000613e9a601283613196565b9150613ea582613e64565b602082019050919050565b60006020820190508181036000830152613ec981613e8d565b9050919050565b6000613edb826133f7565b9150613ee6836133f7565b9250828201905067ffffffffffffffff811115613f0657613f05613d6f565b5b92915050565b7f4d6178696d756d206d696e74696e67206c696d69742065786365656465640000600082015250565b6000613f42601e83613196565b9150613f4d82613f0c565b602082019050919050565b60006020820190508181036000830152613f7181613f35565b9050919050565b6000604082019050613f8d60008301856132d2565b613f9a60208301846132d2565b9392505050565b600081519050613fb081613977565b92915050565b600060208284031215613fcc57613fcb6130c6565b5b6000613fda84828501613fa1565b91505092915050565b6000613fee8261323d565b9150613ff98361323d565b92508282026140078161323d565b9150828204841483151761401e5761401d613d6f565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061405f8261323d565b915061406a8361323d565b92508261407a57614079614025565b5b828204905092915050565b600081905092915050565b50565b60006140a0600083614085565b91506140ab82614090565b600082019050919050565b60006140c182614093565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261412d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826140f0565b61413786836140f0565b95508019841693508086168417925050509392505050565b6000819050919050565b600061417461416f61416a8461323d565b61414f565b61323d565b9050919050565b6000819050919050565b61418e83614159565b6141a261419a8261417b565b8484546140fd565b825550505050565b600090565b6141b76141aa565b6141c2818484614185565b505050565b5b818110156141e6576141db6000826141af565b6001810190506141c8565b5050565b601f82111561422b576141fc816140cb565b614205846140e0565b81016020851015614214578190505b614228614220856140e0565b8301826141c7565b50505b505050565b600082821c905092915050565b600061424e60001984600802614230565b1980831691505092915050565b6000614267838361423d565b9150826002028217905092915050565b6142808261318b565b67ffffffffffffffff8111156142995761429861351c565b5b6142a38254613c03565b6142ae8282856141ea565b600060209050601f8311600181146142e157600084156142cf578287015190505b6142d9858261425b565b865550614341565b601f1984166142ef866140cb565b60005b82811015614317578489015182556001820191506020850194506020810190506142f2565b868310156143345784890151614330601f89168261423d565b8355505b6001600288020188555050505b505050505050565b7f696e76616c696420617272617973206f66206164647265737320616e64206e7560008201527f6d62657200000000000000000000000000000000000000000000000000000000602082015250565b60006143a5602483613196565b91506143b082614349565b604082019050919050565b600060208201905081810360008301526143d481614398565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006144158261323d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361444757614446613d6f565b5b600182019050919050565b7f4d696e74656420746865206d6178696d756d206e6f206f66207075626c69632060008201527f746f6b656e730000000000000000000000000000000000000000000000000000602082015250565b60006144ae602683613196565b91506144b982614452565b604082019050919050565b600060208201905081810360008301526144dd816144a1565b9050919050565b60006144ef8261323d565b91506144fa8361323d565b925082820390508181111561451257614511613d6f565b5b92915050565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b600061454e600e83613196565b915061455982614518565b602082019050919050565b6000602082019050818103600083015261457d81614541565b9050919050565b7f6d617820737570706c792063616e6e6f74206265206d6f7265207468616e206360008201527f757272656e740000000000000000000000000000000000000000000000000000602082015250565b60006145e0602683613196565b91506145eb82614584565b604082019050919050565b6000602082019050818103600083015261460f816145d3565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614672602f83613196565b915061467d82614616565b604082019050919050565b600060208201905081810360008301526146a181614665565b9050919050565b600081905092915050565b60006146be8261318b565b6146c881856146a8565b93506146d88185602086016131a7565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061471a6005836146a8565b9150614725826146e4565b600582019050919050565b600061473c82856146b3565b915061474882846146b3565b91506147538261470d565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006147bb602683613196565b91506147c68261475f565b604082019050919050565b600060208201905081810360008301526147ea816147ae565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614827602083613196565b9150614832826147f1565b602082019050919050565b600060208201905081810360008301526148568161481a565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006148848261485d565b61488e8185614868565b935061489e8185602086016131a7565b6148a7816131d1565b840191505092915050565b60006080820190506148c760008301876132d2565b6148d460208301866132d2565b6148e16040830185613368565b81810360608301526148f38184614879565b905095945050505050565b60008151905061490d816130fc565b92915050565b600060208284031215614929576149286130c6565b5b6000614937848285016148fe565b9150509291505056fea2646970667358221220f37c364f9479e5a9f17580f788c8fa42aa8166e6437cdfba7c7a77a38b3d004164736f6c63430008110033

Deployed Bytecode Sourcemap

84543:7162:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51435:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52337:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58828:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89535:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85035:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58261:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48088:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85891:678;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90315:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91021:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90009:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90689:324;;;;;;;;;;;;;:::i;:::-;;85007:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91234:213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89020:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89817:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88750:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85071:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89260:88;;;;;;;;;;;;;:::i;:::-;;84697:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53730:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87284:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86577:699;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90449:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49272:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32214:103;;;;;;;;;;;;;:::i;:::-;;89375:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31566:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52513:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84858:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59386:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84733:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91455:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84911:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90185:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87820:705;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84814:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84776:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84960:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88874:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89128:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59777:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32472:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51435:639;51520:4;51859:10;51844:25;;:11;:25;;;;:102;;;;51936:10;51921:25;;:11;:25;;;;51844:102;:179;;;;52013:10;51998:25;;:11;:25;;;;51844:179;51824:199;;51435:639;;;:::o;52337:100::-;52391:13;52424:5;52417:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52337:100;:::o;58828:218::-;58904:7;58929:16;58937:7;58929;:16::i;:::-;58924:64;;58954:34;;;;;;;;;;;;;;58924:64;59008:15;:24;59024:7;59008:24;;;;;;;;;;;:30;;;;;;;;;;;;59001:37;;58828:218;;;:::o;89535:244::-;31452:13;:11;:13::i;:::-;89655:20:::1;89647:29:::0;::::1;;;;;;;:::i;:::-;;89631:12;:45;;89609:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;89758:12;89747:24;;;;;;;;:::i;:::-;;89735:9;;:36;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;89535:244:::0;:::o;85035:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58261:408::-;58350:13;58366:16;58374:7;58366;:16::i;:::-;58350:32;;58422:5;58399:28;;:19;:17;:19::i;:::-;:28;;;58395:175;;58447:44;58464:5;58471:19;:17;:19::i;:::-;58447:16;:44::i;:::-;58442:128;;58519:35;;;;;;;;;;;;;;58442:128;58395:175;58615:2;58582:15;:24;58598:7;58582:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;58653:7;58649:2;58633:28;;58642:5;58633:28;;;;;;;;;;;;58339:330;58261:408;;:::o;48088:323::-;48149:7;48377:15;:13;:15::i;:::-;48362:12;;48346:13;;:28;:46;48339:53;;48088:323;:::o;85891:678::-;86040:11;;86053:19;;85316:144;85353:11;;85316:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85383:4;85433:10;85416:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;85406:39;;;;;;85316:18;:144::i;:::-;85294:224;;;;;;;;;;;;:::i;:::-;;;;;;;;;86091:14:::1;85546:201;;85655:9;;85637:14;85620;:12;:14::i;:::-;:31;;;;:::i;:::-;:44;;85598:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;86127:20:::2;85830:10;85817:23;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:23;;;;;;;;:::i;:::-;;;85809:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;86165:19:::3;86187;86195:10;86187:7;:19::i;:::-;86165:41;;86272:20;;;;;;;;;;;86239:53;;86254:14;86239:12;:29;;;;:::i;:::-;:53;;;;86217:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;86465:50;86473:10;86500:14;86485:12;:29;;;;:::i;:::-;86465:7;:50::i;:::-;86528:33;86534:10;86546:14;86528:33;;:5;:33::i;:::-;86154:415;85738:1:::2;85529::::1;85891:678:::0;;;;;;:::o;90315:126::-;31452:13;:11;:13::i;:::-;90417:16:::1;90399:15;:34;;;;90315:126:::0;:::o;91021:205::-;91164:4;3665:1;2479:42;3619:43;;;:47;3615:699;;;3906:10;3898:18;;:4;:18;;;3894:85;;91181:37:::1;91200:4;91206:2;91210:7;91181:18;:37::i;:::-;3957:7:::0;;3894:85;2479:42;4039:40;;;4088:4;4095:10;4039:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2479:42;4135:40;;;4184:4;4191;4135:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4039:157;3993:310;;4276:10;4257:30;;;;;;;;;;;:::i;:::-;;;;;;;;3993:310;3615:699;91181:37:::1;91200:4;91206:2;91210:7;91181:18;:37::i;:::-;91021:205:::0;;;;;:::o;90009:168::-;31452:13;:11;:13::i;:::-;90148:21:::1;90125:20;;:44;;;;;;;;;;;;;;;;;;90009:168:::0;:::o;90689:324::-;31452:13;:11;:13::i;:::-;90740:7:::1;90761:42;90753:56;;90861:3;90856:1;90832:21;:25;;;;:::i;:::-;90831:33;;;;:::i;:::-;90753:126;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90739:140;;;90898:2;90890:11;;;::::0;::::1;;90915:7;90936;:5;:7::i;:::-;90928:21;;90957;90928:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90914:69;;;91002:2;90994:11;;;::::0;::::1;;90728:285;;90689:324::o:0;85007:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;91234:213::-;91381:4;3665:1;2479:42;3619:43;;;:47;3615:699;;;3906:10;3898:18;;:4;:18;;;3894:85;;91398:41:::1;91421:4;91427:2;91431:7;91398:22;:41::i;:::-;3957:7:::0;;3894:85;2479:42;4039:40;;;4088:4;4095:10;4039:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2479:42;4135:40;;;4184:4;4191;4135:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4039:157;3993:310;;4276:10;4257:30;;;;;;;;;;;:::i;:::-;;;;;;;;3993:310;3615:699;91398:41:::1;91421:4;91427:2;91431:7;91398:22;:41::i;:::-;91234:213:::0;;;;;:::o;89020:100::-;31452:13;:11;:13::i;:::-;89104:8:::1;89094:7;:18;;;;;;:::i;:::-;;89020:100:::0;:::o;89817:184::-;31452:13;:11;:13::i;:::-;89968:25:::1;89941:24;;:52;;;;;;;;;;;;;;;;;;89817:184:::0;:::o;88750:116::-;88815:6;88841:17;88849:8;88841:7;:17::i;:::-;88834:24;;88750:116;;;:::o;85071:30::-;;;;;;;;;;;;;:::o;89260:88::-;31452:13;:11;:13::i;:::-;89330:10:::1;;;;;;;;;;;89329:11;89316:10;;:24;;;;;;;;;;;;;;;;;;89260:88::o:0;84697:27::-;;;;;;;;;;;;;:::o;53730:152::-;53802:7;53845:27;53864:7;53845:18;:27::i;:::-;53822:52;;53730:152;;;:::o;87284:528::-;31452:13;:11;:13::i;:::-;87445:15:::1;:22;87431:3;:10;:36;87409:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;87549:9;87544:261;87568:3;:10;87564:1;:14;87544:261;;;87665:9;;87643:15;87659:1;87643:18;;;;;;;;:::i;:::-;;;;;;;;87626:14;:12;:14::i;:::-;:35;;;;:::i;:::-;:48;;87600:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;87760:33;87766:3;87770:1;87766:6;;;;;;;;:::i;:::-;;;;;;;;87774:15;87790:1;87774:18;;;;;;;;:::i;:::-;;;;;;;;87760:5;:33::i;:::-;87580:3;;;;;:::i;:::-;;;;87544:261;;;;87284:528:::0;;:::o;86577:699::-;86672:14;85546:201;;85655:9;;85637:14;85620;:12;:14::i;:::-;:31;;;;:::i;:::-;:44;;85598:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;86708:17:::1;85830:10;85817:23;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:23;;;;;;;;:::i;:::-;;;85809:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;86800:15:::2;;86782:14;86765:31;;:14;:12;:14::i;:::-;:31;;;;:::i;:::-;:50;;86743:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;87018:24;;;;;;;;;;;86914:128;;86983:14;86914:83;;86943:19;86951:10;86943:7;:19::i;:::-;86915:47;;:25;86929:10;86915:13;:25::i;:::-;:47;;;;:::i;:::-;86914:83;;;;:::i;:::-;:128;;86892:208;;;;;;;;;;;;:::i;:::-;;;;;;;;;87166:14;87148:32;;:15;;:32;;;;:::i;:::-;87135:9;:45;;87113:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;87235:33;87241:10;87253:14;87235:33;;:5;:33::i;:::-;85738:1:::1;86577:699:::0;;:::o;90449:232::-;31452:13;:11;:13::i;:::-;90562:9:::1;;90546:13;:25;90524:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;90660:13;90648:9;:25;;;;90449:232:::0;:::o;49272:233::-;49344:7;49385:1;49368:19;;:5;:19;;;49364:60;;49396:28;;;;;;;;;;;;;;49364:60;43431:13;49442:18;:25;49461:5;49442:25;;;;;;;;;;;;;;;;:55;49435:62;;49272:233;;;:::o;32214:103::-;31452:13;:11;:13::i;:::-;32279:30:::1;32306:1;32279:18;:30::i;:::-;32214:103::o:0;89375:106::-;31452:13;:11;:13::i;:::-;89467:6:::1;89449:15;:24;;;;89375:106:::0;:::o;31566:87::-;31612:7;31639:6;;;;;;;;;;;31632:13;;31566:87;:::o;52513:104::-;52569:13;52602:7;52595:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52513:104;:::o;84858:44::-;;;;:::o;59386:234::-;59533:8;59481:18;:39;59500:19;:17;:19::i;:::-;59481:39;;;;;;;;;;;;;;;:49;59521:8;59481:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;59593:8;59557:55;;59572:19;:17;:19::i;:::-;59557:55;;;59603:8;59557:55;;;;;;:::i;:::-;;;;;;;;59386:234;;:::o;84733:34::-;;;;:::o;91455:247::-;91630:4;3665:1;2479:42;3619:43;;;:47;3615:699;;;3906:10;3898:18;;:4;:18;;;3894:85;;91647:47:::1;91670:4;91676:2;91680:7;91689:4;91647:22;:47::i;:::-;3957:7:::0;;3894:85;2479:42;4039:40;;;4088:4;4095:10;4039:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2479:42;4135:40;;;4184:4;4191;4135:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4039:157;3993:310;;4276:10;4257:30;;;;;;;;;;;:::i;:::-;;;;;;;;3993:310;3615:699;91647:47:::1;91670:4;91676:2;91680:7;91689:4;91647:22;:47::i;:::-;91455:247:::0;;;;;;:::o;84911:42::-;;;;;;;;;;;;;:::o;90185:122::-;31452:13;:11;:13::i;:::-;90289:10:::1;90267:19;:32;;;;90185:122:::0;:::o;87820:705::-;87922:13;87975:17;87983:8;87975:7;:17::i;:::-;87953:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;88085:10;;;;;;;;;;;88080:64;;88119:13;88112:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88080:64;88156:28;88187:10;:8;:10::i;:::-;88156:41;;88259:1;88234:14;88228:28;:32;:289;;;;;;;;;;;;;;;;;88352:14;88393:26;88410:8;88393:16;:26::i;:::-;88309:167;;;;;;;;;:::i;:::-;;;;;;;;;;;;;88228:289;88208:309;;;87820:705;;;;:::o;84814:37::-;;;;:::o;84776:31::-;;;;:::o;84960:38::-;;;;;;;;;;;;;:::o;88874:121::-;88937:7;88964:23;88978:8;88964:13;:23::i;:::-;88957:30;;88874:121;;;:::o;89128:124::-;31452:13;:11;:13::i;:::-;89230:14:::1;89214:13;:30;;;;;;:::i;:::-;;89128:124:::0;:::o;59777:164::-;59874:4;59898:18;:25;59917:5;59898:25;;;;;;;;;;;;;;;:35;59924:8;59898:35;;;;;;;;;;;;;;;;;;;;;;;;;59891:42;;59777:164;;;;:::o;32472:201::-;31452:13;:11;:13::i;:::-;32581:1:::1;32561:22;;:8;:22;;::::0;32553:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;32637:28;32656:8;32637:18;:28::i;:::-;32472:201:::0;:::o;60199:282::-;60264:4;60320:7;60301:15;:13;:15::i;:::-;:26;;:66;;;;;60354:13;;60344:7;:23;60301:66;:153;;;;;60453:1;44207:8;60405:17;:26;60423:7;60405:26;;;;;;;;;;;;:44;:49;60301:153;60281:173;;60199:282;;;:::o;31731:132::-;31806:12;:10;:12::i;:::-;31795:23;;:7;:5;:7::i;:::-;:23;;;31787:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31731:132::o;82507:105::-;82567:7;82594:10;82587:17;;82507:105;:::o;88641:101::-;88706:7;88733:1;88726:8;;88641:101;:::o;5900:190::-;6025:4;6078;6049:25;6062:5;6069:4;6049:12;:25::i;:::-;:33;6042:40;;5900:190;;;;;:::o;48509:296::-;48564:7;48771:15;:13;:15::i;:::-;48755:13;;:31;48748:38;;48509:296;:::o;50159:137::-;50214:6;43805:3;50247:18;:25;50266:5;50247:25;;;;;;;;;;;;;;;;:40;;50233:55;;50159:137;;;:::o;50484:404::-;50556:14;50573:18;:25;50592:5;50573:25;;;;;;;;;;;;;;;;50556:42;;50609:17;50739:3;50726:16;;43805:3;50810:9;:24;;43950:14;50773:6;:32;50772:63;50763:72;;50874:6;50846:18;:25;50865:5;50846:25;;;;;;;;;;;;;;;:34;;;;50545:343;;50484:404;;:::o;69848:2966::-;69921:20;69944:13;;69921:36;;69984:1;69972:8;:13;69968:44;;69994:18;;;;;;;;;;;;;;69968:44;70025:61;70055:1;70059:2;70063:12;70077:8;70025:21;:61::i;:::-;70569:1;43569:2;70539:1;:26;;70538:32;70526:8;:45;70500:18;:22;70519:2;70500:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;70848:139;70885:2;70939:33;70962:1;70966:2;70970:1;70939:14;:33::i;:::-;70906:30;70927:8;70906:20;:30::i;:::-;:66;70848:18;:139::i;:::-;70814:17;:31;70832:12;70814:31;;;;;;;;;;;:173;;;;71004:16;71035:11;71064:8;71049:12;:23;71035:37;;71585:16;71581:2;71577:25;71565:37;;71957:12;71917:8;71876:1;71814:25;71755:1;71694;71667:335;72328:1;72314:12;72310:20;72268:346;72369:3;72360:7;72357:16;72268:346;;72587:7;72577:8;72574:1;72547:25;72544:1;72541;72536:59;72422:1;72413:7;72409:15;72398:26;;72268:346;;;72272:77;72659:1;72647:8;:13;72643:45;;72669:19;;;;;;;;;;;;;;72643:45;72721:3;72705:13;:19;;;;70274:2462;;72746:60;72775:1;72779:2;72783:12;72797:8;72746:20;:60::i;:::-;69910:2904;69848:2966;;:::o;62467:2825::-;62609:27;62639;62658:7;62639:18;:27::i;:::-;62609:57;;62724:4;62683:45;;62699:19;62683:45;;;62679:86;;62737:28;;;;;;;;;;;;;;62679:86;62779:27;62808:23;62835:35;62862:7;62835:26;:35::i;:::-;62778:92;;;;62970:68;62995:15;63012:4;63018:19;:17;:19::i;:::-;62970:24;:68::i;:::-;62965:180;;63058:43;63075:4;63081:19;:17;:19::i;:::-;63058:16;:43::i;:::-;63053:92;;63110:35;;;;;;;;;;;;;;63053:92;62965:180;63176:1;63162:16;;:2;:16;;;63158:52;;63187:23;;;;;;;;;;;;;;63158:52;63223:43;63245:4;63251:2;63255:7;63264:1;63223:21;:43::i;:::-;63359:15;63356:160;;;63499:1;63478:19;63471:30;63356:160;63896:18;:24;63915:4;63896:24;;;;;;;;;;;;;;;;63894:26;;;;;;;;;;;;63965:18;:22;63984:2;63965:22;;;;;;;;;;;;;;;;63963:24;;;;;;;;;;;64287:146;64324:2;64373:45;64388:4;64394:2;64398:19;64373:14;:45::i;:::-;44487:8;64345:73;64287:18;:146::i;:::-;64258:17;:26;64276:7;64258:26;;;;;;;;;;;:175;;;;64604:1;44487:8;64553:19;:47;:52;64549:627;;64626:19;64658:1;64648:7;:11;64626:33;;64815:1;64781:17;:30;64799:11;64781:30;;;;;;;;;;;;:35;64777:384;;64919:13;;64904:11;:28;64900:242;;65099:19;65066:17;:30;65084:11;65066:30;;;;;;;;;;;:52;;;;64900:242;64777:384;64607:569;64549:627;65223:7;65219:2;65204:27;;65213:4;65204:27;;;;;;;;;;;;65242:42;65263:4;65269:2;65273:7;65282:1;65242:20;:42::i;:::-;62598:2694;;;62467:2825;;;:::o;65388:193::-;65534:39;65551:4;65557:2;65561:7;65534:39;;;;;;;;;;;;:16;:39::i;:::-;65388:193;;;:::o;54885:1275::-;54952:7;54972:12;54987:7;54972:22;;55055:4;55036:15;:13;:15::i;:::-;:23;55032:1061;;55089:13;;55082:4;:20;55078:1015;;;55127:14;55144:17;:23;55162:4;55144:23;;;;;;;;;;;;55127:40;;55261:1;44207:8;55233:6;:24;:29;55229:845;;55898:113;55915:1;55905:6;:11;55898:113;;55958:17;:25;55976:6;;;;;;;55958:25;;;;;;;;;;;;55949:34;;55898:113;;;56044:6;56037:13;;;;;;55229:845;55104:989;55078:1015;55032:1061;56121:31;;;;;;;;;;;;;;54885:1275;;;;:::o;49587:178::-;49648:7;43431:13;43569:2;49676:18;:25;49695:5;49676:25;;;;;;;;;;;;;;;;:50;;49675:82;49668:89;;49587:178;;;:::o;32833:191::-;32907:16;32926:6;;;;;;;;;;;32907:25;;32952:8;32943:6;;:17;;;;;;;;;;;;;;;;;;33007:8;32976:40;;32997:8;32976:40;;;;;;;;;;;;32896:128;32833:191;:::o;66179:407::-;66354:31;66367:4;66373:2;66377:7;66354:12;:31::i;:::-;66418:1;66400:2;:14;;;:19;66396:183;;66439:56;66470:4;66476:2;66480:7;66489:5;66439:30;:56::i;:::-;66434:145;;66523:40;;;;;;;;;;;;;;66434:145;66396:183;66179:407;;;;:::o;88533:100::-;88585:13;88618:7;88611:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88533:100;:::o;27544:716::-;27600:13;27651:14;27688:1;27668:17;27679:5;27668:10;:17::i;:::-;:21;27651:38;;27704:20;27738:6;27727:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27704:41;;27760:11;27889:6;27885:2;27881:15;27873:6;27869:28;27862:35;;27926:288;27933:4;27926:288;;;27958:5;;;;;;;;28100:8;28095:2;28088:5;28084:14;28079:30;28074:3;28066:44;28156:2;28147:11;;;;;;:::i;:::-;;;;;28190:1;28181:5;:10;27926:288;28177:21;27926:288;28235:6;28228:13;;;;;27544:716;;;:::o;30117:98::-;30170:7;30197:10;30190:17;;30117:98;:::o;6767:296::-;6850:7;6870:20;6893:4;6870:27;;6913:9;6908:118;6932:5;:12;6928:1;:16;6908:118;;;6981:33;6991:12;7005:5;7011:1;7005:8;;;;;;;;:::i;:::-;;;;;;;;6981:9;:33::i;:::-;6966:48;;6946:3;;;;;:::i;:::-;;;;6908:118;;;;7043:12;7036:19;;;6767:296;;;;:::o;67248:159::-;;;;;:::o;81816:311::-;81951:7;81971:16;44611:3;81997:19;:41;;81971:68;;44611:3;82065:31;82076:4;82082:2;82086:9;82065:10;:31::i;:::-;82057:40;;:62;;82050:69;;;81816:311;;;;;:::o;57260:324::-;57330:14;57563:1;57553:8;57550:15;57524:24;57520:46;57510:56;;57260:324;;;:::o;56708:450::-;56788:14;56956:16;56949:5;56945:28;56936:37;;57133:5;57119:11;57094:23;57090:41;57087:52;57080:5;57077:63;57067:73;;56708:450;;;;:::o;68072:158::-;;;;;:::o;61362:485::-;61464:27;61493:23;61534:38;61575:15;:24;61591:7;61575:24;;;;;;;;;;;61534:65;;61752:18;61729:41;;61809:19;61803:26;61784:45;;61714:126;61362:485;;;:::o;60590:659::-;60739:11;60904:16;60897:5;60893:28;60884:37;;61064:16;61053:9;61049:32;61036:45;;61214:15;61203:9;61200:30;61192:5;61181:9;61178:20;61175:56;61165:66;;60590:659;;;;;:::o;68670:716::-;68833:4;68879:2;68854:45;;;68900:19;:17;:19::i;:::-;68921:4;68927:7;68936:5;68854:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;68850:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69154:1;69137:6;:13;:18;69133:235;;69183:40;;;;;;;;;;;;;;69133:235;69326:6;69320:13;69311:6;69307:2;69303:15;69296:38;68850:529;69023:54;;;69013:64;;;:6;:64;;;;69006:71;;;68670:716;;;;;;:::o;24410:922::-;24463:7;24483:14;24500:1;24483:18;;24550:6;24541:5;:15;24537:102;;24586:6;24577:15;;;;;;:::i;:::-;;;;;24621:2;24611:12;;;;24537:102;24666:6;24657:5;:15;24653:102;;24702:6;24693:15;;;;;;:::i;:::-;;;;;24737:2;24727:12;;;;24653:102;24782:6;24773:5;:15;24769:102;;24818:6;24809:15;;;;;;:::i;:::-;;;;;24853:2;24843:12;;;;24769:102;24898:5;24889;:14;24885:99;;24933:5;24924:14;;;;;;:::i;:::-;;;;;24967:1;24957:11;;;;24885:99;25011:5;25002;:14;24998:99;;25046:5;25037:14;;;;;;:::i;:::-;;;;;25080:1;25070:11;;;;24998:99;25124:5;25115;:14;25111:99;;25159:5;25150:14;;;;;;:::i;:::-;;;;;25193:1;25183:11;;;;25111:99;25237:5;25228;:14;25224:66;;25273:1;25263:11;;;;25224:66;25318:6;25311:13;;;24410:922;;;:::o;13807:149::-;13870:7;13901:1;13897;:5;:51;;13928:20;13943:1;13946;13928:14;:20::i;:::-;13897:51;;;13905:20;13920:1;13923;13905:14;:20::i;:::-;13897:51;13890:58;;13807:149;;;;:::o;81517:147::-;81654:6;81517:147;;;;;:::o;13964:268::-;14032:13;14139:1;14133:4;14126:15;14168:1;14162:4;14155:15;14209:4;14203;14193:21;14184:30;;13964:268;;;;:::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:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:117::-;5351:1;5348;5341:12;5365:117;5474:1;5471;5464:12;5488:117;5597:1;5594;5587:12;5628:568;5701:8;5711:6;5761:3;5754:4;5746:6;5742:17;5738:27;5728:122;;5769:79;;:::i;:::-;5728:122;5882:6;5869:20;5859:30;;5912:18;5904:6;5901:30;5898:117;;;5934:79;;:::i;:::-;5898:117;6048:4;6040:6;6036:17;6024:29;;6102:3;6094:4;6086:6;6082:17;6072:8;6068:32;6065:41;6062:128;;;6109:79;;:::i;:::-;6062:128;5628:568;;;;;:::o;6202:101::-;6238:7;6278:18;6271:5;6267:30;6256:41;;6202:101;;;:::o;6309:120::-;6381:23;6398:5;6381:23;:::i;:::-;6374:5;6371:34;6361:62;;6419:1;6416;6409:12;6361:62;6309:120;:::o;6435:137::-;6480:5;6518:6;6505:20;6496:29;;6534:32;6560:5;6534:32;:::i;:::-;6435:137;;;;:::o;6578:702::-;6672:6;6680;6688;6737:2;6725:9;6716:7;6712:23;6708:32;6705:119;;;6743:79;;:::i;:::-;6705:119;6891:1;6880:9;6876:17;6863:31;6921:18;6913:6;6910:30;6907:117;;;6943:79;;:::i;:::-;6907:117;7056:80;7128:7;7119:6;7108:9;7104:22;7056:80;:::i;:::-;7038:98;;;;6834:312;7185:2;7211:52;7255:7;7246:6;7235:9;7231:22;7211:52;:::i;:::-;7201:62;;7156:117;6578:702;;;;;:::o;7286:619::-;7363:6;7371;7379;7428:2;7416:9;7407:7;7403:23;7399:32;7396:119;;;7434:79;;:::i;:::-;7396:119;7554:1;7579:53;7624:7;7615:6;7604:9;7600:22;7579:53;:::i;:::-;7569:63;;7525:117;7681:2;7707:53;7752:7;7743:6;7732:9;7728:22;7707:53;:::i;:::-;7697:63;;7652:118;7809:2;7835:53;7880:7;7871:6;7860:9;7856:22;7835:53;:::i;:::-;7825:63;;7780:118;7286:619;;;;;:::o;7911:327::-;7969:6;8018:2;8006:9;7997:7;7993:23;7989:32;7986:119;;;8024:79;;:::i;:::-;7986:119;8144:1;8169:52;8213:7;8204:6;8193:9;8189:22;8169:52;:::i;:::-;8159:62;;8115:116;7911:327;;;;:::o;8244:117::-;8353:1;8350;8343:12;8367:180;8415:77;8412:1;8405:88;8512:4;8509:1;8502:15;8536:4;8533:1;8526:15;8553:281;8636:27;8658:4;8636:27;:::i;:::-;8628:6;8624:40;8766:6;8754:10;8751:22;8730:18;8718:10;8715:34;8712:62;8709:88;;;8777:18;;:::i;:::-;8709:88;8817:10;8813:2;8806:22;8596:238;8553:281;;:::o;8840:129::-;8874:6;8901:20;;:::i;:::-;8891:30;;8930:33;8958:4;8950:6;8930:33;:::i;:::-;8840:129;;;:::o;8975:308::-;9037:4;9127:18;9119:6;9116:30;9113:56;;;9149:18;;:::i;:::-;9113:56;9187:29;9209:6;9187:29;:::i;:::-;9179:37;;9271:4;9265;9261:15;9253:23;;8975:308;;;:::o;9289:146::-;9386:6;9381:3;9376;9363:30;9427:1;9418:6;9413:3;9409:16;9402:27;9289:146;;;:::o;9441:425::-;9519:5;9544:66;9560:49;9602:6;9560:49;:::i;:::-;9544:66;:::i;:::-;9535:75;;9633:6;9626:5;9619:21;9671:4;9664:5;9660:16;9709:3;9700:6;9695:3;9691:16;9688:25;9685:112;;;9716:79;;:::i;:::-;9685:112;9806:54;9853:6;9848:3;9843;9806:54;:::i;:::-;9525:341;9441:425;;;;;:::o;9886:340::-;9942:5;9991:3;9984:4;9976:6;9972:17;9968:27;9958:122;;9999:79;;:::i;:::-;9958:122;10116:6;10103:20;10141:79;10216:3;10208:6;10201:4;10193:6;10189:17;10141:79;:::i;:::-;10132:88;;9948:278;9886:340;;;;:::o;10232:509::-;10301:6;10350:2;10338:9;10329:7;10325:23;10321:32;10318:119;;;10356:79;;:::i;:::-;10318:119;10504:1;10493:9;10489:17;10476:31;10534:18;10526:6;10523:30;10520:117;;;10556:79;;:::i;:::-;10520:117;10661:63;10716:7;10707:6;10696:9;10692:22;10661:63;:::i;:::-;10651:73;;10447:287;10232:509;;;;:::o;10747:329::-;10806:6;10855:2;10843:9;10834:7;10830:23;10826:32;10823:119;;;10861:79;;:::i;:::-;10823:119;10981:1;11006:53;11051:7;11042:6;11031:9;11027:22;11006:53;:::i;:::-;10996:63;;10952:117;10747:329;;;;:::o;11082:115::-;11167:23;11184:5;11167:23;:::i;:::-;11162:3;11155:36;11082:115;;:::o;11203:218::-;11294:4;11332:2;11321:9;11317:18;11309:26;;11345:69;11411:1;11400:9;11396:17;11387:6;11345:69;:::i;:::-;11203:218;;;;:::o;11427:180::-;11475:77;11472:1;11465:88;11572:4;11569:1;11562:15;11596:4;11593:1;11586:15;11613:120;11701:1;11694:5;11691:12;11681:46;;11707:18;;:::i;:::-;11681:46;11613:120;:::o;11739:141::-;11791:7;11820:5;11809:16;;11826:48;11868:5;11826:48;:::i;:::-;11739:141;;;:::o;11886:::-;11949:9;11982:39;12015:5;11982:39;:::i;:::-;11969:52;;11886:141;;;:::o;12033:157::-;12133:50;12177:5;12133:50;:::i;:::-;12128:3;12121:63;12033:157;;:::o;12196:248::-;12302:4;12340:2;12329:9;12325:18;12317:26;;12353:84;12434:1;12423:9;12419:17;12410:6;12353:84;:::i;:::-;12196:248;;;;:::o;12450:311::-;12527:4;12617:18;12609:6;12606:30;12603:56;;;12639:18;;:::i;:::-;12603:56;12689:4;12681:6;12677:17;12669:25;;12749:4;12743;12739:15;12731:23;;12450:311;;;:::o;12784:710::-;12880:5;12905:81;12921:64;12978:6;12921:64;:::i;:::-;12905:81;:::i;:::-;12896:90;;13006:5;13035:6;13028:5;13021:21;13069:4;13062:5;13058:16;13051:23;;13122:4;13114:6;13110:17;13102:6;13098:30;13151:3;13143:6;13140:15;13137:122;;;13170:79;;:::i;:::-;13137:122;13285:6;13268:220;13302:6;13297:3;13294:15;13268:220;;;13377:3;13406:37;13439:3;13427:10;13406:37;:::i;:::-;13401:3;13394:50;13473:4;13468:3;13464:14;13457:21;;13344:144;13328:4;13323:3;13319:14;13312:21;;13268:220;;;13272:21;12886:608;;12784:710;;;;;:::o;13517:370::-;13588:5;13637:3;13630:4;13622:6;13618:17;13614:27;13604:122;;13645:79;;:::i;:::-;13604:122;13762:6;13749:20;13787:94;13877:3;13869:6;13862:4;13854:6;13850:17;13787:94;:::i;:::-;13778:103;;13594:293;13517:370;;;;:::o;13893:311::-;13970:4;14060:18;14052:6;14049:30;14046:56;;;14082:18;;:::i;:::-;14046:56;14132:4;14124:6;14120:17;14112:25;;14192:4;14186;14182:15;14174:23;;13893:311;;;:::o;14227:710::-;14323:5;14348:81;14364:64;14421:6;14364:64;:::i;:::-;14348:81;:::i;:::-;14339:90;;14449:5;14478:6;14471:5;14464:21;14512:4;14505:5;14501:16;14494:23;;14565:4;14557:6;14553:17;14545:6;14541:30;14594:3;14586:6;14583:15;14580:122;;;14613:79;;:::i;:::-;14580:122;14728:6;14711:220;14745:6;14740:3;14737:15;14711:220;;;14820:3;14849:37;14882:3;14870:10;14849:37;:::i;:::-;14844:3;14837:50;14916:4;14911:3;14907:14;14900:21;;14787:144;14771:4;14766:3;14762:14;14755:21;;14711:220;;;14715:21;14329:608;;14227:710;;;;;:::o;14960:370::-;15031:5;15080:3;15073:4;15065:6;15061:17;15057:27;15047:122;;15088:79;;:::i;:::-;15047:122;15205:6;15192:20;15230:94;15320:3;15312:6;15305:4;15297:6;15293:17;15230:94;:::i;:::-;15221:103;;15037:293;14960:370;;;;:::o;15336:894::-;15454:6;15462;15511:2;15499:9;15490:7;15486:23;15482:32;15479:119;;;15517:79;;:::i;:::-;15479:119;15665:1;15654:9;15650:17;15637:31;15695:18;15687:6;15684:30;15681:117;;;15717:79;;:::i;:::-;15681:117;15822:78;15892:7;15883:6;15872:9;15868:22;15822:78;:::i;:::-;15812:88;;15608:302;15977:2;15966:9;15962:18;15949:32;16008:18;16000:6;15997:30;15994:117;;;16030:79;;:::i;:::-;15994:117;16135:78;16205:7;16196:6;16185:9;16181:22;16135:78;:::i;:::-;16125:88;;15920:303;15336:894;;;;;:::o;16236:116::-;16306:21;16321:5;16306:21;:::i;:::-;16299:5;16296:32;16286:60;;16342:1;16339;16332:12;16286:60;16236:116;:::o;16358:133::-;16401:5;16439:6;16426:20;16417:29;;16455:30;16479:5;16455:30;:::i;:::-;16358:133;;;;:::o;16497:468::-;16562:6;16570;16619:2;16607:9;16598:7;16594:23;16590:32;16587:119;;;16625:79;;:::i;:::-;16587:119;16745:1;16770:53;16815:7;16806:6;16795:9;16791:22;16770:53;:::i;:::-;16760:63;;16716:117;16872:2;16898:50;16940:7;16931:6;16920:9;16916:22;16898:50;:::i;:::-;16888:60;;16843:115;16497:468;;;;;:::o;16971:77::-;17008:7;17037:5;17026:16;;16971:77;;;:::o;17054:118::-;17141:24;17159:5;17141:24;:::i;:::-;17136:3;17129:37;17054:118;;:::o;17178:222::-;17271:4;17309:2;17298:9;17294:18;17286:26;;17322:71;17390:1;17379:9;17375:17;17366:6;17322:71;:::i;:::-;17178:222;;;;:::o;17406:307::-;17467:4;17557:18;17549:6;17546:30;17543:56;;;17579:18;;:::i;:::-;17543:56;17617:29;17639:6;17617:29;:::i;:::-;17609:37;;17701:4;17695;17691:15;17683:23;;17406:307;;;:::o;17719:423::-;17796:5;17821:65;17837:48;17878:6;17837:48;:::i;:::-;17821:65;:::i;:::-;17812:74;;17909:6;17902:5;17895:21;17947:4;17940:5;17936:16;17985:3;17976:6;17971:3;17967:16;17964:25;17961:112;;;17992:79;;:::i;:::-;17961:112;18082:54;18129:6;18124:3;18119;18082:54;:::i;:::-;17802:340;17719:423;;;;;:::o;18161:338::-;18216:5;18265:3;18258:4;18250:6;18246:17;18242:27;18232:122;;18273:79;;:::i;:::-;18232:122;18390:6;18377:20;18415:78;18489:3;18481:6;18474:4;18466:6;18462:17;18415:78;:::i;:::-;18406:87;;18222:277;18161:338;;;;:::o;18505:943::-;18600:6;18608;18616;18624;18673:3;18661:9;18652:7;18648:23;18644:33;18641:120;;;18680:79;;:::i;:::-;18641:120;18800:1;18825:53;18870:7;18861:6;18850:9;18846:22;18825:53;:::i;:::-;18815:63;;18771:117;18927:2;18953:53;18998:7;18989:6;18978:9;18974:22;18953:53;:::i;:::-;18943:63;;18898:118;19055:2;19081:53;19126:7;19117:6;19106:9;19102:22;19081:53;:::i;:::-;19071:63;;19026:118;19211:2;19200:9;19196:18;19183:32;19242:18;19234:6;19231:30;19228:117;;;19264:79;;:::i;:::-;19228:117;19369:62;19423:7;19414:6;19403:9;19399:22;19369:62;:::i;:::-;19359:72;;19154:287;18505:943;;;;;;;:::o;19454:122::-;19527:24;19545:5;19527:24;:::i;:::-;19520:5;19517:35;19507:63;;19566:1;19563;19556:12;19507:63;19454:122;:::o;19582:139::-;19628:5;19666:6;19653:20;19644:29;;19682:33;19709:5;19682:33;:::i;:::-;19582:139;;;;:::o;19727:329::-;19786:6;19835:2;19823:9;19814:7;19810:23;19806:32;19803:119;;;19841:79;;:::i;:::-;19803:119;19961:1;19986:53;20031:7;20022:6;20011:9;20007:22;19986:53;:::i;:::-;19976:63;;19932:117;19727:329;;;;:::o;20062:474::-;20130:6;20138;20187:2;20175:9;20166:7;20162:23;20158:32;20155:119;;;20193:79;;:::i;:::-;20155:119;20313:1;20338:53;20383:7;20374:6;20363:9;20359:22;20338:53;:::i;:::-;20328:63;;20284:117;20440:2;20466:53;20511:7;20502:6;20491:9;20487:22;20466:53;:::i;:::-;20456:63;;20411:118;20062:474;;;;;:::o;20542:180::-;20590:77;20587:1;20580:88;20687:4;20684:1;20677:15;20711:4;20708:1;20701:15;20728:320;20772:6;20809:1;20803:4;20799:12;20789:22;;20856:1;20850:4;20846:12;20877:18;20867:81;;20933:4;20925:6;20921:17;20911:27;;20867:81;20995:2;20987:6;20984:14;20964:18;20961:38;20958:84;;21014:18;;:::i;:::-;20958:84;20779:269;20728:320;;;:::o;21054:170::-;21194:22;21190:1;21182:6;21178:14;21171:46;21054:170;:::o;21230:366::-;21372:3;21393:67;21457:2;21452:3;21393:67;:::i;:::-;21386:74;;21469:93;21558:3;21469:93;:::i;:::-;21587:2;21582:3;21578:12;21571:19;;21230:366;;;:::o;21602:419::-;21768:4;21806:2;21795:9;21791:18;21783:26;;21855:9;21849:4;21845:20;21841:1;21830:9;21826:17;21819:47;21883:131;22009:4;21883:131;:::i;:::-;21875:139;;21602:419;;;:::o;22027:94::-;22060:8;22108:5;22104:2;22100:14;22079:35;;22027:94;;;:::o;22127:::-;22166:7;22195:20;22209:5;22195:20;:::i;:::-;22184:31;;22127:94;;;:::o;22227:100::-;22266:7;22295:26;22315:5;22295:26;:::i;:::-;22284:37;;22227:100;;;:::o;22333:157::-;22438:45;22458:24;22476:5;22458:24;:::i;:::-;22438:45;:::i;:::-;22433:3;22426:58;22333:157;;:::o;22496:256::-;22608:3;22623:75;22694:3;22685:6;22623:75;:::i;:::-;22723:2;22718:3;22714:12;22707:19;;22743:3;22736:10;;22496:256;;;;:::o;22758:180::-;22898:32;22894:1;22886:6;22882:14;22875:56;22758:180;:::o;22944:366::-;23086:3;23107:67;23171:2;23166:3;23107:67;:::i;:::-;23100:74;;23183:93;23272:3;23183:93;:::i;:::-;23301:2;23296:3;23292:12;23285:19;;22944:366;;;:::o;23316:419::-;23482:4;23520:2;23509:9;23505:18;23497:26;;23569:9;23563:4;23559:20;23555:1;23544:9;23540:17;23533:47;23597:131;23723:4;23597:131;:::i;:::-;23589:139;;23316:419;;;:::o;23741:180::-;23789:77;23786:1;23779:88;23886:4;23883:1;23876:15;23910:4;23907:1;23900:15;23927:191;23967:3;23986:20;24004:1;23986:20;:::i;:::-;23981:25;;24020:20;24038:1;24020:20;:::i;:::-;24015:25;;24063:1;24060;24056:9;24049:16;;24084:3;24081:1;24078:10;24075:36;;;24091:18;;:::i;:::-;24075:36;23927:191;;;;:::o;24124:222::-;24264:34;24260:1;24252:6;24248:14;24241:58;24333:5;24328:2;24320:6;24316:15;24309:30;24124:222;:::o;24352:366::-;24494:3;24515:67;24579:2;24574:3;24515:67;:::i;:::-;24508:74;;24591:93;24680:3;24591:93;:::i;:::-;24709:2;24704:3;24700:12;24693:19;;24352:366;;;:::o;24724:419::-;24890:4;24928:2;24917:9;24913:18;24905:26;;24977:9;24971:4;24967:20;24963:1;24952:9;24948:17;24941:47;25005:131;25131:4;25005:131;:::i;:::-;24997:139;;24724:419;;;:::o;25149:168::-;25289:20;25285:1;25277:6;25273:14;25266:44;25149:168;:::o;25323:366::-;25465:3;25486:67;25550:2;25545:3;25486:67;:::i;:::-;25479:74;;25562:93;25651:3;25562:93;:::i;:::-;25680:2;25675:3;25671:12;25664:19;;25323:366;;;:::o;25695:419::-;25861:4;25899:2;25888:9;25884:18;25876:26;;25948:9;25942:4;25938:20;25934:1;25923:9;25919:17;25912:47;25976:131;26102:4;25976:131;:::i;:::-;25968:139;;25695:419;;;:::o;26120:205::-;26159:3;26178:19;26195:1;26178:19;:::i;:::-;26173:24;;26211:19;26228:1;26211:19;:::i;:::-;26206:24;;26253:1;26250;26246:9;26239:16;;26276:18;26271:3;26268:27;26265:53;;;26298:18;;:::i;:::-;26265:53;26120:205;;;;:::o;26331:180::-;26471:32;26467:1;26459:6;26455:14;26448:56;26331:180;:::o;26517:366::-;26659:3;26680:67;26744:2;26739:3;26680:67;:::i;:::-;26673:74;;26756:93;26845:3;26756:93;:::i;:::-;26874:2;26869:3;26865:12;26858:19;;26517:366;;;:::o;26889:419::-;27055:4;27093:2;27082:9;27078:18;27070:26;;27142:9;27136:4;27132:20;27128:1;27117:9;27113:17;27106:47;27170:131;27296:4;27170:131;:::i;:::-;27162:139;;26889:419;;;:::o;27314:332::-;27435:4;27473:2;27462:9;27458:18;27450:26;;27486:71;27554:1;27543:9;27539:17;27530:6;27486:71;:::i;:::-;27567:72;27635:2;27624:9;27620:18;27611:6;27567:72;:::i;:::-;27314:332;;;;;:::o;27652:137::-;27706:5;27737:6;27731:13;27722:22;;27753:30;27777:5;27753:30;:::i;:::-;27652:137;;;;:::o;27795:345::-;27862:6;27911:2;27899:9;27890:7;27886:23;27882:32;27879:119;;;27917:79;;:::i;:::-;27879:119;28037:1;28062:61;28115:7;28106:6;28095:9;28091:22;28062:61;:::i;:::-;28052:71;;28008:125;27795:345;;;;:::o;28146:410::-;28186:7;28209:20;28227:1;28209:20;:::i;:::-;28204:25;;28243:20;28261:1;28243:20;:::i;:::-;28238:25;;28298:1;28295;28291:9;28320:30;28338:11;28320:30;:::i;:::-;28309:41;;28499:1;28490:7;28486:15;28483:1;28480:22;28460:1;28453:9;28433:83;28410:139;;28529:18;;:::i;:::-;28410:139;28194:362;28146:410;;;;:::o;28562:180::-;28610:77;28607:1;28600:88;28707:4;28704:1;28697:15;28731:4;28728:1;28721:15;28748:185;28788:1;28805:20;28823:1;28805:20;:::i;:::-;28800:25;;28839:20;28857:1;28839:20;:::i;:::-;28834:25;;28878:1;28868:35;;28883:18;;:::i;:::-;28868:35;28925:1;28922;28918:9;28913:14;;28748:185;;;;:::o;28939:147::-;29040:11;29077:3;29062:18;;28939:147;;;;:::o;29092:114::-;;:::o;29212:398::-;29371:3;29392:83;29473:1;29468:3;29392:83;:::i;:::-;29385:90;;29484:93;29573:3;29484:93;:::i;:::-;29602:1;29597:3;29593:11;29586:18;;29212:398;;;:::o;29616:379::-;29800:3;29822:147;29965:3;29822:147;:::i;:::-;29815:154;;29986:3;29979:10;;29616:379;;;:::o;30001:141::-;30050:4;30073:3;30065:11;;30096:3;30093:1;30086:14;30130:4;30127:1;30117:18;30109:26;;30001:141;;;:::o;30148:93::-;30185:6;30232:2;30227;30220:5;30216:14;30212:23;30202:33;;30148:93;;;:::o;30247:107::-;30291:8;30341:5;30335:4;30331:16;30310:37;;30247:107;;;;:::o;30360:393::-;30429:6;30479:1;30467:10;30463:18;30502:97;30532:66;30521:9;30502:97;:::i;:::-;30620:39;30650:8;30639:9;30620:39;:::i;:::-;30608:51;;30692:4;30688:9;30681:5;30677:21;30668:30;;30741:4;30731:8;30727:19;30720:5;30717:30;30707:40;;30436:317;;30360:393;;;;;:::o;30759:60::-;30787:3;30808:5;30801:12;;30759:60;;;:::o;30825:142::-;30875:9;30908:53;30926:34;30935:24;30953:5;30935:24;:::i;:::-;30926:34;:::i;:::-;30908:53;:::i;:::-;30895:66;;30825:142;;;:::o;30973:75::-;31016:3;31037:5;31030:12;;30973:75;;;:::o;31054:269::-;31164:39;31195:7;31164:39;:::i;:::-;31225:91;31274:41;31298:16;31274:41;:::i;:::-;31266:6;31259:4;31253:11;31225:91;:::i;:::-;31219:4;31212:105;31130:193;31054:269;;;:::o;31329:73::-;31374:3;31329:73;:::o;31408:189::-;31485:32;;:::i;:::-;31526:65;31584:6;31576;31570:4;31526:65;:::i;:::-;31461:136;31408:189;;:::o;31603:186::-;31663:120;31680:3;31673:5;31670:14;31663:120;;;31734:39;31771:1;31764:5;31734:39;:::i;:::-;31707:1;31700:5;31696:13;31687:22;;31663:120;;;31603:186;;:::o;31795:543::-;31896:2;31891:3;31888:11;31885:446;;;31930:38;31962:5;31930:38;:::i;:::-;32014:29;32032:10;32014:29;:::i;:::-;32004:8;32000:44;32197:2;32185:10;32182:18;32179:49;;;32218:8;32203:23;;32179:49;32241:80;32297:22;32315:3;32297:22;:::i;:::-;32287:8;32283:37;32270:11;32241:80;:::i;:::-;31900:431;;31885:446;31795:543;;;:::o;32344:117::-;32398:8;32448:5;32442:4;32438:16;32417:37;;32344:117;;;;:::o;32467:169::-;32511:6;32544:51;32592:1;32588:6;32580:5;32577:1;32573:13;32544:51;:::i;:::-;32540:56;32625:4;32619;32615:15;32605:25;;32518:118;32467:169;;;;:::o;32641:295::-;32717:4;32863:29;32888:3;32882:4;32863:29;:::i;:::-;32855:37;;32925:3;32922:1;32918:11;32912:4;32909:21;32901:29;;32641:295;;;;:::o;32941:1395::-;33058:37;33091:3;33058:37;:::i;:::-;33160:18;33152:6;33149:30;33146:56;;;33182:18;;:::i;:::-;33146:56;33226:38;33258:4;33252:11;33226:38;:::i;:::-;33311:67;33371:6;33363;33357:4;33311:67;:::i;:::-;33405:1;33429:4;33416:17;;33461:2;33453:6;33450:14;33478:1;33473:618;;;;34135:1;34152:6;34149:77;;;34201:9;34196:3;34192:19;34186:26;34177:35;;34149:77;34252:67;34312:6;34305:5;34252:67;:::i;:::-;34246:4;34239:81;34108:222;33443:887;;33473:618;33525:4;33521:9;33513:6;33509:22;33559:37;33591:4;33559:37;:::i;:::-;33618:1;33632:208;33646:7;33643:1;33640:14;33632:208;;;33725:9;33720:3;33716:19;33710:26;33702:6;33695:42;33776:1;33768:6;33764:14;33754:24;;33823:2;33812:9;33808:18;33795:31;;33669:4;33666:1;33662:12;33657:17;;33632:208;;;33868:6;33859:7;33856:19;33853:179;;;33926:9;33921:3;33917:19;33911:26;33969:48;34011:4;34003:6;33999:17;33988:9;33969:48;:::i;:::-;33961:6;33954:64;33876:156;33853:179;34078:1;34074;34066:6;34062:14;34058:22;34052:4;34045:36;33480:611;;;33443:887;;33033:1303;;;32941:1395;;:::o;34342:223::-;34482:34;34478:1;34470:6;34466:14;34459:58;34551:6;34546:2;34538:6;34534:15;34527:31;34342:223;:::o;34571:366::-;34713:3;34734:67;34798:2;34793:3;34734:67;:::i;:::-;34727:74;;34810:93;34899:3;34810:93;:::i;:::-;34928:2;34923:3;34919:12;34912:19;;34571:366;;;:::o;34943:419::-;35109:4;35147:2;35136:9;35132:18;35124:26;;35196:9;35190:4;35186:20;35182:1;35171:9;35167:17;35160:47;35224:131;35350:4;35224:131;:::i;:::-;35216:139;;34943:419;;;:::o;35368:180::-;35416:77;35413:1;35406:88;35513:4;35510:1;35503:15;35537:4;35534:1;35527:15;35554:233;35593:3;35616:24;35634:5;35616:24;:::i;:::-;35607:33;;35662:66;35655:5;35652:77;35649:103;;35732:18;;:::i;:::-;35649:103;35779:1;35772:5;35768:13;35761:20;;35554:233;;;:::o;35793:225::-;35933:34;35929:1;35921:6;35917:14;35910:58;36002:8;35997:2;35989:6;35985:15;35978:33;35793:225;:::o;36024:366::-;36166:3;36187:67;36251:2;36246:3;36187:67;:::i;:::-;36180:74;;36263:93;36352:3;36263:93;:::i;:::-;36381:2;36376:3;36372:12;36365:19;;36024:366;;;:::o;36396:419::-;36562:4;36600:2;36589:9;36585:18;36577:26;;36649:9;36643:4;36639:20;36635:1;36624:9;36620:17;36613:47;36677:131;36803:4;36677:131;:::i;:::-;36669:139;;36396:419;;;:::o;36821:194::-;36861:4;36881:20;36899:1;36881:20;:::i;:::-;36876:25;;36915:20;36933:1;36915:20;:::i;:::-;36910:25;;36959:1;36956;36952:9;36944:17;;36983:1;36977:4;36974:11;36971:37;;;36988:18;;:::i;:::-;36971:37;36821:194;;;;:::o;37021:164::-;37161:16;37157:1;37149:6;37145:14;37138:40;37021:164;:::o;37191:366::-;37333:3;37354:67;37418:2;37413:3;37354:67;:::i;:::-;37347:74;;37430:93;37519:3;37430:93;:::i;:::-;37548:2;37543:3;37539:12;37532:19;;37191:366;;;:::o;37563:419::-;37729:4;37767:2;37756:9;37752:18;37744:26;;37816:9;37810:4;37806:20;37802:1;37791:9;37787:17;37780:47;37844:131;37970:4;37844:131;:::i;:::-;37836:139;;37563:419;;;:::o;37988:225::-;38128:34;38124:1;38116:6;38112:14;38105:58;38197:8;38192:2;38184:6;38180:15;38173:33;37988:225;:::o;38219:366::-;38361:3;38382:67;38446:2;38441:3;38382:67;:::i;:::-;38375:74;;38458:93;38547:3;38458:93;:::i;:::-;38576:2;38571:3;38567:12;38560:19;;38219:366;;;:::o;38591:419::-;38757:4;38795:2;38784:9;38780:18;38772:26;;38844:9;38838:4;38834:20;38830:1;38819:9;38815:17;38808:47;38872:131;38998:4;38872:131;:::i;:::-;38864:139;;38591:419;;;:::o;39016:234::-;39156:34;39152:1;39144:6;39140:14;39133:58;39225:17;39220:2;39212:6;39208:15;39201:42;39016:234;:::o;39256:366::-;39398:3;39419:67;39483:2;39478:3;39419:67;:::i;:::-;39412:74;;39495:93;39584:3;39495:93;:::i;:::-;39613:2;39608:3;39604:12;39597:19;;39256:366;;;:::o;39628:419::-;39794:4;39832:2;39821:9;39817:18;39809:26;;39881:9;39875:4;39871:20;39867:1;39856:9;39852:17;39845:47;39909:131;40035:4;39909:131;:::i;:::-;39901:139;;39628:419;;;:::o;40053:148::-;40155:11;40192:3;40177:18;;40053:148;;;;:::o;40207:390::-;40313:3;40341:39;40374:5;40341:39;:::i;:::-;40396:89;40478:6;40473:3;40396:89;:::i;:::-;40389:96;;40494:65;40552:6;40547:3;40540:4;40533:5;40529:16;40494:65;:::i;:::-;40584:6;40579:3;40575:16;40568:23;;40317:280;40207:390;;;;:::o;40603:155::-;40743:7;40739:1;40731:6;40727:14;40720:31;40603:155;:::o;40764:400::-;40924:3;40945:84;41027:1;41022:3;40945:84;:::i;:::-;40938:91;;41038:93;41127:3;41038:93;:::i;:::-;41156:1;41151:3;41147:11;41140:18;;40764:400;;;:::o;41170:701::-;41451:3;41473:95;41564:3;41555:6;41473:95;:::i;:::-;41466:102;;41585:95;41676:3;41667:6;41585:95;:::i;:::-;41578:102;;41697:148;41841:3;41697:148;:::i;:::-;41690:155;;41862:3;41855:10;;41170:701;;;;;:::o;41877:225::-;42017:34;42013:1;42005:6;42001:14;41994:58;42086:8;42081:2;42073:6;42069:15;42062:33;41877:225;:::o;42108:366::-;42250:3;42271:67;42335:2;42330:3;42271:67;:::i;:::-;42264:74;;42347:93;42436:3;42347:93;:::i;:::-;42465:2;42460:3;42456:12;42449:19;;42108:366;;;:::o;42480:419::-;42646:4;42684:2;42673:9;42669:18;42661:26;;42733:9;42727:4;42723:20;42719:1;42708:9;42704:17;42697:47;42761:131;42887:4;42761:131;:::i;:::-;42753:139;;42480:419;;;:::o;42905:182::-;43045:34;43041:1;43033:6;43029:14;43022:58;42905:182;:::o;43093:366::-;43235:3;43256:67;43320:2;43315:3;43256:67;:::i;:::-;43249:74;;43332:93;43421:3;43332:93;:::i;:::-;43450:2;43445:3;43441:12;43434:19;;43093:366;;;:::o;43465:419::-;43631:4;43669:2;43658:9;43654:18;43646:26;;43718:9;43712:4;43708:20;43704:1;43693:9;43689:17;43682:47;43746:131;43872:4;43746:131;:::i;:::-;43738:139;;43465:419;;;:::o;43890:98::-;43941:6;43975:5;43969:12;43959:22;;43890:98;;;:::o;43994:168::-;44077:11;44111:6;44106:3;44099:19;44151:4;44146:3;44142:14;44127:29;;43994:168;;;;:::o;44168:373::-;44254:3;44282:38;44314:5;44282:38;:::i;:::-;44336:70;44399:6;44394:3;44336:70;:::i;:::-;44329:77;;44415:65;44473:6;44468:3;44461:4;44454:5;44450:16;44415:65;:::i;:::-;44505:29;44527:6;44505:29;:::i;:::-;44500:3;44496:39;44489:46;;44258:283;44168:373;;;;:::o;44547:640::-;44742:4;44780:3;44769:9;44765:19;44757:27;;44794:71;44862:1;44851:9;44847:17;44838:6;44794:71;:::i;:::-;44875:72;44943:2;44932:9;44928:18;44919:6;44875:72;:::i;:::-;44957;45025:2;45014:9;45010:18;45001:6;44957:72;:::i;:::-;45076:9;45070:4;45066:20;45061:2;45050:9;45046:18;45039:48;45104:76;45175:4;45166:6;45104:76;:::i;:::-;45096:84;;44547:640;;;;;;;:::o;45193:141::-;45249:5;45280:6;45274:13;45265:22;;45296:32;45322:5;45296:32;:::i;:::-;45193:141;;;;:::o;45340:349::-;45409:6;45458:2;45446:9;45437:7;45433:23;45429:32;45426:119;;;45464:79;;:::i;:::-;45426:119;45584:1;45609:63;45664:7;45655:6;45644:9;45640:22;45609:63;:::i;:::-;45599:73;;45555:127;45340:349;;;;:::o

Swarm Source

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