ETH Price: $3,355.60 (-3.76%)

Token

ATARI50 (1972)
 

Overview

Max Total Supply

2,600 1972

Holders

1,322

Market

Volume (24H)

0.0701 ETH

Min Price (24H)

$30.54 @ 0.009100 ETH

Max Price (24H)

$53.33 @ 0.015892 ETH

Other Info

Filtered by Token Holder
erongu.eth
Balance
42 1972
0xce7aa7f1f57ce772edb0af0b5193dee0cc2c10b0
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A commemorative collection of 2,600 unique fine art NFTs by artist Butcher Billy celebrating the 50th anniversary of Atari.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ATARI50

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-16
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @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] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}
// File: ECDSA.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}
// File: 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: 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() {
        _setOwner(_msgSender());
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// File: Address.sol



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
// File: Payment.sol


// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

pragma solidity ^0.8.0;



/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract Payment is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }


    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }


    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }


    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}
// File: IERC721Receiver.sol



pragma solidity ^0.8.0;

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



pragma solidity ^0.8.0;

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



pragma solidity ^0.8.0;


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



pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, 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
    ) external;

    /**
     * @dev Transfers `tokenId` token 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;

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

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

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

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



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}
// File: IERC721Metadata.sol



pragma solidity ^0.8.0;


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

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

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


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

pragma solidity ^0.8.4;

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

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

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

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

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must 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
    ) external;

    /**
     * @dev Transfers `tokenId` token 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;

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

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

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

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

    // ==============================
    //        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);
}


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

pragma solidity ^0.8.4;


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

contract ERC721A is IERC721A {
    // 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 tokenId of the next token 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`
    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 => address) private _tokenApprovals;

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

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

    /**
     * @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 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 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 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 returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    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: 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.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (_addressToUint256(owner) == 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 auxillary 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 auxillary 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 {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * 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 ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * 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;
    }

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        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, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = address(uint160(_packedOwnershipOf(tokenId)));
        if (to == owner) revert ApprovalToCurrentOwner();

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

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

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, 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.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (_addressToUint256(to) == 0) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.code.length != 0) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @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.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (_addressToUint256(to) == 0) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

        address approvedAddress = _tokenApprovals[tokenId];

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            approvedAddress == _msgSenderERC721A());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (_addressToUint256(to) == 0) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        if (_addressToUint256(approvedAddress) != 0) {
            delete _tokenApprovals[tokenId];
        }

        // 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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

            // 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 `_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));
        address approvedAddress = _tokenApprovals[tokenId];

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                approvedAddress == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        if (_addressToUint256(approvedAddress) != 0) {
            delete _tokenApprovals[tokenId];
        }

        // 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] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED |
                BITMASK_NEXT_INITIALIZED;

            // 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++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _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))
                }
            }
        }
    }

    /**
     * @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 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 returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

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

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } { // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

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

// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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

pragma solidity ^ 0.8.2;
contract ATARI50 is ERC721A, Ownable, Payment, ReentrancyGuard {

    /// Powered By NiftyDrops by NiftyLabs LLC

    /// @notice status booleans for phases 
    bool public isAllowlistActive = false;
    bool public isPublicActive = false;

    /// @notice settings for future burn utility
    address public burnContract;
    bool public isBurnActive = false;
    bool public burnDependent = false;

    /// @notice signer for allowlist
    address private signer = 0xD48D5F6450D7e1cB5F7E73E678cCc3f5B9b3E01C;

    /// @notice collection settings
    uint256 public MAX_SUPPLY = 2600;
    uint256 public PRICE_PER_TOKEN = 0.1972 ether;

    /// @notice set to 1 for allowlist, set to 6 for public
    uint256 private maxMintPerWallet = 1;

    /// @notice collection payouts
    address[] private addressList = [0xeC823C71085Ae6a7953D80F1204C2D04B33Bd4e7];

    uint[] private shareList = [100];

    /// @notice mnetadata path
    string public _metadata;

    /// @notice tracks number minted per person
    mapping(address => uint256) public numMintedPerPerson;

    constructor() ERC721A("ATARI50", "1972") Payment(addressList, shareList) {}

    /// @notice mint allowlist
    function mintAllowlist(address _address, bytes calldata _voucher, uint256 _tokenAmount) external payable nonReentrant {
        uint256 ts = totalSupply();
        require(isAllowlistActive);
        require(_tokenAmount <= maxMintPerWallet, "Purchase would exceed max tokens per tx in this phase");
        require(ts + _tokenAmount <= MAX_SUPPLY, "Purchase would exceed max tokens in the  allowlist");
        require(msg.value >= PRICE_PER_TOKEN * _tokenAmount, "Ether value sent is not correct");
        require(msg.sender == _address, "Not your voucher");
        require(msg.sender == tx.origin);
        require(numMintedPerPerson[_address] + _tokenAmount <= maxMintPerWallet, "Purchase would exceed max tokens per Wallet");

        bytes32 hash = keccak256(
            abi.encodePacked(_address)
        );
        require(_verifySignature(signer, hash, _voucher), "Invalid voucher");

        _safeMint(_address, _tokenAmount);
        numMintedPerPerson[_address] += _tokenAmount;
    }

    /// @notice mint public
    function mintPublic(uint256 _tokenAmount) external payable nonReentrant {
        uint256 ts = totalSupply();
        require(isPublicActive);
        require(_tokenAmount <= maxMintPerWallet, "Purchase would exceed max tokens per tx in this wave");
        require(ts + _tokenAmount <= MAX_SUPPLY, "Purchase would exceed max tokens");
        require(msg.value >= PRICE_PER_TOKEN * _tokenAmount, "Ether value sent is not correct");
        require(msg.sender == tx.origin);
        require(numMintedPerPerson[msg.sender] + _tokenAmount <= maxMintPerWallet, "Purchase would exceed max tokens per Wallet");
        _safeMint(msg.sender, _tokenAmount);
        numMintedPerPerson[msg.sender] += _tokenAmount;
    }

    /// @notice reserve to wallets, only owner
    function reserve(address addr, uint256 _tokenAmount) public onlyOwner {
        uint256 ts = totalSupply();
        require(ts + _tokenAmount <= MAX_SUPPLY);
        _safeMint(addr, _tokenAmount);
    }

    /// @notice burn token, future utility
    function burnToken(uint256 token) external {
        require(isBurnActive);
        if (burnDependent) {
            require(tx.origin == burnContract || msg.sender == burnContract);
            _burn(token);
        } else {
            require(ownerOf(token) == msg.sender);
            _burn(token);
        }
    }

    /// @notice verify voucher
    function _verifySignature(address _signer, bytes32 _hash, bytes memory _signature) private pure returns(bool) {
        return _signer == ECDSA.recover(ECDSA.toEthSignedMessageHash(_hash), _signature);
    }

    /// @notice set signer for signature
    function setSigner(address _signer) external onlyOwner {
        signer = _signer;
    }

    /// @notice set price
    function setPrice(uint256 _newPrice) external onlyOwner {
        PRICE_PER_TOKEN = _newPrice;
    }

    /// @notice set allowlist active
    function setAllowlist(bool _status) external onlyOwner {
        isAllowlistActive = _status;
    }
    
    /// @notice set public active
    function setPublic(bool _status) external onlyOwner {
        isPublicActive = _status;
    }

    /// @notice set burn active
    function setBurn(bool _status) external onlyOwner {
        isBurnActive = _status;
    }

    /// @notice set future burn utility contract
    function setBurnContract(address _contract) external onlyOwner {
        burnContract = _contract;
    }

    /// @notice set burn dependent on a external contract
    function setBurnDependent(bool _status) external onlyOwner {
        burnDependent = _status;
    }

    /// @notice set max mint per wallet/tx
    function setMaxMintPerWallet(uint256 _amount) external onlyOwner {
        maxMintPerWallet = _amount;
    }

    /// @notice set metadata path
    function setMetadata(string memory metadata_) external onlyOwner {
        _metadata = metadata_;
    }

    /// @notice read metadata
    function _baseURI() internal view virtual override returns(string memory) {
        return _metadata;
    }

    /// @notice withdraw funds to deployer wallet
    function withdraw() public payable onlyOwner {
        (bool success, ) = payable(msg.sender).call {
            value: address(this).balance
        }("");
        require(success);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PER_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_metadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnDependent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"token","type":"uint256"}],"name":"burnToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAllowlistActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"isBurnActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bytes","name":"_voucher","type":"bytes"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"mintAllowlist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numMintedPerPerson","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setBurnContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setBurnDependent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxMintPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"metadata_","type":"string"}],"name":"setMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff0219169083151502179055506000600f60166101000a81548160ff0219169083151502179055506000600f60176101000a81548160ff02191690831515021790555073d48d5f6450d7e1cb5f7e73e678ccc3f5b9b3e01c601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610a286011556702bc985aedb500006012556001601355604051806020016040528073ec823c71085ae6a7953d80f1204c2d04b33bd4e773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525060149060016200013d9291906200073e565b506040518060200160405280606460ff16815250601590600162000163929190620007cd565b503480156200017157600080fd5b506014805480602002602001604051908101604052809291908181526020018280548015620001f657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311620001ab575b505050505060158054806020026020016040519081016040528092919081815260200182805480156200024957602002820191906000526020600020905b81548152602001906001019080831162000234575b50505050506040518060400160405280600781526020017f41544152493530000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f31393732000000000000000000000000000000000000000000000000000000008152508160029080519060200190620002d292919062000824565b508060039080519060200190620002eb92919062000824565b50620002fc6200043260201b60201c565b600081905550505062000324620003186200043760201b60201c565b6200043f60201b60201c565b80518251146200036b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000362906200095b565b60405180910390fd5b6000825111620003b2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003a990620009cd565b60405180910390fd5b60005b825181101562000421576200040b838281518110620003d957620003d8620009ef565b5b6020026020010151838381518110620003f757620003f6620009ef565b5b60200260200101516200050560201b60201c565b8080620004189062000a57565b915050620003b5565b5050506001600e8190555062000d8a565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000577576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200056e9062000b1a565b60405180910390fd5b60008111620005bd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005b49062000b8c565b60405180910390fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541462000642576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006399062000c24565b60405180910390fd5b600d829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600954620006f9919062000c46565b6009819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac82826040516200073292919062000cf9565b60405180910390a15050565b828054828255906000526020600020908101928215620007ba579160200282015b82811115620007b95782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906200075f565b5b509050620007c99190620008b5565b5090565b82805482825590600052602060002090810192821562000811579160200282015b8281111562000810578251829060ff16905591602001919060010190620007ee565b5b509050620008209190620008b5565b5090565b828054620008329062000d55565b90600052602060002090601f016020900481019282620008565760008555620008a2565b82601f106200087157805160ff1916838001178555620008a2565b82800160010185558215620008a2579182015b82811115620008a157825182559160200191906001019062000884565b5b509050620008b19190620008b5565b5090565b5b80821115620008d0576000816000905550600101620008b6565b5090565b600082825260208201905092915050565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b600062000943603283620008d4565b91506200095082620008e5565b604082019050919050565b60006020820190508181036000830152620009768162000934565b9050919050565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b6000620009b5601a83620008d4565b9150620009c2826200097d565b602082019050919050565b60006020820190508181036000830152620009e881620009a6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b600062000a648262000a4d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362000a995762000a9862000a1e565b5b600182019050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b600062000b02602c83620008d4565b915062000b0f8262000aa4565b604082019050919050565b6000602082019050818103600083015262000b358162000af3565b9050919050565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b600062000b74601d83620008d4565b915062000b818262000b3c565b602082019050919050565b6000602082019050818103600083015262000ba78162000b65565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b600062000c0c602b83620008d4565b915062000c198262000bae565b604082019050919050565b6000602082019050818103600083015262000c3f8162000bfd565b9050919050565b600062000c538262000a4d565b915062000c608362000a4d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c985762000c9762000a1e565b5b828201905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000cd08262000ca3565b9050919050565b62000ce28162000cc3565b82525050565b62000cf38162000a4d565b82525050565b600060408201905062000d10600083018562000cd7565b62000d1f602083018462000ce8565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000d6e57607f821691505b60208210810362000d845762000d8362000d26565b5b50919050565b6152d58062000d9a6000396000f3fe6080604052600436106102815760003560e01c806386c843151161014f578063b1a6676e116100c1578063ce7c2ac21161007a578063ce7c2ac2146109af578063d2d515cc146109ec578063e33b7de314610a17578063e985e9c514610a42578063efd0cbf914610a7f578063f2fde38b14610a9b576102c8565b8063b1a6676e146108a1578063b88d4fde146108cc578063bd55cf0d146108f5578063bdd87a661461091e578063c87b56dd14610949578063cc47a40b14610986576102c8565b8063964a65af11610113578063964a65af146107955780639852595c146107be578063a22cb465146107fb578063a3330d2514610824578063a49a1e7d1461084f578063afdf613414610878576102c8565b806386c84315146106bd5780638b83209b146106d95780638da5cb5b1461071657806391b7f5ed1461074157806395d89b411461076a576102c8565b806339371b25116101f35780636352211e116101ac5780636352211e146105af5780636c19e783146105ec57806370a0823114610615578063715018a6146106525780637b47ec1a14610669578063833b949914610692576102c8565b806339371b25146104d45780633a98ef39146104ff5780633ccfd60b1461052a57806342842e0e146105345780635ad1c1b51461055d5780635cbcec4e14610586576102c8565b806318160ddd1161024557806318160ddd146103d857806319165587146104035780631c0973a41461042c57806323b872dd1461045757806332cb6b0c1461048057806337beafe0146104ab576102c8565b806301ffc9a7146102cd578063066589fb1461030a57806306fdde0314610347578063081812fc14610372578063095ea7b3146103af576102c8565b366102c8577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102af610ac4565b346040516102be929190613b85565b60405180910390a1005b600080fd5b3480156102d957600080fd5b506102f460048036038101906102ef9190613c1a565b610acc565b6040516103019190613c62565b60405180910390f35b34801561031657600080fd5b50610331600480360381019061032c9190613ca9565b610b5e565b60405161033e9190613cd6565b60405180910390f35b34801561035357600080fd5b5061035c610b76565b6040516103699190613d8a565b60405180910390f35b34801561037e57600080fd5b5061039960048036038101906103949190613dd8565b610c08565b6040516103a69190613e05565b60405180910390f35b3480156103bb57600080fd5b506103d660048036038101906103d19190613e20565b610c84565b005b3480156103e457600080fd5b506103ed610e2a565b6040516103fa9190613cd6565b60405180910390f35b34801561040f57600080fd5b5061042a60048036038101906104259190613e9e565b610e41565b005b34801561043857600080fd5b50610441610feb565b60405161044e9190613e05565b60405180910390f35b34801561046357600080fd5b5061047e60048036038101906104799190613ecb565b611011565b005b34801561048c57600080fd5b50610495611021565b6040516104a29190613cd6565b60405180910390f35b3480156104b757600080fd5b506104d260048036038101906104cd9190613ca9565b611027565b005b3480156104e057600080fd5b506104e96110e7565b6040516104f69190613d8a565b60405180910390f35b34801561050b57600080fd5b50610514611175565b6040516105219190613cd6565b60405180910390f35b61053261117f565b005b34801561054057600080fd5b5061055b60048036038101906105569190613ecb565b611274565b005b34801561056957600080fd5b50610584600480360381019061057f9190613f4a565b611294565b005b34801561059257600080fd5b506105ad60048036038101906105a89190613f4a565b61132d565b005b3480156105bb57600080fd5b506105d660048036038101906105d19190613dd8565b6113c6565b6040516105e39190613e05565b60405180910390f35b3480156105f857600080fd5b50610613600480360381019061060e9190613ca9565b6113d8565b005b34801561062157600080fd5b5061063c60048036038101906106379190613ca9565b611498565b6040516106499190613cd6565b60405180910390f35b34801561065e57600080fd5b5061066761152c565b005b34801561067557600080fd5b50610690600480360381019061068b9190613dd8565b6115b4565b005b34801561069e57600080fd5b506106a76116ef565b6040516106b49190613cd6565b60405180910390f35b6106d760048036038101906106d29190613fdc565b6116f5565b005b3480156106e557600080fd5b5061070060048036038101906106fb9190613dd8565b611acc565b60405161070d9190613e05565b60405180910390f35b34801561072257600080fd5b5061072b611b14565b6040516107389190613e05565b60405180910390f35b34801561074d57600080fd5b5061076860048036038101906107639190613dd8565b611b3e565b005b34801561077657600080fd5b5061077f611bc4565b60405161078c9190613d8a565b60405180910390f35b3480156107a157600080fd5b506107bc60048036038101906107b79190613f4a565b611c56565b005b3480156107ca57600080fd5b506107e560048036038101906107e09190613ca9565b611cef565b6040516107f29190613cd6565b60405180910390f35b34801561080757600080fd5b50610822600480360381019061081d9190614050565b611d38565b005b34801561083057600080fd5b50610839611eaf565b6040516108469190613c62565b60405180910390f35b34801561085b57600080fd5b50610876600480360381019061087191906141c0565b611ec2565b005b34801561088457600080fd5b5061089f600480360381019061089a9190613dd8565b611f58565b005b3480156108ad57600080fd5b506108b6611fde565b6040516108c39190613c62565b60405180910390f35b3480156108d857600080fd5b506108f360048036038101906108ee91906142aa565b611ff1565b005b34801561090157600080fd5b5061091c60048036038101906109179190613f4a565b612064565b005b34801561092a57600080fd5b506109336120fd565b6040516109409190613c62565b60405180910390f35b34801561095557600080fd5b50610970600480360381019061096b9190613dd8565b612110565b60405161097d9190613d8a565b60405180910390f35b34801561099257600080fd5b506109ad60048036038101906109a89190613e20565b6121ae565b005b3480156109bb57600080fd5b506109d660048036038101906109d19190613ca9565b61225f565b6040516109e39190613cd6565b60405180910390f35b3480156109f857600080fd5b50610a016122a8565b604051610a0e9190613c62565b60405180910390f35b348015610a2357600080fd5b50610a2c6122bb565b604051610a399190613cd6565b60405180910390f35b348015610a4e57600080fd5b50610a696004803603810190610a64919061432d565b6122c5565b604051610a769190613c62565b60405180910390f35b610a996004803603810190610a949190613dd8565b612359565b005b348015610aa757600080fd5b50610ac26004803603810190610abd9190613ca9565b6125e3565b005b600033905090565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b2757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b575750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60176020528060005260406000206000915090505481565b606060028054610b859061439c565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb19061439c565b8015610bfe5780601f10610bd357610100808354040283529160200191610bfe565b820191906000526020600020905b815481529060010190602001808311610be157829003601f168201915b5050505050905090565b6000610c13826126da565b610c49576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c8f82612739565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cf6576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d15612805565b73ffffffffffffffffffffffffffffffffffffffff1614610d7857610d4181610d3c612805565b6122c5565b610d77576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610e3461280d565b6001546000540303905090565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba9061443f565b60405180910390fd5b6000610ecd6122bb565b47610ed8919061448e565b90506000610eef8383610eea86611cef565b612812565b905060008103610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b90614556565b60405180910390fd5b80600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f83919061448e565b9250508190555080600a6000828254610f9c919061448e565b92505081905550610fad8382612880565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610fde9291906145d5565b60405180910390a1505050565b600f60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61101c838383612974565b505050565b60115481565b61102f610ac4565b73ffffffffffffffffffffffffffffffffffffffff1661104d611b14565b73ffffffffffffffffffffffffffffffffffffffff16146110a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109a9061464a565b60405180910390fd5b80600f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601680546110f49061439c565b80601f01602080910402602001604051908101604052809291908181526020018280546111209061439c565b801561116d5780601f106111425761010080835404028352916020019161116d565b820191906000526020600020905b81548152906001019060200180831161115057829003601f168201915b505050505081565b6000600954905090565b611187610ac4565b73ffffffffffffffffffffffffffffffffffffffff166111a5611b14565b73ffffffffffffffffffffffffffffffffffffffff16146111fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f29061464a565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516112219061469b565b60006040518083038185875af1925050503d806000811461125e576040519150601f19603f3d011682016040523d82523d6000602084013e611263565b606091505b505090508061127157600080fd5b50565b61128f83838360405180602001604052806000815250611ff1565b505050565b61129c610ac4565b73ffffffffffffffffffffffffffffffffffffffff166112ba611b14565b73ffffffffffffffffffffffffffffffffffffffff1614611310576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113079061464a565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b611335610ac4565b73ffffffffffffffffffffffffffffffffffffffff16611353611b14565b73ffffffffffffffffffffffffffffffffffffffff16146113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a09061464a565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b60006113d182612739565b9050919050565b6113e0610ac4565b73ffffffffffffffffffffffffffffffffffffffff166113fe611b14565b73ffffffffffffffffffffffffffffffffffffffff1614611454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144b9061464a565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806114a483612d39565b036114db576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611534610ac4565b73ffffffffffffffffffffffffffffffffffffffff16611552611b14565b73ffffffffffffffffffffffffffffffffffffffff16146115a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159f9061464a565b60405180910390fd5b6115b26000612d43565b565b600f60169054906101000a900460ff166115cd57600080fd5b600f60179054906101000a900460ff16156116a257600f60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061168b5750600f60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61169457600080fd5b61169d81612e09565b6116ec565b3373ffffffffffffffffffffffffffffffffffffffff166116c2826113c6565b73ffffffffffffffffffffffffffffffffffffffff16146116e257600080fd5b6116eb81612e09565b5b50565b60125481565b6002600e540361173a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611731906146fc565b60405180910390fd5b6002600e81905550600061174c610e2a565b9050600f60009054906101000a900460ff1661176757600080fd5b6013548211156117ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a39061478e565b60405180910390fd5b60115482826117bb919061448e565b11156117fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f390614820565b60405180910390fd5b8160125461180a9190614840565b34101561184c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611843906148e6565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b190614952565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118f257600080fd5b60135482601760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611940919061448e565b1115611981576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611978906149e4565b60405180910390fd5b6000856040516020016119949190614a4c565b604051602081830303815290604052805190602001209050611a1d601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168287878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612e17565b611a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5390614ab3565b60405180910390fd5b611a668684612e62565b82601760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ab5919061448e565b9250508190555050506001600e8190555050505050565b6000600d8281548110611ae257611ae1614ad3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b46610ac4565b73ffffffffffffffffffffffffffffffffffffffff16611b64611b14565b73ffffffffffffffffffffffffffffffffffffffff1614611bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb19061464a565b60405180910390fd5b8060128190555050565b606060038054611bd39061439c565b80601f0160208091040260200160405190810160405280929190818152602001828054611bff9061439c565b8015611c4c5780601f10611c2157610100808354040283529160200191611c4c565b820191906000526020600020905b815481529060010190602001808311611c2f57829003601f168201915b5050505050905090565b611c5e610ac4565b73ffffffffffffffffffffffffffffffffffffffff16611c7c611b14565b73ffffffffffffffffffffffffffffffffffffffff1614611cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc99061464a565b60405180910390fd5b80600f60176101000a81548160ff02191690831515021790555050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611d40612805565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611da4576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611db1612805565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e5e612805565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ea39190613c62565b60405180910390a35050565b600f60019054906101000a900460ff1681565b611eca610ac4565b73ffffffffffffffffffffffffffffffffffffffff16611ee8611b14565b73ffffffffffffffffffffffffffffffffffffffff1614611f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f359061464a565b60405180910390fd5b8060169080519060200190611f54929190613a88565b5050565b611f60610ac4565b73ffffffffffffffffffffffffffffffffffffffff16611f7e611b14565b73ffffffffffffffffffffffffffffffffffffffff1614611fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcb9061464a565b60405180910390fd5b8060138190555050565b600f60169054906101000a900460ff1681565b611ffc848484612974565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461205e5761202784848484612e80565b61205d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61206c610ac4565b73ffffffffffffffffffffffffffffffffffffffff1661208a611b14565b73ffffffffffffffffffffffffffffffffffffffff16146120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d79061464a565b60405180910390fd5b80600f60166101000a81548160ff02191690831515021790555050565b600f60179054906101000a900460ff1681565b606061211b826126da565b612151576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061215b612fd0565b9050600081510361217b57604051806020016040528060008152506121a6565b8061218584613062565b604051602001612196929190614b3e565b6040516020818303038152906040525b915050919050565b6121b6610ac4565b73ffffffffffffffffffffffffffffffffffffffff166121d4611b14565b73ffffffffffffffffffffffffffffffffffffffff161461222a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122219061464a565b60405180910390fd5b6000612234610e2a565b90506011548282612245919061448e565b111561225057600080fd5b61225a8383612e62565b505050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600f60009054906101000a900460ff1681565b6000600a54905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6002600e540361239e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612395906146fc565b60405180910390fd5b6002600e8190555060006123b0610e2a565b9050600f60019054906101000a900460ff166123cb57600080fd5b601354821115612410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240790614bd4565b60405180910390fd5b601154828261241f919061448e565b1115612460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245790614c40565b60405180910390fd5b8160125461246e9190614840565b3410156124b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a7906148e6565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146124e857600080fd5b60135482601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612536919061448e565b1115612577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256e906149e4565b60405180910390fd5b6125813383612e62565b81601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125d0919061448e565b92505081905550506001600e8190555050565b6125eb610ac4565b73ffffffffffffffffffffffffffffffffffffffff16612609611b14565b73ffffffffffffffffffffffffffffffffffffffff161461265f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126569061464a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c590614cd2565b60405180910390fd5b6126d781612d43565b50565b6000816126e561280d565b111580156126f4575060005482105b8015612732575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000808290508061274861280d565b116127ce576000548110156127cd5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036127cb575b600081036127c1576004600083600190039350838152602001908152602001600020549050612797565b8092505050612800565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b600081600954600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856128639190614840565b61286d9190614d21565b6128779190614d52565b90509392505050565b804710156128c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ba90614dd2565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516128e99061469b565b60006040518083038185875af1925050503d8060008114612926576040519150601f19603f3d011682016040523d82523d6000602084013e61292b565b606091505b505090508061296f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296690614e64565b60405180910390fd5b505050565b600061297f82612739565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146129e6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff16612a3f612805565b73ffffffffffffffffffffffffffffffffffffffff161480612a6e5750612a6d86612a68612805565b6122c5565b5b80612aab5750612a7c612805565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b905080612ae4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612aef86612d39565b03612b26576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b3386868660016130bc565b6000612b3e83612d39565b14612b7a576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b612c4187612d39565b1717600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612cc95760006001850190506000600460008381526020019081526020016000205403612cc7576000548114612cc6578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d3186868660016130c2565b505050505050565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612e148160006130c8565b50565b6000612e2b612e25846133e0565b83613410565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161490509392505050565b612e7c828260405180602001604052806000815250613437565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ea6612805565b8786866040518563ffffffff1660e01b8152600401612ec89493929190614ed9565b6020604051808303816000875af1925050508015612f0457506040513d601f19601f82011682018060405250810190612f019190614f3a565b60015b612f7d573d8060008114612f34576040519150601f19603f3d011682016040523d82523d6000602084013e612f39565b606091505b506000815103612f75576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060168054612fdf9061439c565b80601f016020809104026020016040519081016040528092919081815260200182805461300b9061439c565b80156130585780601f1061302d57610100808354040283529160200191613058565b820191906000526020600020905b81548152906001019060200180831161303b57829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156130a857600183039250600a81066030018353600a81049050613088565b508181036020830392508083525050919050565b50505050565b50505050565b60006130d383612739565b9050600081905060006006600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083156131e05760008273ffffffffffffffffffffffffffffffffffffffff16613139612805565b73ffffffffffffffffffffffffffffffffffffffff161480613168575061316783613162612805565b6122c5565b5b806131a55750613176612805565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050806131de576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6131ee8260008760016130bc565b60006131f982612d39565b14613235576006600086815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600160806001901b03600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055507c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000060a042901b6132d485612d39565b171717600460008781526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084160361335d576000600186019050600060046000838152602001908152602001600020540361335b57600054811461335a578360046000838152602001908152602001600020819055505b5b505b84600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133c78260008760016130c2565b6001600081548092919060010191905055505050505050565b6000816040516020016133f39190614fde565b604051602081830303815290604052805190602001209050919050565b600080600061341f85856136c6565b9150915061342c81613747565b819250505092915050565b600080549050600061344885612d39565b0361347f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083036134b9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134c660008583866130bc565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161352b60018514613913565b901b60a042901b61353b86612d39565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b1461363f575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135ef6000878480600101955087612e80565b613625576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061358057826000541461363a57600080fd5b6136aa565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613640575b8160008190555050506136c060008583866130c2565b50505050565b60008060418351036137075760008060006020860151925060408601519150606086015160001a90506136fb8782858561391d565b94509450505050613740565b604083510361373757600080602085015191506040850151905061372c868383613a29565b935093505050613740565b60006002915091505b9250929050565b6000600481111561375b5761375a615004565b5b81600481111561376e5761376d615004565b5b0315613910576001600481111561378857613787615004565b5b81600481111561379b5761379a615004565b5b036137db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137d29061507f565b60405180910390fd5b600260048111156137ef576137ee615004565b5b81600481111561380257613801615004565b5b03613842576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613839906150eb565b60405180910390fd5b6003600481111561385657613855615004565b5b81600481111561386957613868615004565b5b036138a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138a09061517d565b60405180910390fd5b6004808111156138bc576138bb615004565b5b8160048111156138cf576138ce615004565b5b0361390f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139069061520f565b60405180910390fd5b5b50565b6000819050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613958576000600391509150613a20565b601b8560ff16141580156139705750601c8560ff1614155b15613982576000600491509150613a20565b6000600187878787604051600081526020016040526040516139a7949392919061525a565b6020604051602081039080840390855afa1580156139c9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613a1757600060019250925050613a20565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c613a6c919061448e565b9050613a7a8782888561391d565b935093505050935093915050565b828054613a949061439c565b90600052602060002090601f016020900481019282613ab65760008555613afd565b82601f10613acf57805160ff1916838001178555613afd565b82800160010185558215613afd579182015b82811115613afc578251825591602001919060010190613ae1565b5b509050613b0a9190613b0e565b5090565b5b80821115613b27576000816000905550600101613b0f565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613b5682613b2b565b9050919050565b613b6681613b4b565b82525050565b6000819050919050565b613b7f81613b6c565b82525050565b6000604082019050613b9a6000830185613b5d565b613ba76020830184613b76565b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613bf781613bc2565b8114613c0257600080fd5b50565b600081359050613c1481613bee565b92915050565b600060208284031215613c3057613c2f613bb8565b5b6000613c3e84828501613c05565b91505092915050565b60008115159050919050565b613c5c81613c47565b82525050565b6000602082019050613c776000830184613c53565b92915050565b613c8681613b4b565b8114613c9157600080fd5b50565b600081359050613ca381613c7d565b92915050565b600060208284031215613cbf57613cbe613bb8565b5b6000613ccd84828501613c94565b91505092915050565b6000602082019050613ceb6000830184613b76565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d2b578082015181840152602081019050613d10565b83811115613d3a576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d5c82613cf1565b613d668185613cfc565b9350613d76818560208601613d0d565b613d7f81613d40565b840191505092915050565b60006020820190508181036000830152613da48184613d51565b905092915050565b613db581613b6c565b8114613dc057600080fd5b50565b600081359050613dd281613dac565b92915050565b600060208284031215613dee57613ded613bb8565b5b6000613dfc84828501613dc3565b91505092915050565b6000602082019050613e1a6000830184613b5d565b92915050565b60008060408385031215613e3757613e36613bb8565b5b6000613e4585828601613c94565b9250506020613e5685828601613dc3565b9150509250929050565b6000613e6b82613b2b565b9050919050565b613e7b81613e60565b8114613e8657600080fd5b50565b600081359050613e9881613e72565b92915050565b600060208284031215613eb457613eb3613bb8565b5b6000613ec284828501613e89565b91505092915050565b600080600060608486031215613ee457613ee3613bb8565b5b6000613ef286828701613c94565b9350506020613f0386828701613c94565b9250506040613f1486828701613dc3565b9150509250925092565b613f2781613c47565b8114613f3257600080fd5b50565b600081359050613f4481613f1e565b92915050565b600060208284031215613f6057613f5f613bb8565b5b6000613f6e84828501613f35565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613f9c57613f9b613f77565b5b8235905067ffffffffffffffff811115613fb957613fb8613f7c565b5b602083019150836001820283011115613fd557613fd4613f81565b5b9250929050565b60008060008060608587031215613ff657613ff5613bb8565b5b600061400487828801613c94565b945050602085013567ffffffffffffffff81111561402557614024613bbd565b5b61403187828801613f86565b9350935050604061404487828801613dc3565b91505092959194509250565b6000806040838503121561406757614066613bb8565b5b600061407585828601613c94565b925050602061408685828601613f35565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6140cd82613d40565b810181811067ffffffffffffffff821117156140ec576140eb614095565b5b80604052505050565b60006140ff613bae565b905061410b82826140c4565b919050565b600067ffffffffffffffff82111561412b5761412a614095565b5b61413482613d40565b9050602081019050919050565b82818337600083830152505050565b600061416361415e84614110565b6140f5565b90508281526020810184848401111561417f5761417e614090565b5b61418a848285614141565b509392505050565b600082601f8301126141a7576141a6613f77565b5b81356141b7848260208601614150565b91505092915050565b6000602082840312156141d6576141d5613bb8565b5b600082013567ffffffffffffffff8111156141f4576141f3613bbd565b5b61420084828501614192565b91505092915050565b600067ffffffffffffffff82111561422457614223614095565b5b61422d82613d40565b9050602081019050919050565b600061424d61424884614209565b6140f5565b90508281526020810184848401111561426957614268614090565b5b614274848285614141565b509392505050565b600082601f83011261429157614290613f77565b5b81356142a184826020860161423a565b91505092915050565b600080600080608085870312156142c4576142c3613bb8565b5b60006142d287828801613c94565b94505060206142e387828801613c94565b93505060406142f487828801613dc3565b925050606085013567ffffffffffffffff81111561431557614314613bbd565b5b6143218782880161427c565b91505092959194509250565b6000806040838503121561434457614343613bb8565b5b600061435285828601613c94565b925050602061436385828601613c94565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806143b457607f821691505b6020821081036143c7576143c661436d565b5b50919050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b6000614429602683613cfc565b9150614434826143cd565b604082019050919050565b600060208201905081810360008301526144588161441c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061449982613b6c565b91506144a483613b6c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144d9576144d861445f565b5b828201905092915050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b6000614540602b83613cfc565b915061454b826144e4565b604082019050919050565b6000602082019050818103600083015261456f81614533565b9050919050565b6000819050919050565b600061459b61459661459184613b2b565b614576565b613b2b565b9050919050565b60006145ad82614580565b9050919050565b60006145bf826145a2565b9050919050565b6145cf816145b4565b82525050565b60006040820190506145ea60008301856145c6565b6145f76020830184613b76565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614634602083613cfc565b915061463f826145fe565b602082019050919050565b6000602082019050818103600083015261466381614627565b9050919050565b600081905092915050565b50565b600061468560008361466a565b915061469082614675565b600082019050919050565b60006146a682614678565b9150819050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006146e6601f83613cfc565b91506146f1826146b0565b602082019050919050565b60006020820190508181036000830152614715816146d9565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e7360008201527f2070657220747820696e20746869732070686173650000000000000000000000602082015250565b6000614778603583613cfc565b91506147838261471c565b604082019050919050565b600060208201905081810360008301526147a78161476b565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e7360008201527f20696e207468652020616c6c6f776c6973740000000000000000000000000000602082015250565b600061480a603283613cfc565b9150614815826147ae565b604082019050919050565b60006020820190508181036000830152614839816147fd565b9050919050565b600061484b82613b6c565b915061485683613b6c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561488f5761488e61445f565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b60006148d0601f83613cfc565b91506148db8261489a565b602082019050919050565b600060208201905081810360008301526148ff816148c3565b9050919050565b7f4e6f7420796f757220766f756368657200000000000000000000000000000000600082015250565b600061493c601083613cfc565b915061494782614906565b602082019050919050565b6000602082019050818103600083015261496b8161492f565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e7360008201527f207065722057616c6c6574000000000000000000000000000000000000000000602082015250565b60006149ce602b83613cfc565b91506149d982614972565b604082019050919050565b600060208201905081810360008301526149fd816149c1565b9050919050565b60008160601b9050919050565b6000614a1c82614a04565b9050919050565b6000614a2e82614a11565b9050919050565b614a46614a4182613b4b565b614a23565b82525050565b6000614a588284614a35565b60148201915081905092915050565b7f496e76616c696420766f75636865720000000000000000000000000000000000600082015250565b6000614a9d600f83613cfc565b9150614aa882614a67565b602082019050919050565b60006020820190508181036000830152614acc81614a90565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b6000614b1882613cf1565b614b228185614b02565b9350614b32818560208601613d0d565b80840191505092915050565b6000614b4a8285614b0d565b9150614b568284614b0d565b91508190509392505050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e7360008201527f2070657220747820696e20746869732077617665000000000000000000000000602082015250565b6000614bbe603483613cfc565b9150614bc982614b62565b604082019050919050565b60006020820190508181036000830152614bed81614bb1565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b6000614c2a602083613cfc565b9150614c3582614bf4565b602082019050919050565b60006020820190508181036000830152614c5981614c1d565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614cbc602683613cfc565b9150614cc782614c60565b604082019050919050565b60006020820190508181036000830152614ceb81614caf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614d2c82613b6c565b9150614d3783613b6c565b925082614d4757614d46614cf2565b5b828204905092915050565b6000614d5d82613b6c565b9150614d6883613b6c565b925082821015614d7b57614d7a61445f565b5b828203905092915050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000614dbc601d83613cfc565b9150614dc782614d86565b602082019050919050565b60006020820190508181036000830152614deb81614daf565b9050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614e4e603a83613cfc565b9150614e5982614df2565b604082019050919050565b60006020820190508181036000830152614e7d81614e41565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614eab82614e84565b614eb58185614e8f565b9350614ec5818560208601613d0d565b614ece81613d40565b840191505092915050565b6000608082019050614eee6000830187613b5d565b614efb6020830186613b5d565b614f086040830185613b76565b8181036060830152614f1a8184614ea0565b905095945050505050565b600081519050614f3481613bee565b92915050565b600060208284031215614f5057614f4f613bb8565b5b6000614f5e84828501614f25565b91505092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000614f9d601c83614b02565b9150614fa882614f67565b601c82019050919050565b6000819050919050565b6000819050919050565b614fd8614fd382614fb3565b614fbd565b82525050565b6000614fe982614f90565b9150614ff58284614fc7565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000615069601883613cfc565b915061507482615033565b602082019050919050565b600060208201905081810360008301526150988161505c565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b60006150d5601f83613cfc565b91506150e08261509f565b602082019050919050565b60006020820190508181036000830152615104816150c8565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000615167602283613cfc565b91506151728261510b565b604082019050919050565b600060208201905081810360008301526151968161515a565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006151f9602283613cfc565b91506152048261519d565b604082019050919050565b60006020820190508181036000830152615228816151ec565b9050919050565b61523881614fb3565b82525050565b600060ff82169050919050565b6152548161523e565b82525050565b600060808201905061526f600083018761522f565b61527c602083018661524b565b615289604083018561522f565b615296606083018461522f565b9594505050505056fea264697066735822122094c074773c28db056bd7b253c78f823c80bfef616be25ae044baa8289a3ad95464736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106102815760003560e01c806386c843151161014f578063b1a6676e116100c1578063ce7c2ac21161007a578063ce7c2ac2146109af578063d2d515cc146109ec578063e33b7de314610a17578063e985e9c514610a42578063efd0cbf914610a7f578063f2fde38b14610a9b576102c8565b8063b1a6676e146108a1578063b88d4fde146108cc578063bd55cf0d146108f5578063bdd87a661461091e578063c87b56dd14610949578063cc47a40b14610986576102c8565b8063964a65af11610113578063964a65af146107955780639852595c146107be578063a22cb465146107fb578063a3330d2514610824578063a49a1e7d1461084f578063afdf613414610878576102c8565b806386c84315146106bd5780638b83209b146106d95780638da5cb5b1461071657806391b7f5ed1461074157806395d89b411461076a576102c8565b806339371b25116101f35780636352211e116101ac5780636352211e146105af5780636c19e783146105ec57806370a0823114610615578063715018a6146106525780637b47ec1a14610669578063833b949914610692576102c8565b806339371b25146104d45780633a98ef39146104ff5780633ccfd60b1461052a57806342842e0e146105345780635ad1c1b51461055d5780635cbcec4e14610586576102c8565b806318160ddd1161024557806318160ddd146103d857806319165587146104035780631c0973a41461042c57806323b872dd1461045757806332cb6b0c1461048057806337beafe0146104ab576102c8565b806301ffc9a7146102cd578063066589fb1461030a57806306fdde0314610347578063081812fc14610372578063095ea7b3146103af576102c8565b366102c8577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102af610ac4565b346040516102be929190613b85565b60405180910390a1005b600080fd5b3480156102d957600080fd5b506102f460048036038101906102ef9190613c1a565b610acc565b6040516103019190613c62565b60405180910390f35b34801561031657600080fd5b50610331600480360381019061032c9190613ca9565b610b5e565b60405161033e9190613cd6565b60405180910390f35b34801561035357600080fd5b5061035c610b76565b6040516103699190613d8a565b60405180910390f35b34801561037e57600080fd5b5061039960048036038101906103949190613dd8565b610c08565b6040516103a69190613e05565b60405180910390f35b3480156103bb57600080fd5b506103d660048036038101906103d19190613e20565b610c84565b005b3480156103e457600080fd5b506103ed610e2a565b6040516103fa9190613cd6565b60405180910390f35b34801561040f57600080fd5b5061042a60048036038101906104259190613e9e565b610e41565b005b34801561043857600080fd5b50610441610feb565b60405161044e9190613e05565b60405180910390f35b34801561046357600080fd5b5061047e60048036038101906104799190613ecb565b611011565b005b34801561048c57600080fd5b50610495611021565b6040516104a29190613cd6565b60405180910390f35b3480156104b757600080fd5b506104d260048036038101906104cd9190613ca9565b611027565b005b3480156104e057600080fd5b506104e96110e7565b6040516104f69190613d8a565b60405180910390f35b34801561050b57600080fd5b50610514611175565b6040516105219190613cd6565b60405180910390f35b61053261117f565b005b34801561054057600080fd5b5061055b60048036038101906105569190613ecb565b611274565b005b34801561056957600080fd5b50610584600480360381019061057f9190613f4a565b611294565b005b34801561059257600080fd5b506105ad60048036038101906105a89190613f4a565b61132d565b005b3480156105bb57600080fd5b506105d660048036038101906105d19190613dd8565b6113c6565b6040516105e39190613e05565b60405180910390f35b3480156105f857600080fd5b50610613600480360381019061060e9190613ca9565b6113d8565b005b34801561062157600080fd5b5061063c60048036038101906106379190613ca9565b611498565b6040516106499190613cd6565b60405180910390f35b34801561065e57600080fd5b5061066761152c565b005b34801561067557600080fd5b50610690600480360381019061068b9190613dd8565b6115b4565b005b34801561069e57600080fd5b506106a76116ef565b6040516106b49190613cd6565b60405180910390f35b6106d760048036038101906106d29190613fdc565b6116f5565b005b3480156106e557600080fd5b5061070060048036038101906106fb9190613dd8565b611acc565b60405161070d9190613e05565b60405180910390f35b34801561072257600080fd5b5061072b611b14565b6040516107389190613e05565b60405180910390f35b34801561074d57600080fd5b5061076860048036038101906107639190613dd8565b611b3e565b005b34801561077657600080fd5b5061077f611bc4565b60405161078c9190613d8a565b60405180910390f35b3480156107a157600080fd5b506107bc60048036038101906107b79190613f4a565b611c56565b005b3480156107ca57600080fd5b506107e560048036038101906107e09190613ca9565b611cef565b6040516107f29190613cd6565b60405180910390f35b34801561080757600080fd5b50610822600480360381019061081d9190614050565b611d38565b005b34801561083057600080fd5b50610839611eaf565b6040516108469190613c62565b60405180910390f35b34801561085b57600080fd5b50610876600480360381019061087191906141c0565b611ec2565b005b34801561088457600080fd5b5061089f600480360381019061089a9190613dd8565b611f58565b005b3480156108ad57600080fd5b506108b6611fde565b6040516108c39190613c62565b60405180910390f35b3480156108d857600080fd5b506108f360048036038101906108ee91906142aa565b611ff1565b005b34801561090157600080fd5b5061091c60048036038101906109179190613f4a565b612064565b005b34801561092a57600080fd5b506109336120fd565b6040516109409190613c62565b60405180910390f35b34801561095557600080fd5b50610970600480360381019061096b9190613dd8565b612110565b60405161097d9190613d8a565b60405180910390f35b34801561099257600080fd5b506109ad60048036038101906109a89190613e20565b6121ae565b005b3480156109bb57600080fd5b506109d660048036038101906109d19190613ca9565b61225f565b6040516109e39190613cd6565b60405180910390f35b3480156109f857600080fd5b50610a016122a8565b604051610a0e9190613c62565b60405180910390f35b348015610a2357600080fd5b50610a2c6122bb565b604051610a399190613cd6565b60405180910390f35b348015610a4e57600080fd5b50610a696004803603810190610a64919061432d565b6122c5565b604051610a769190613c62565b60405180910390f35b610a996004803603810190610a949190613dd8565b612359565b005b348015610aa757600080fd5b50610ac26004803603810190610abd9190613ca9565b6125e3565b005b600033905090565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b2757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b575750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60176020528060005260406000206000915090505481565b606060028054610b859061439c565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb19061439c565b8015610bfe5780601f10610bd357610100808354040283529160200191610bfe565b820191906000526020600020905b815481529060010190602001808311610be157829003601f168201915b5050505050905090565b6000610c13826126da565b610c49576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c8f82612739565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cf6576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d15612805565b73ffffffffffffffffffffffffffffffffffffffff1614610d7857610d4181610d3c612805565b6122c5565b610d77576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610e3461280d565b6001546000540303905090565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba9061443f565b60405180910390fd5b6000610ecd6122bb565b47610ed8919061448e565b90506000610eef8383610eea86611cef565b612812565b905060008103610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b90614556565b60405180910390fd5b80600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f83919061448e565b9250508190555080600a6000828254610f9c919061448e565b92505081905550610fad8382612880565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610fde9291906145d5565b60405180910390a1505050565b600f60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61101c838383612974565b505050565b60115481565b61102f610ac4565b73ffffffffffffffffffffffffffffffffffffffff1661104d611b14565b73ffffffffffffffffffffffffffffffffffffffff16146110a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109a9061464a565b60405180910390fd5b80600f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601680546110f49061439c565b80601f01602080910402602001604051908101604052809291908181526020018280546111209061439c565b801561116d5780601f106111425761010080835404028352916020019161116d565b820191906000526020600020905b81548152906001019060200180831161115057829003601f168201915b505050505081565b6000600954905090565b611187610ac4565b73ffffffffffffffffffffffffffffffffffffffff166111a5611b14565b73ffffffffffffffffffffffffffffffffffffffff16146111fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f29061464a565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516112219061469b565b60006040518083038185875af1925050503d806000811461125e576040519150601f19603f3d011682016040523d82523d6000602084013e611263565b606091505b505090508061127157600080fd5b50565b61128f83838360405180602001604052806000815250611ff1565b505050565b61129c610ac4565b73ffffffffffffffffffffffffffffffffffffffff166112ba611b14565b73ffffffffffffffffffffffffffffffffffffffff1614611310576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113079061464a565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b611335610ac4565b73ffffffffffffffffffffffffffffffffffffffff16611353611b14565b73ffffffffffffffffffffffffffffffffffffffff16146113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a09061464a565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b60006113d182612739565b9050919050565b6113e0610ac4565b73ffffffffffffffffffffffffffffffffffffffff166113fe611b14565b73ffffffffffffffffffffffffffffffffffffffff1614611454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144b9061464a565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806114a483612d39565b036114db576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611534610ac4565b73ffffffffffffffffffffffffffffffffffffffff16611552611b14565b73ffffffffffffffffffffffffffffffffffffffff16146115a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159f9061464a565b60405180910390fd5b6115b26000612d43565b565b600f60169054906101000a900460ff166115cd57600080fd5b600f60179054906101000a900460ff16156116a257600f60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061168b5750600f60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61169457600080fd5b61169d81612e09565b6116ec565b3373ffffffffffffffffffffffffffffffffffffffff166116c2826113c6565b73ffffffffffffffffffffffffffffffffffffffff16146116e257600080fd5b6116eb81612e09565b5b50565b60125481565b6002600e540361173a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611731906146fc565b60405180910390fd5b6002600e81905550600061174c610e2a565b9050600f60009054906101000a900460ff1661176757600080fd5b6013548211156117ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a39061478e565b60405180910390fd5b60115482826117bb919061448e565b11156117fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f390614820565b60405180910390fd5b8160125461180a9190614840565b34101561184c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611843906148e6565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b190614952565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118f257600080fd5b60135482601760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611940919061448e565b1115611981576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611978906149e4565b60405180910390fd5b6000856040516020016119949190614a4c565b604051602081830303815290604052805190602001209050611a1d601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168287878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612e17565b611a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5390614ab3565b60405180910390fd5b611a668684612e62565b82601760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ab5919061448e565b9250508190555050506001600e8190555050505050565b6000600d8281548110611ae257611ae1614ad3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611b46610ac4565b73ffffffffffffffffffffffffffffffffffffffff16611b64611b14565b73ffffffffffffffffffffffffffffffffffffffff1614611bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb19061464a565b60405180910390fd5b8060128190555050565b606060038054611bd39061439c565b80601f0160208091040260200160405190810160405280929190818152602001828054611bff9061439c565b8015611c4c5780601f10611c2157610100808354040283529160200191611c4c565b820191906000526020600020905b815481529060010190602001808311611c2f57829003601f168201915b5050505050905090565b611c5e610ac4565b73ffffffffffffffffffffffffffffffffffffffff16611c7c611b14565b73ffffffffffffffffffffffffffffffffffffffff1614611cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc99061464a565b60405180910390fd5b80600f60176101000a81548160ff02191690831515021790555050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611d40612805565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611da4576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611db1612805565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e5e612805565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ea39190613c62565b60405180910390a35050565b600f60019054906101000a900460ff1681565b611eca610ac4565b73ffffffffffffffffffffffffffffffffffffffff16611ee8611b14565b73ffffffffffffffffffffffffffffffffffffffff1614611f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f359061464a565b60405180910390fd5b8060169080519060200190611f54929190613a88565b5050565b611f60610ac4565b73ffffffffffffffffffffffffffffffffffffffff16611f7e611b14565b73ffffffffffffffffffffffffffffffffffffffff1614611fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcb9061464a565b60405180910390fd5b8060138190555050565b600f60169054906101000a900460ff1681565b611ffc848484612974565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461205e5761202784848484612e80565b61205d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61206c610ac4565b73ffffffffffffffffffffffffffffffffffffffff1661208a611b14565b73ffffffffffffffffffffffffffffffffffffffff16146120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d79061464a565b60405180910390fd5b80600f60166101000a81548160ff02191690831515021790555050565b600f60179054906101000a900460ff1681565b606061211b826126da565b612151576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061215b612fd0565b9050600081510361217b57604051806020016040528060008152506121a6565b8061218584613062565b604051602001612196929190614b3e565b6040516020818303038152906040525b915050919050565b6121b6610ac4565b73ffffffffffffffffffffffffffffffffffffffff166121d4611b14565b73ffffffffffffffffffffffffffffffffffffffff161461222a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122219061464a565b60405180910390fd5b6000612234610e2a565b90506011548282612245919061448e565b111561225057600080fd5b61225a8383612e62565b505050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600f60009054906101000a900460ff1681565b6000600a54905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6002600e540361239e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612395906146fc565b60405180910390fd5b6002600e8190555060006123b0610e2a565b9050600f60019054906101000a900460ff166123cb57600080fd5b601354821115612410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240790614bd4565b60405180910390fd5b601154828261241f919061448e565b1115612460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245790614c40565b60405180910390fd5b8160125461246e9190614840565b3410156124b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a7906148e6565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146124e857600080fd5b60135482601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612536919061448e565b1115612577576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256e906149e4565b60405180910390fd5b6125813383612e62565b81601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125d0919061448e565b92505081905550506001600e8190555050565b6125eb610ac4565b73ffffffffffffffffffffffffffffffffffffffff16612609611b14565b73ffffffffffffffffffffffffffffffffffffffff161461265f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126569061464a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c590614cd2565b60405180910390fd5b6126d781612d43565b50565b6000816126e561280d565b111580156126f4575060005482105b8015612732575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000808290508061274861280d565b116127ce576000548110156127cd5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036127cb575b600081036127c1576004600083600190039350838152602001908152602001600020549050612797565b8092505050612800565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b600081600954600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856128639190614840565b61286d9190614d21565b6128779190614d52565b90509392505050565b804710156128c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ba90614dd2565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516128e99061469b565b60006040518083038185875af1925050503d8060008114612926576040519150601f19603f3d011682016040523d82523d6000602084013e61292b565b606091505b505090508061296f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296690614e64565b60405180910390fd5b505050565b600061297f82612739565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146129e6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff16612a3f612805565b73ffffffffffffffffffffffffffffffffffffffff161480612a6e5750612a6d86612a68612805565b6122c5565b5b80612aab5750612a7c612805565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b905080612ae4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612aef86612d39565b03612b26576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b3386868660016130bc565b6000612b3e83612d39565b14612b7a576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b612c4187612d39565b1717600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612cc95760006001850190506000600460008381526020019081526020016000205403612cc7576000548114612cc6578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d3186868660016130c2565b505050505050565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612e148160006130c8565b50565b6000612e2b612e25846133e0565b83613410565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161490509392505050565b612e7c828260405180602001604052806000815250613437565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ea6612805565b8786866040518563ffffffff1660e01b8152600401612ec89493929190614ed9565b6020604051808303816000875af1925050508015612f0457506040513d601f19601f82011682018060405250810190612f019190614f3a565b60015b612f7d573d8060008114612f34576040519150601f19603f3d011682016040523d82523d6000602084013e612f39565b606091505b506000815103612f75576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060168054612fdf9061439c565b80601f016020809104026020016040519081016040528092919081815260200182805461300b9061439c565b80156130585780601f1061302d57610100808354040283529160200191613058565b820191906000526020600020905b81548152906001019060200180831161303b57829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156130a857600183039250600a81066030018353600a81049050613088565b508181036020830392508083525050919050565b50505050565b50505050565b60006130d383612739565b9050600081905060006006600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083156131e05760008273ffffffffffffffffffffffffffffffffffffffff16613139612805565b73ffffffffffffffffffffffffffffffffffffffff161480613168575061316783613162612805565b6122c5565b5b806131a55750613176612805565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050806131de576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6131ee8260008760016130bc565b60006131f982612d39565b14613235576006600086815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600160806001901b03600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055507c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000060a042901b6132d485612d39565b171717600460008781526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084160361335d576000600186019050600060046000838152602001908152602001600020540361335b57600054811461335a578360046000838152602001908152602001600020819055505b5b505b84600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133c78260008760016130c2565b6001600081548092919060010191905055505050505050565b6000816040516020016133f39190614fde565b604051602081830303815290604052805190602001209050919050565b600080600061341f85856136c6565b9150915061342c81613747565b819250505092915050565b600080549050600061344885612d39565b0361347f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083036134b9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134c660008583866130bc565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161352b60018514613913565b901b60a042901b61353b86612d39565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b1461363f575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135ef6000878480600101955087612e80565b613625576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061358057826000541461363a57600080fd5b6136aa565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613640575b8160008190555050506136c060008583866130c2565b50505050565b60008060418351036137075760008060006020860151925060408601519150606086015160001a90506136fb8782858561391d565b94509450505050613740565b604083510361373757600080602085015191506040850151905061372c868383613a29565b935093505050613740565b60006002915091505b9250929050565b6000600481111561375b5761375a615004565b5b81600481111561376e5761376d615004565b5b0315613910576001600481111561378857613787615004565b5b81600481111561379b5761379a615004565b5b036137db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137d29061507f565b60405180910390fd5b600260048111156137ef576137ee615004565b5b81600481111561380257613801615004565b5b03613842576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613839906150eb565b60405180910390fd5b6003600481111561385657613855615004565b5b81600481111561386957613868615004565b5b036138a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138a09061517d565b60405180910390fd5b6004808111156138bc576138bb615004565b5b8160048111156138cf576138ce615004565b5b0361390f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139069061520f565b60405180910390fd5b5b50565b6000819050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613958576000600391509150613a20565b601b8560ff16141580156139705750601c8560ff1614155b15613982576000600491509150613a20565b6000600187878787604051600081526020016040526040516139a7949392919061525a565b6020604051602081039080840390855afa1580156139c9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613a1757600060019250925050613a20565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c613a6c919061448e565b9050613a7a8782888561391d565b935093505050935093915050565b828054613a949061439c565b90600052602060002090601f016020900481019282613ab65760008555613afd565b82601f10613acf57805160ff1916838001178555613afd565b82800160010185558215613afd579182015b82811115613afc578251825591602001919060010190613ae1565b5b509050613b0a9190613b0e565b5090565b5b80821115613b27576000816000905550600101613b0f565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613b5682613b2b565b9050919050565b613b6681613b4b565b82525050565b6000819050919050565b613b7f81613b6c565b82525050565b6000604082019050613b9a6000830185613b5d565b613ba76020830184613b76565b9392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613bf781613bc2565b8114613c0257600080fd5b50565b600081359050613c1481613bee565b92915050565b600060208284031215613c3057613c2f613bb8565b5b6000613c3e84828501613c05565b91505092915050565b60008115159050919050565b613c5c81613c47565b82525050565b6000602082019050613c776000830184613c53565b92915050565b613c8681613b4b565b8114613c9157600080fd5b50565b600081359050613ca381613c7d565b92915050565b600060208284031215613cbf57613cbe613bb8565b5b6000613ccd84828501613c94565b91505092915050565b6000602082019050613ceb6000830184613b76565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613d2b578082015181840152602081019050613d10565b83811115613d3a576000848401525b50505050565b6000601f19601f8301169050919050565b6000613d5c82613cf1565b613d668185613cfc565b9350613d76818560208601613d0d565b613d7f81613d40565b840191505092915050565b60006020820190508181036000830152613da48184613d51565b905092915050565b613db581613b6c565b8114613dc057600080fd5b50565b600081359050613dd281613dac565b92915050565b600060208284031215613dee57613ded613bb8565b5b6000613dfc84828501613dc3565b91505092915050565b6000602082019050613e1a6000830184613b5d565b92915050565b60008060408385031215613e3757613e36613bb8565b5b6000613e4585828601613c94565b9250506020613e5685828601613dc3565b9150509250929050565b6000613e6b82613b2b565b9050919050565b613e7b81613e60565b8114613e8657600080fd5b50565b600081359050613e9881613e72565b92915050565b600060208284031215613eb457613eb3613bb8565b5b6000613ec284828501613e89565b91505092915050565b600080600060608486031215613ee457613ee3613bb8565b5b6000613ef286828701613c94565b9350506020613f0386828701613c94565b9250506040613f1486828701613dc3565b9150509250925092565b613f2781613c47565b8114613f3257600080fd5b50565b600081359050613f4481613f1e565b92915050565b600060208284031215613f6057613f5f613bb8565b5b6000613f6e84828501613f35565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613f9c57613f9b613f77565b5b8235905067ffffffffffffffff811115613fb957613fb8613f7c565b5b602083019150836001820283011115613fd557613fd4613f81565b5b9250929050565b60008060008060608587031215613ff657613ff5613bb8565b5b600061400487828801613c94565b945050602085013567ffffffffffffffff81111561402557614024613bbd565b5b61403187828801613f86565b9350935050604061404487828801613dc3565b91505092959194509250565b6000806040838503121561406757614066613bb8565b5b600061407585828601613c94565b925050602061408685828601613f35565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6140cd82613d40565b810181811067ffffffffffffffff821117156140ec576140eb614095565b5b80604052505050565b60006140ff613bae565b905061410b82826140c4565b919050565b600067ffffffffffffffff82111561412b5761412a614095565b5b61413482613d40565b9050602081019050919050565b82818337600083830152505050565b600061416361415e84614110565b6140f5565b90508281526020810184848401111561417f5761417e614090565b5b61418a848285614141565b509392505050565b600082601f8301126141a7576141a6613f77565b5b81356141b7848260208601614150565b91505092915050565b6000602082840312156141d6576141d5613bb8565b5b600082013567ffffffffffffffff8111156141f4576141f3613bbd565b5b61420084828501614192565b91505092915050565b600067ffffffffffffffff82111561422457614223614095565b5b61422d82613d40565b9050602081019050919050565b600061424d61424884614209565b6140f5565b90508281526020810184848401111561426957614268614090565b5b614274848285614141565b509392505050565b600082601f83011261429157614290613f77565b5b81356142a184826020860161423a565b91505092915050565b600080600080608085870312156142c4576142c3613bb8565b5b60006142d287828801613c94565b94505060206142e387828801613c94565b93505060406142f487828801613dc3565b925050606085013567ffffffffffffffff81111561431557614314613bbd565b5b6143218782880161427c565b91505092959194509250565b6000806040838503121561434457614343613bb8565b5b600061435285828601613c94565b925050602061436385828601613c94565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806143b457607f821691505b6020821081036143c7576143c661436d565b5b50919050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b6000614429602683613cfc565b9150614434826143cd565b604082019050919050565b600060208201905081810360008301526144588161441c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061449982613b6c565b91506144a483613b6c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144d9576144d861445f565b5b828201905092915050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b6000614540602b83613cfc565b915061454b826144e4565b604082019050919050565b6000602082019050818103600083015261456f81614533565b9050919050565b6000819050919050565b600061459b61459661459184613b2b565b614576565b613b2b565b9050919050565b60006145ad82614580565b9050919050565b60006145bf826145a2565b9050919050565b6145cf816145b4565b82525050565b60006040820190506145ea60008301856145c6565b6145f76020830184613b76565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614634602083613cfc565b915061463f826145fe565b602082019050919050565b6000602082019050818103600083015261466381614627565b9050919050565b600081905092915050565b50565b600061468560008361466a565b915061469082614675565b600082019050919050565b60006146a682614678565b9150819050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006146e6601f83613cfc565b91506146f1826146b0565b602082019050919050565b60006020820190508181036000830152614715816146d9565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e7360008201527f2070657220747820696e20746869732070686173650000000000000000000000602082015250565b6000614778603583613cfc565b91506147838261471c565b604082019050919050565b600060208201905081810360008301526147a78161476b565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e7360008201527f20696e207468652020616c6c6f776c6973740000000000000000000000000000602082015250565b600061480a603283613cfc565b9150614815826147ae565b604082019050919050565b60006020820190508181036000830152614839816147fd565b9050919050565b600061484b82613b6c565b915061485683613b6c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561488f5761488e61445f565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b60006148d0601f83613cfc565b91506148db8261489a565b602082019050919050565b600060208201905081810360008301526148ff816148c3565b9050919050565b7f4e6f7420796f757220766f756368657200000000000000000000000000000000600082015250565b600061493c601083613cfc565b915061494782614906565b602082019050919050565b6000602082019050818103600083015261496b8161492f565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e7360008201527f207065722057616c6c6574000000000000000000000000000000000000000000602082015250565b60006149ce602b83613cfc565b91506149d982614972565b604082019050919050565b600060208201905081810360008301526149fd816149c1565b9050919050565b60008160601b9050919050565b6000614a1c82614a04565b9050919050565b6000614a2e82614a11565b9050919050565b614a46614a4182613b4b565b614a23565b82525050565b6000614a588284614a35565b60148201915081905092915050565b7f496e76616c696420766f75636865720000000000000000000000000000000000600082015250565b6000614a9d600f83613cfc565b9150614aa882614a67565b602082019050919050565b60006020820190508181036000830152614acc81614a90565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081905092915050565b6000614b1882613cf1565b614b228185614b02565b9350614b32818560208601613d0d565b80840191505092915050565b6000614b4a8285614b0d565b9150614b568284614b0d565b91508190509392505050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e7360008201527f2070657220747820696e20746869732077617665000000000000000000000000602082015250565b6000614bbe603483613cfc565b9150614bc982614b62565b604082019050919050565b60006020820190508181036000830152614bed81614bb1565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b6000614c2a602083613cfc565b9150614c3582614bf4565b602082019050919050565b60006020820190508181036000830152614c5981614c1d565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614cbc602683613cfc565b9150614cc782614c60565b604082019050919050565b60006020820190508181036000830152614ceb81614caf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614d2c82613b6c565b9150614d3783613b6c565b925082614d4757614d46614cf2565b5b828204905092915050565b6000614d5d82613b6c565b9150614d6883613b6c565b925082821015614d7b57614d7a61445f565b5b828203905092915050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000614dbc601d83613cfc565b9150614dc782614d86565b602082019050919050565b60006020820190508181036000830152614deb81614daf565b9050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614e4e603a83613cfc565b9150614e5982614df2565b604082019050919050565b60006020820190508181036000830152614e7d81614e41565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614eab82614e84565b614eb58185614e8f565b9350614ec5818560208601613d0d565b614ece81613d40565b840191505092915050565b6000608082019050614eee6000830187613b5d565b614efb6020830186613b5d565b614f086040830185613b76565b8181036060830152614f1a8184614ea0565b905095945050505050565b600081519050614f3481613bee565b92915050565b600060208284031215614f5057614f4f613bb8565b5b6000614f5e84828501614f25565b91505092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000614f9d601c83614b02565b9150614fa882614f67565b601c82019050919050565b6000819050919050565b6000819050919050565b614fd8614fd382614fb3565b614fbd565b82525050565b6000614fe982614f90565b9150614ff58284614fc7565b60208201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000615069601883613cfc565b915061507482615033565b602082019050919050565b600060208201905081810360008301526150988161505c565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b60006150d5601f83613cfc565b91506150e08261509f565b602082019050919050565b60006020820190508181036000830152615104816150c8565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000615167602283613cfc565b91506151728261510b565b604082019050919050565b600060208201905081810360008301526151968161515a565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006151f9602283613cfc565b91506152048261519d565b604082019050919050565b60006020820190508181036000830152615228816151ec565b9050919050565b61523881614fb3565b82525050565b600060ff82169050919050565b6152548161523e565b82525050565b600060808201905061526f600083018761522f565b61527c602083018661524b565b615289604083018561522f565b615296606083018461522f565b9594505050505056fea264697066735822122094c074773c28db056bd7b253c78f823c80bfef616be25ae044baa8289a3ad95464736f6c634300080d0033

Deployed Bytecode Sourcemap

78053:5629:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25389:40;25405:12;:10;:12::i;:::-;25419:9;25389:40;;;;;;;:::i;:::-;;;;;;;;78053:5629;;;;;49782:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79097:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54805:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56873:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56333:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48836:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26599:566;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78357:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57759:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78623:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82695:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79016:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25520:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83486:193;;;:::i;:::-;;58000:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82262:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82410:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54594:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81989:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50461:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13942:94;;;;;;;;;;;;;:::i;:::-;;81363:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78662:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79274:1016;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26299:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13291:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82114:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54974:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82868:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26097:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57149:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78264:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83174:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83021:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78391:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58256:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82546:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78430:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55149:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81105:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25893:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78220:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25705:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57528:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80327:722;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14191:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12112:98;12165:7;12192:10;12185:17;;12112:98;:::o;49782:615::-;49867:4;50182:10;50167:25;;:11;:25;;;;:102;;;;50259:10;50244:25;;:11;:25;;;;50167:102;:179;;;;50336:10;50321:25;;:11;:25;;;;50167:179;50147:199;;49782:615;;;:::o;79097:53::-;;;;;;;;;;;;;;;;;:::o;54805:100::-;54859:13;54892:5;54885:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54805:100;:::o;56873:204::-;56941:7;56966:16;56974:7;56966;:16::i;:::-;56961:64;;56991:34;;;;;;;;;;;;;;56961:64;57045:15;:24;57061:7;57045:24;;;;;;;;;;;;;;;;;;;;;57038:31;;56873:204;;;:::o;56333:474::-;56406:13;56438:27;56457:7;56438:18;:27::i;:::-;56406:61;;56488:5;56482:11;;:2;:11;;;56478:48;;56502:24;;;;;;;;;;;;;;56478:48;56566:5;56543:28;;:19;:17;:19::i;:::-;:28;;;56539:175;;56591:44;56608:5;56615:19;:17;:19::i;:::-;56591:16;:44::i;:::-;56586:128;;56663:35;;;;;;;;;;;;;;56586:128;56539:175;56753:2;56726:15;:24;56742:7;56726:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;56791:7;56787:2;56771:28;;56780:5;56771:28;;;;;;;;;;;;56395:412;56333:474;;:::o;48836:315::-;48889:7;49117:15;:13;:15::i;:::-;49102:12;;49086:13;;:28;:46;49079:53;;48836:315;:::o;26599:566::-;26694:1;26675:7;:16;26683:7;26675:16;;;;;;;;;;;;;;;;:20;26667:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;26751:21;26799:15;:13;:15::i;:::-;26775:21;:39;;;;:::i;:::-;26751:63;;26825:15;26843:58;26859:7;26868:13;26883:17;26892:7;26883:8;:17::i;:::-;26843:15;:58::i;:::-;26825:76;;26933:1;26922:7;:12;26914:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27017:7;26995:9;:18;27005:7;26995:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;27053:7;27035:14;;:25;;;;;;;:::i;:::-;;;;;;;;27073:35;27091:7;27100;27073:17;:35::i;:::-;27124:33;27140:7;27149;27124:33;;;;;;;:::i;:::-;;;;;;;;26656:509;;26599:566;:::o;78357:27::-;;;;;;;;;;;;;:::o;57759:170::-;57893:28;57903:4;57909:2;57913:7;57893:9;:28::i;:::-;57759:170;;;:::o;78623:32::-;;;;:::o;82695:106::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;82784:9:::1;82769:12;;:24;;;;;;;;;;;;;;;;;;82695:106:::0;:::o;79016:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25520:91::-;25564:7;25591:12;;25584:19;;25520:91;:::o;83486:193::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;83543:12:::1;83569:10;83561:24;;83608:21;83561:83;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83542:102;;;83663:7;83655:16;;;::::0;::::1;;83531:148;83486:193::o:0;58000:185::-;58138:39;58155:4;58161:2;58165:7;58138:39;;;;;;;;;;;;:16;:39::i;:::-;58000:185;;;:::o;82262:101::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;82348:7:::1;82328:17;;:27;;;;;;;;;;;;;;;;;;82262:101:::0;:::o;82410:95::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;82490:7:::1;82473:14;;:24;;;;;;;;;;;;;;;;;;82410:95:::0;:::o;54594:144::-;54658:7;54701:27;54720:7;54701:18;:27::i;:::-;54678:52;;54594:144;;;:::o;81989:90::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;82064:7:::1;82055:6;;:16;;;;;;;;;;;;;;;;;;81989:90:::0;:::o;50461:234::-;50525:7;50577:1;50549:24;50567:5;50549:17;:24::i;:::-;:29;50545:70;;50587:28;;;;;;;;;;;;;;50545:70;45806:13;50633:18;:25;50652:5;50633:25;;;;;;;;;;;;;;;;:54;50626:61;;50461:234;;;:::o;13942:94::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14007:21:::1;14025:1;14007:9;:21::i;:::-;13942:94::o:0;81363:327::-;81425:12;;;;;;;;;;;81417:21;;;;;;81453:13;;;;;;;;;;;81449:234;;;81504:12;;;;;;;;;;;81491:25;;:9;:25;;;:55;;;;81534:12;;;;;;;;;;;81520:26;;:10;:26;;;81491:55;81483:64;;;;;;81562:12;81568:5;81562;:12::i;:::-;81449:234;;;81633:10;81615:28;;:14;81623:5;81615:7;:14::i;:::-;:28;;;81607:37;;;;;;81659:12;81665:5;81659;:12::i;:::-;81449:234;81363:327;:::o;78662:45::-;;;;:::o;79274:1016::-;77080:1;77678:7;;:19;77670:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;77080:1;77811:7;:18;;;;79403:10:::1;79416:13;:11;:13::i;:::-;79403:26;;79448:17;;;;;;;;;;;79440:26;;;::::0;::::1;;79501:16;;79485:12;:32;;79477:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;79615:10;;79599:12;79594:2;:17;;;;:::i;:::-;:31;;79586:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;79730:12;79712:15;;:30;;;;:::i;:::-;79699:9;:43;;79691:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;79811:8;79797:22;;:10;:22;;;79789:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;79873:9;79859:23;;:10;:23;;;79851:32;;;::::0;::::1;;79949:16;;79933:12;79902:18;:28;79921:8;79902:28;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;:63;;79894:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;80026:12;80082:8;80065:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;80041:61;;;;;;80026:76;;80121:40;80138:6;;;;;;;;;;;80146:4;80152:8;;80121:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:40::i;:::-;80113:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;80194:33;80204:8;80214:12;80194:9;:33::i;:::-;80270:12;80238:18;:28;80257:8;80238:28;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;79392:898;;77036:1:::0;77990:7;:22;;;;79274:1016;;;;:::o;26299:100::-;26350:7;26377;26385:5;26377:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26370:21;;26299:100;;;:::o;13291:87::-;13337:7;13364:6;;;;;;;;;;;13357:13;;13291:87;:::o;82114:102::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;82199:9:::1;82181:15;:27;;;;82114:102:::0;:::o;54974:104::-;55030:13;55063:7;55056:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54974:104;:::o;82868:101::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;82954:7:::1;82938:13;;:23;;;;;;;;;;;;;;;;;;82868:101:::0;:::o;26097:109::-;26153:7;26180:9;:18;26190:7;26180:18;;;;;;;;;;;;;;;;26173:25;;26097:109;;;:::o;57149:308::-;57260:19;:17;:19::i;:::-;57248:31;;:8;:31;;;57244:61;;57288:17;;;;;;;;;;;;;;57244:61;57370:8;57318:18;:39;57337:19;:17;:19::i;:::-;57318:39;;;;;;;;;;;;;;;:49;57358:8;57318:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;57430:8;57394:55;;57409:19;:17;:19::i;:::-;57394:55;;;57440:8;57394:55;;;;;;:::i;:::-;;;;;;;;57149:308;;:::o;78264:34::-;;;;;;;;;;;;;:::o;83174:105::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;83262:9:::1;83250;:21;;;;;;;;;;;;:::i;:::-;;83174:105:::0;:::o;83021:110::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;83116:7:::1;83097:16;:26;;;;83021:110:::0;:::o;78391:32::-;;;;;;;;;;;;;:::o;58256:396::-;58423:28;58433:4;58439:2;58443:7;58423:9;:28::i;:::-;58484:1;58466:2;:14;;;:19;58462:183;;58505:56;58536:4;58542:2;58546:7;58555:5;58505:30;:56::i;:::-;58500:145;;58589:40;;;;;;;;;;;;;;58500:145;58462:183;58256:396;;;;:::o;82546:91::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;82622:7:::1;82607:12;;:22;;;;;;;;;;;;;;;;;;82546:91:::0;:::o;78430:33::-;;;;;;;;;;;;;:::o;55149:318::-;55222:13;55253:16;55261:7;55253;:16::i;:::-;55248:59;;55278:29;;;;;;;;;;;;;;55248:59;55320:21;55344:10;:8;:10::i;:::-;55320:34;;55397:1;55378:7;55372:21;:26;:87;;;;;;;;;;;;;;;;;55425:7;55434:18;55444:7;55434:9;:18::i;:::-;55408:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55372:87;55365:94;;;55149:318;;;:::o;81105:206::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;81186:10:::1;81199:13;:11;:13::i;:::-;81186:26;;81252:10;;81236:12;81231:2;:17;;;;:::i;:::-;:31;;81223:40;;;::::0;::::1;;81274:29;81284:4;81290:12;81274:9;:29::i;:::-;81175:136;81105:206:::0;;:::o;25893:105::-;25947:7;25974;:16;25982:7;25974:16;;;;;;;;;;;;;;;;25967:23;;25893:105;;;:::o;78220:37::-;;;;;;;;;;;;;:::o;25705:95::-;25751:7;25778:14;;25771:21;;25705:95;:::o;57528:164::-;57625:4;57649:18;:25;57668:5;57649:25;;;;;;;;;;;;;;;:35;57675:8;57649:35;;;;;;;;;;;;;;;;;;;;;;;;;57642:42;;57528:164;;;;:::o;80327:722::-;77080:1;77678:7;;:19;77670:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;77080:1;77811:7;:18;;;;80410:10:::1;80423:13;:11;:13::i;:::-;80410:26;;80455:14;;;;;;;;;;;80447:23;;;::::0;::::1;;80505:16;;80489:12;:32;;80481:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;80618:10;;80602:12;80597:2;:17;;;;:::i;:::-;:31;;80589:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;80715:12;80697:15;;:30;;;;:::i;:::-;80684:9;:43;;80676:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;80796:9;80782:23;;:10;:23;;;80774:32;;;::::0;::::1;;80874:16;;80858:12;80825:18;:30;80844:10;80825:30;;;;;;;;;;;;;;;;:45;;;;:::i;:::-;:65;;80817:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;80949:35;80959:10;80971:12;80949:9;:35::i;:::-;81029:12;80995:18;:30;81014:10;80995:30;;;;;;;;;;;;;;;;:46;;;;;;;:::i;:::-;;;;;;;;80399:650;77036:1:::0;77990:7;:22;;;;80327:722;:::o;14191:192::-;13522:12;:10;:12::i;:::-;13511:23;;:7;:5;:7::i;:::-;:23;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14300:1:::1;14280:22;;:8;:22;;::::0;14272:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;14356:19;14366:8;14356:9;:19::i;:::-;14191:192:::0;:::o;58907:273::-;58964:4;59020:7;59001:15;:13;:15::i;:::-;:26;;:66;;;;;59054:13;;59044:7;:23;59001:66;:152;;;;;59152:1;46576:8;59105:17;:26;59123:7;59105:26;;;;;;;;;;;;:43;:48;59001:152;58981:172;;58907:273;;;:::o;52109:1129::-;52176:7;52196:12;52211:7;52196:22;;52279:4;52260:15;:13;:15::i;:::-;:23;52256:915;;52313:13;;52306:4;:20;52302:869;;;52351:14;52368:17;:23;52386:4;52368:23;;;;;;;;;;;;52351:40;;52484:1;46576:8;52457:6;:23;:28;52453:699;;52976:113;52993:1;52983:6;:11;52976:113;;53036:17;:25;53054:6;;;;;;;53036:25;;;;;;;;;;;;53027:34;;52976:113;;;53122:6;53115:13;;;;;;52453:699;52328:843;52302:869;52256:915;53199:31;;;;;;;;;;;;;;52109:1129;;;;:::o;73174:105::-;73234:7;73261:10;73254:17;;73174:105;:::o;48360:92::-;48416:7;48360:92;:::o;27345:248::-;27491:7;27570:15;27555:12;;27535:7;:16;27543:7;27535:16;;;;;;;;;;;;;;;;27519:13;:32;;;;:::i;:::-;27518:49;;;;:::i;:::-;:67;;;;:::i;:::-;27511:74;;27345:248;;;;;:::o;16627:317::-;16742:6;16717:21;:31;;16709:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16796:12;16814:9;:14;;16836:6;16814:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16795:52;;;16866:7;16858:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;16698:246;16627:317;;:::o;64166:2654::-;64281:27;64311;64330:7;64311:18;:27::i;:::-;64281:57;;64396:4;64355:45;;64371:19;64355:45;;;64351:86;;64409:28;;;;;;;;;;;;;;64351:86;64450:23;64476:15;:24;64492:7;64476:24;;;;;;;;;;;;;;;;;;;;;64450:50;;64513:22;64562:4;64539:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;64583:43;64600:4;64606:19;:17;:19::i;:::-;64583:16;:43::i;:::-;64539:87;:142;;;;64662:19;:17;:19::i;:::-;64643:38;;:15;:38;;;64539:142;64513:169;;64700:17;64695:66;;64726:35;;;;;;;;;;;;;;64695:66;64801:1;64776:21;64794:2;64776:17;:21::i;:::-;:26;64772:62;;64811:23;;;;;;;;;;;;;;64772:62;64847:43;64869:4;64875:2;64879:7;64888:1;64847:21;:43::i;:::-;64998:1;64960:34;64978:15;64960:17;:34::i;:::-;:39;64956:103;;65023:15;:24;65039:7;65023:24;;;;;;;;;;;;65016:31;;;;;;;;;;;64956:103;65426:18;:24;65445:4;65426:24;;;;;;;;;;;;;;;;65424:26;;;;;;;;;;;;65495:18;:22;65514:2;65495:22;;;;;;;;;;;;;;;;65493:24;;;;;;;;;;;46854:8;46460:3;65876:15;:41;;65834:21;65852:2;65834:17;:21::i;:::-;:84;:128;65788:17;:26;65806:7;65788:26;;;;;;;;;;;:174;;;;66132:1;46854:8;66082:19;:46;:51;66078:626;;66154:19;66186:1;66176:7;:11;66154:33;;66343:1;66309:17;:30;66327:11;66309:30;;;;;;;;;;;;:35;66305:384;;66447:13;;66432:11;:28;66428:242;;66627:19;66594:17;:30;66612:11;66594:30;;;;;;;;;;;:52;;;;66428:242;66305:384;66135:569;66078:626;66751:7;66747:2;66732:27;;66741:4;66732:27;;;;;;;;;;;;66770:42;66791:4;66797:2;66801:7;66810:1;66770:20;:42::i;:::-;64270:2550;;;64166:2654;;;:::o;55894:148::-;55958:14;56019:5;56009:15;;55894:148;;;:::o;14391:173::-;14447:16;14466:6;;;;;;;;;;;14447:25;;14492:8;14483:6;;:17;;;;;;;;;;;;;;;;;;14547:8;14516:40;;14537:8;14516:40;;;;;;;;;;;;14436:128;14391:173;:::o;66898:89::-;66958:21;66964:7;66973:5;66958;:21::i;:::-;66898:89;:::o;81730:209::-;81834:4;81869:62;81883:35;81912:5;81883:28;:35::i;:::-;81920:10;81869:13;:62::i;:::-;81858:73;;:7;:73;;;81851:80;;81730:209;;;;;:::o;59264:104::-;59333:27;59343:2;59347:8;59333:27;;;;;;;;;;;;:9;:27::i;:::-;59264:104;;:::o;70643:716::-;70806:4;70852:2;70827:45;;;70873:19;:17;:19::i;:::-;70894:4;70900:7;70909:5;70827:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;70823:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71127:1;71110:6;:13;:18;71106:235;;71156:40;;;;;;;;;;;;;;71106:235;71299:6;71293:13;71284:6;71280:2;71276:15;71269:38;70823:529;70996:54;;;70986:64;;;:6;:64;;;;70979:71;;;70643:716;;;;;;:::o;83318:109::-;83377:13;83410:9;83403:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83318:109;:::o;73385:1943::-;73442:17;73861:3;73854:4;73848:11;73844:21;73837:28;;73952:3;73946:4;73939:17;74058:3;74514:5;74644:1;74639:3;74635:11;74628:18;;74781:2;74775:4;74771:13;74767:2;74763:22;74758:3;74750:36;74822:2;74816:4;74812:13;74804:21;;74406:680;74841:4;74406:680;;;75015:1;75010:3;75006:11;74999:18;;75066:2;75060:4;75056:13;75052:2;75048:22;75043:3;75035:36;74936:2;74930:4;74926:13;74918:21;;74406:680;;;74410:430;75125:3;75120;75116:13;75240:2;75235:3;75231:12;75224:19;;75303:6;75298:3;75291:19;73481:1840;;73385:1943;;;:::o;72007:159::-;;;;;:::o;72825:158::-;;;;;:::o;67216:2935::-;67296:27;67326;67345:7;67326:18;:27::i;:::-;67296:57;;67366:12;67397:19;67366:52;;67429:23;67455:15;:24;67471:7;67455:24;;;;;;;;;;;;;;;;;;;;;67429:50;;67496:13;67492:306;;;67526:22;67575:4;67552:27;;:19;:17;:19::i;:::-;:27;;;:91;;;;67600:43;67617:4;67623:19;:17;:19::i;:::-;67600:16;:43::i;:::-;67552:91;:150;;;;67683:19;:17;:19::i;:::-;67664:38;;:15;:38;;;67552:150;67526:177;;67725:17;67720:66;;67751:35;;;;;;;;;;;;;;67720:66;67511:287;67492:306;67810:51;67832:4;67846:1;67850:7;67859:1;67810:21;:51::i;:::-;67969:1;67931:34;67949:15;67931:17;:34::i;:::-;:39;67927:103;;67994:15;:24;68010:7;67994:24;;;;;;;;;;;;67987:31;;;;;;;;;;;67927:103;68676:1;46069:3;68647:1;:25;;68646:31;68618:18;:24;68637:4;68618:24;;;;;;;;;;;;;;;;:59;;;;;;;;;;;46854:8;46576;46460:3;69005:15;:41;;68961:23;68979:4;68961:17;:23::i;:::-;:86;:120;:164;68915:17;:26;68933:7;68915:26;;;;;;;;;;;:210;;;;69295:1;46854:8;69245:19;:46;:51;69241:626;;69317:19;69349:1;69339:7;:11;69317:33;;69506:1;69472:17;:30;69490:11;69472:30;;;;;;;;;;;;:35;69468:384;;69610:13;;69595:11;:28;69591:242;;69790:19;69757:17;:30;69775:11;69757:30;;;;;;;;;;;:52;;;;69591:242;69468:384;69298:569;69241:626;69922:7;69918:1;69895:35;;69904:4;69895:35;;;;;;;;;;;;69941:50;69962:4;69976:1;69980:7;69989:1;69941:20;:50::i;:::-;70118:12;;:14;;;;;;;;;;;;;67285:2866;;;67216:2935;;:::o;10204:269::-;10273:7;10459:4;10406:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;10396:69;;;;;;10389:76;;10204:269;;;:::o;6402:231::-;6480:7;6501:17;6520:18;6542:27;6553:4;6559:9;6542:10;:27::i;:::-;6500:69;;;;6580:18;6592:5;6580:11;:18::i;:::-;6616:9;6609:16;;;;6402:231;;;;:::o;59741:2246::-;59864:20;59887:13;;59864:36;;59940:1;59915:21;59933:2;59915:17;:21::i;:::-;:26;59911:58;;59950:19;;;;;;;;;;;;;;59911:58;59996:1;59984:8;:13;59980:44;;60006:18;;;;;;;;;;;;;;59980:44;60037:61;60067:1;60071:2;60075:12;60089:8;60037:21;:61::i;:::-;60641:1;45943:2;60612:1;:25;;60611:31;60599:8;:44;60573:18;:22;60592:2;60573:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;46719:3;61042:29;61069:1;61057:8;:13;61042:14;:29::i;:::-;:56;;46460:3;60979:15;:41;;60937:21;60955:2;60937:17;:21::i;:::-;:84;:162;60886:17;:31;60904:12;60886:31;;;;;;;;;;;:213;;;;61116:20;61139:12;61116:35;;61166:11;61195:8;61180:12;:23;61166:37;;61242:1;61224:2;:14;;;:19;61220:635;;61264:313;61320:12;61316:2;61295:38;;61312:1;61295:38;;;;;;;;;;;;61361:69;61400:1;61404:2;61408:14;;;;;;61424:5;61361:30;:69::i;:::-;61356:174;;61466:40;;;;;;;;;;;;;;61356:174;61572:3;61557:12;:18;61264:313;;61658:12;61641:13;;:29;61637:43;;61672:8;;;61637:43;61220:635;;;61721:119;61777:14;;;;;;61773:2;61752:40;;61769:1;61752:40;;;;;;;;;;;;61835:3;61820:12;:18;61721:119;;61220:635;61885:12;61869:13;:28;;;;60350:1559;;61919:60;61948:1;61952:2;61956:12;61970:8;61919:20;:60::i;:::-;59853:2134;59741:2246;;;:::o;4292:1308::-;4373:7;4382:12;4627:2;4607:9;:16;:22;4603:990;;4646:9;4670;4694:7;4903:4;4892:9;4888:20;4882:27;4877:32;;4953:4;4942:9;4938:20;4932:27;4927:32;;5011:4;5000:9;4996:20;4990:27;4987:1;4982:36;4977:41;;5054:25;5065:4;5071:1;5074;5077;5054:10;:25::i;:::-;5047:32;;;;;;;;;4603:990;5121:2;5101:9;:16;:22;5097:496;;5140:9;5164:10;5376:4;5365:9;5361:20;5355:27;5350:32;;5427:4;5416:9;5412:20;5406:27;5400:33;;5469:23;5480:4;5486:1;5489:2;5469:10;:23::i;:::-;5462:30;;;;;;;;5097:496;5541:1;5545:35;5525:56;;;;4292:1308;;;;;;:::o;2563:643::-;2641:20;2632:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;2628:571;2678:7;2628:571;2739:29;2730:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;2726:473;;2785:34;;;;;;;;;;:::i;:::-;;;;;;;;2726:473;2850:35;2841:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;2837:362;;2902:41;;;;;;;;;;:::i;:::-;;;;;;;;2837:362;2974:30;2965:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;2961:238;;3021:44;;;;;;;;;;:::i;:::-;;;;;;;;2961:238;3096:30;3087:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3083:116;;3143:44;;;;;;;;;;:::i;:::-;;;;;;;;3083:116;2563:643;;:::o;56129:142::-;56187:14;56248:5;56238:15;;56129:142;;;:::o;7854:1632::-;7985:7;7994:12;8919:66;8914:1;8906:10;;:79;8902:163;;;9018:1;9022:30;9002:51;;;;;;8902:163;9084:2;9079:1;:7;;;;:18;;;;;9095:2;9090:1;:7;;;;9079:18;9075:102;;;9130:1;9134:30;9114:51;;;;;;9075:102;9274:14;9291:24;9301:4;9307:1;9310;9313;9291:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9274:41;;9348:1;9330:20;;:6;:20;;;9326:103;;9383:1;9387:29;9367:50;;;;;;;9326:103;9449:6;9457:20;9441:37;;;;;7854:1632;;;;;;;;:::o;6896:344::-;7010:7;7019:12;7044:9;7069:66;7061:75;;7056:2;:80;7044:92;;7147:7;7186:2;7179:3;7172:2;7164:11;;:18;;7163:25;;;;:::i;:::-;7147:42;;7207:25;7218:4;7224:1;7227;7230;7207:10;:25::i;:::-;7200:32;;;;;;6896:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:77::-;402:7;431:5;420:16;;365:77;;;:::o;448:118::-;535:24;553:5;535:24;:::i;:::-;530:3;523:37;448:118;;:::o;572:332::-;693:4;731:2;720:9;716:18;708:26;;744:71;812:1;801:9;797:17;788:6;744:71;:::i;:::-;825:72;893:2;882:9;878:18;869:6;825:72;:::i;:::-;572:332;;;;;:::o;910:75::-;943:6;976:2;970:9;960:19;;910:75;:::o;991:117::-;1100:1;1097;1090:12;1114:117;1223:1;1220;1213:12;1237:149;1273:7;1313:66;1306:5;1302:78;1291:89;;1237:149;;;:::o;1392:120::-;1464:23;1481:5;1464:23;:::i;:::-;1457:5;1454:34;1444:62;;1502:1;1499;1492:12;1444:62;1392:120;:::o;1518:137::-;1563:5;1601:6;1588:20;1579:29;;1617:32;1643:5;1617:32;:::i;:::-;1518:137;;;;:::o;1661:327::-;1719:6;1768:2;1756:9;1747:7;1743:23;1739:32;1736:119;;;1774:79;;:::i;:::-;1736:119;1894:1;1919:52;1963:7;1954:6;1943:9;1939:22;1919:52;:::i;:::-;1909:62;;1865:116;1661:327;;;;:::o;1994:90::-;2028:7;2071:5;2064:13;2057:21;2046:32;;1994:90;;;:::o;2090:109::-;2171:21;2186:5;2171:21;:::i;:::-;2166:3;2159:34;2090:109;;:::o;2205:210::-;2292:4;2330:2;2319:9;2315:18;2307:26;;2343:65;2405:1;2394:9;2390:17;2381:6;2343:65;:::i;:::-;2205:210;;;;:::o;2421:122::-;2494:24;2512:5;2494:24;:::i;:::-;2487:5;2484:35;2474:63;;2533:1;2530;2523:12;2474:63;2421:122;:::o;2549:139::-;2595:5;2633:6;2620:20;2611:29;;2649:33;2676:5;2649:33;:::i;:::-;2549:139;;;;:::o;2694:329::-;2753:6;2802:2;2790:9;2781:7;2777:23;2773:32;2770:119;;;2808:79;;:::i;:::-;2770:119;2928:1;2953:53;2998:7;2989:6;2978:9;2974:22;2953:53;:::i;:::-;2943:63;;2899:117;2694:329;;;;:::o;3029:222::-;3122:4;3160:2;3149:9;3145:18;3137:26;;3173:71;3241:1;3230:9;3226:17;3217:6;3173:71;:::i;:::-;3029:222;;;;:::o;3257:99::-;3309:6;3343:5;3337:12;3327:22;;3257:99;;;:::o;3362:169::-;3446:11;3480:6;3475:3;3468:19;3520:4;3515:3;3511:14;3496:29;;3362:169;;;;:::o;3537:307::-;3605:1;3615:113;3629:6;3626:1;3623:13;3615:113;;;3714:1;3709:3;3705:11;3699:18;3695:1;3690:3;3686:11;3679:39;3651:2;3648:1;3644:10;3639:15;;3615:113;;;3746:6;3743:1;3740:13;3737:101;;;3826:1;3817:6;3812:3;3808:16;3801:27;3737:101;3586:258;3537:307;;;:::o;3850:102::-;3891:6;3942:2;3938:7;3933:2;3926:5;3922:14;3918:28;3908:38;;3850:102;;;:::o;3958:364::-;4046:3;4074:39;4107:5;4074:39;:::i;:::-;4129:71;4193:6;4188:3;4129:71;:::i;:::-;4122:78;;4209:52;4254:6;4249:3;4242:4;4235:5;4231:16;4209:52;:::i;:::-;4286:29;4308:6;4286:29;:::i;:::-;4281:3;4277:39;4270:46;;4050:272;3958:364;;;;:::o;4328:313::-;4441:4;4479:2;4468:9;4464:18;4456:26;;4528:9;4522:4;4518:20;4514:1;4503:9;4499:17;4492:47;4556:78;4629:4;4620:6;4556:78;:::i;:::-;4548:86;;4328:313;;;;:::o;4647:122::-;4720:24;4738:5;4720:24;:::i;:::-;4713:5;4710:35;4700:63;;4759:1;4756;4749:12;4700:63;4647:122;:::o;4775:139::-;4821:5;4859:6;4846:20;4837:29;;4875:33;4902:5;4875:33;:::i;:::-;4775:139;;;;:::o;4920:329::-;4979:6;5028:2;5016:9;5007:7;5003:23;4999:32;4996:119;;;5034:79;;:::i;:::-;4996:119;5154:1;5179:53;5224:7;5215:6;5204:9;5200:22;5179:53;:::i;:::-;5169:63;;5125:117;4920:329;;;;:::o;5255:222::-;5348:4;5386:2;5375:9;5371:18;5363:26;;5399:71;5467:1;5456:9;5452:17;5443:6;5399:71;:::i;:::-;5255:222;;;;:::o;5483:474::-;5551:6;5559;5608:2;5596:9;5587:7;5583:23;5579:32;5576:119;;;5614:79;;:::i;:::-;5576:119;5734:1;5759:53;5804:7;5795:6;5784:9;5780:22;5759:53;:::i;:::-;5749:63;;5705:117;5861:2;5887:53;5932:7;5923:6;5912:9;5908:22;5887:53;:::i;:::-;5877:63;;5832:118;5483:474;;;;;:::o;5963:104::-;6008:7;6037:24;6055:5;6037:24;:::i;:::-;6026:35;;5963:104;;;:::o;6073:138::-;6154:32;6180:5;6154:32;:::i;:::-;6147:5;6144:43;6134:71;;6201:1;6198;6191:12;6134:71;6073:138;:::o;6217:155::-;6271:5;6309:6;6296:20;6287:29;;6325:41;6360:5;6325:41;:::i;:::-;6217:155;;;;:::o;6378:345::-;6445:6;6494:2;6482:9;6473:7;6469:23;6465:32;6462:119;;;6500:79;;:::i;:::-;6462:119;6620:1;6645:61;6698:7;6689:6;6678:9;6674:22;6645:61;:::i;:::-;6635:71;;6591:125;6378:345;;;;:::o;6729:619::-;6806:6;6814;6822;6871:2;6859:9;6850:7;6846:23;6842:32;6839:119;;;6877:79;;:::i;:::-;6839:119;6997:1;7022:53;7067:7;7058:6;7047:9;7043:22;7022:53;:::i;:::-;7012:63;;6968:117;7124:2;7150:53;7195:7;7186:6;7175:9;7171:22;7150:53;:::i;:::-;7140:63;;7095:118;7252:2;7278:53;7323:7;7314:6;7303:9;7299:22;7278:53;:::i;:::-;7268:63;;7223:118;6729:619;;;;;:::o;7354:116::-;7424:21;7439:5;7424:21;:::i;:::-;7417:5;7414:32;7404:60;;7460:1;7457;7450:12;7404:60;7354:116;:::o;7476:133::-;7519:5;7557:6;7544:20;7535:29;;7573:30;7597:5;7573:30;:::i;:::-;7476:133;;;;:::o;7615:323::-;7671:6;7720:2;7708:9;7699:7;7695:23;7691:32;7688:119;;;7726:79;;:::i;:::-;7688:119;7846:1;7871:50;7913:7;7904:6;7893:9;7889:22;7871:50;:::i;:::-;7861:60;;7817:114;7615:323;;;;:::o;7944:117::-;8053:1;8050;8043:12;8067:117;8176:1;8173;8166:12;8190:117;8299:1;8296;8289:12;8326:552;8383:8;8393:6;8443:3;8436:4;8428:6;8424:17;8420:27;8410:122;;8451:79;;:::i;:::-;8410:122;8564:6;8551:20;8541:30;;8594:18;8586:6;8583:30;8580:117;;;8616:79;;:::i;:::-;8580:117;8730:4;8722:6;8718:17;8706:29;;8784:3;8776:4;8768:6;8764:17;8754:8;8750:32;8747:41;8744:128;;;8791:79;;:::i;:::-;8744:128;8326:552;;;;;:::o;8884:817::-;8972:6;8980;8988;8996;9045:2;9033:9;9024:7;9020:23;9016:32;9013:119;;;9051:79;;:::i;:::-;9013:119;9171:1;9196:53;9241:7;9232:6;9221:9;9217:22;9196:53;:::i;:::-;9186:63;;9142:117;9326:2;9315:9;9311:18;9298:32;9357:18;9349:6;9346:30;9343:117;;;9379:79;;:::i;:::-;9343:117;9492:64;9548:7;9539:6;9528:9;9524:22;9492:64;:::i;:::-;9474:82;;;;9269:297;9605:2;9631:53;9676:7;9667:6;9656:9;9652:22;9631:53;:::i;:::-;9621:63;;9576:118;8884:817;;;;;;;:::o;9707:468::-;9772:6;9780;9829:2;9817:9;9808:7;9804:23;9800:32;9797:119;;;9835:79;;:::i;:::-;9797:119;9955:1;9980:53;10025:7;10016:6;10005:9;10001:22;9980:53;:::i;:::-;9970:63;;9926:117;10082:2;10108:50;10150:7;10141:6;10130:9;10126:22;10108:50;:::i;:::-;10098:60;;10053:115;9707:468;;;;;:::o;10181:117::-;10290:1;10287;10280:12;10304:180;10352:77;10349:1;10342:88;10449:4;10446:1;10439:15;10473:4;10470:1;10463:15;10490:281;10573:27;10595:4;10573:27;:::i;:::-;10565:6;10561:40;10703:6;10691:10;10688:22;10667:18;10655:10;10652:34;10649:62;10646:88;;;10714:18;;:::i;:::-;10646:88;10754:10;10750:2;10743:22;10533:238;10490:281;;:::o;10777:129::-;10811:6;10838:20;;:::i;:::-;10828:30;;10867:33;10895:4;10887:6;10867:33;:::i;:::-;10777:129;;;:::o;10912:308::-;10974:4;11064:18;11056:6;11053:30;11050:56;;;11086:18;;:::i;:::-;11050:56;11124:29;11146:6;11124:29;:::i;:::-;11116:37;;11208:4;11202;11198:15;11190:23;;10912:308;;;:::o;11226:154::-;11310:6;11305:3;11300;11287:30;11372:1;11363:6;11358:3;11354:16;11347:27;11226:154;;;:::o;11386:412::-;11464:5;11489:66;11505:49;11547:6;11505:49;:::i;:::-;11489:66;:::i;:::-;11480:75;;11578:6;11571:5;11564:21;11616:4;11609:5;11605:16;11654:3;11645:6;11640:3;11636:16;11633:25;11630:112;;;11661:79;;:::i;:::-;11630:112;11751:41;11785:6;11780:3;11775;11751:41;:::i;:::-;11470:328;11386:412;;;;;:::o;11818:340::-;11874:5;11923:3;11916:4;11908:6;11904:17;11900:27;11890:122;;11931:79;;:::i;:::-;11890:122;12048:6;12035:20;12073:79;12148:3;12140:6;12133:4;12125:6;12121:17;12073:79;:::i;:::-;12064:88;;11880:278;11818:340;;;;:::o;12164:509::-;12233:6;12282:2;12270:9;12261:7;12257:23;12253:32;12250:119;;;12288:79;;:::i;:::-;12250:119;12436:1;12425:9;12421:17;12408:31;12466:18;12458:6;12455:30;12452:117;;;12488:79;;:::i;:::-;12452:117;12593:63;12648:7;12639:6;12628:9;12624:22;12593:63;:::i;:::-;12583:73;;12379:287;12164:509;;;;:::o;12679:307::-;12740:4;12830:18;12822:6;12819:30;12816:56;;;12852:18;;:::i;:::-;12816:56;12890:29;12912:6;12890:29;:::i;:::-;12882:37;;12974:4;12968;12964:15;12956:23;;12679:307;;;:::o;12992:410::-;13069:5;13094:65;13110:48;13151:6;13110:48;:::i;:::-;13094:65;:::i;:::-;13085:74;;13182:6;13175:5;13168:21;13220:4;13213:5;13209:16;13258:3;13249:6;13244:3;13240:16;13237:25;13234:112;;;13265:79;;:::i;:::-;13234:112;13355:41;13389:6;13384:3;13379;13355:41;:::i;:::-;13075:327;12992:410;;;;;:::o;13421:338::-;13476:5;13525:3;13518:4;13510:6;13506:17;13502:27;13492:122;;13533:79;;:::i;:::-;13492:122;13650:6;13637:20;13675:78;13749:3;13741:6;13734:4;13726:6;13722:17;13675:78;:::i;:::-;13666:87;;13482:277;13421:338;;;;:::o;13765:943::-;13860:6;13868;13876;13884;13933:3;13921:9;13912:7;13908:23;13904:33;13901:120;;;13940:79;;:::i;:::-;13901:120;14060:1;14085:53;14130:7;14121:6;14110:9;14106:22;14085:53;:::i;:::-;14075:63;;14031:117;14187:2;14213:53;14258:7;14249:6;14238:9;14234:22;14213:53;:::i;:::-;14203:63;;14158:118;14315:2;14341:53;14386:7;14377:6;14366:9;14362:22;14341:53;:::i;:::-;14331:63;;14286:118;14471:2;14460:9;14456:18;14443:32;14502:18;14494:6;14491:30;14488:117;;;14524:79;;:::i;:::-;14488:117;14629:62;14683:7;14674:6;14663:9;14659:22;14629:62;:::i;:::-;14619:72;;14414:287;13765:943;;;;;;;:::o;14714:474::-;14782:6;14790;14839:2;14827:9;14818:7;14814:23;14810:32;14807:119;;;14845:79;;:::i;:::-;14807:119;14965:1;14990:53;15035:7;15026:6;15015:9;15011:22;14990:53;:::i;:::-;14980:63;;14936:117;15092:2;15118:53;15163:7;15154:6;15143:9;15139:22;15118:53;:::i;:::-;15108:63;;15063:118;14714:474;;;;;:::o;15194:180::-;15242:77;15239:1;15232:88;15339:4;15336:1;15329:15;15363:4;15360:1;15353:15;15380:320;15424:6;15461:1;15455:4;15451:12;15441:22;;15508:1;15502:4;15498:12;15529:18;15519:81;;15585:4;15577:6;15573:17;15563:27;;15519:81;15647:2;15639:6;15636:14;15616:18;15613:38;15610:84;;15666:18;;:::i;:::-;15610:84;15431:269;15380:320;;;:::o;15706:225::-;15846:34;15842:1;15834:6;15830:14;15823:58;15915:8;15910:2;15902:6;15898:15;15891:33;15706:225;:::o;15937:366::-;16079:3;16100:67;16164:2;16159:3;16100:67;:::i;:::-;16093:74;;16176:93;16265:3;16176:93;:::i;:::-;16294:2;16289:3;16285:12;16278:19;;15937:366;;;:::o;16309:419::-;16475:4;16513:2;16502:9;16498:18;16490:26;;16562:9;16556:4;16552:20;16548:1;16537:9;16533:17;16526:47;16590:131;16716:4;16590:131;:::i;:::-;16582:139;;16309:419;;;:::o;16734:180::-;16782:77;16779:1;16772:88;16879:4;16876:1;16869:15;16903:4;16900:1;16893:15;16920:305;16960:3;16979:20;16997:1;16979:20;:::i;:::-;16974:25;;17013:20;17031:1;17013:20;:::i;:::-;17008:25;;17167:1;17099:66;17095:74;17092:1;17089:81;17086:107;;;17173:18;;:::i;:::-;17086:107;17217:1;17214;17210:9;17203:16;;16920:305;;;;:::o;17231:230::-;17371:34;17367:1;17359:6;17355:14;17348:58;17440:13;17435:2;17427:6;17423:15;17416:38;17231:230;:::o;17467:366::-;17609:3;17630:67;17694:2;17689:3;17630:67;:::i;:::-;17623:74;;17706:93;17795:3;17706:93;:::i;:::-;17824:2;17819:3;17815:12;17808:19;;17467:366;;;:::o;17839:419::-;18005:4;18043:2;18032:9;18028:18;18020:26;;18092:9;18086:4;18082:20;18078:1;18067:9;18063:17;18056:47;18120:131;18246:4;18120:131;:::i;:::-;18112:139;;17839:419;;;:::o;18264:60::-;18292:3;18313:5;18306:12;;18264:60;;;:::o;18330:142::-;18380:9;18413:53;18431:34;18440:24;18458:5;18440:24;:::i;:::-;18431:34;:::i;:::-;18413:53;:::i;:::-;18400:66;;18330:142;;;:::o;18478:126::-;18528:9;18561:37;18592:5;18561:37;:::i;:::-;18548:50;;18478:126;;;:::o;18610:134::-;18668:9;18701:37;18732:5;18701:37;:::i;:::-;18688:50;;18610:134;;;:::o;18750:147::-;18845:45;18884:5;18845:45;:::i;:::-;18840:3;18833:58;18750:147;;:::o;18903:348::-;19032:4;19070:2;19059:9;19055:18;19047:26;;19083:79;19159:1;19148:9;19144:17;19135:6;19083:79;:::i;:::-;19172:72;19240:2;19229:9;19225:18;19216:6;19172:72;:::i;:::-;18903:348;;;;;:::o;19257:182::-;19397:34;19393:1;19385:6;19381:14;19374:58;19257:182;:::o;19445:366::-;19587:3;19608:67;19672:2;19667:3;19608:67;:::i;:::-;19601:74;;19684:93;19773:3;19684:93;:::i;:::-;19802:2;19797:3;19793:12;19786:19;;19445:366;;;:::o;19817:419::-;19983:4;20021:2;20010:9;20006:18;19998:26;;20070:9;20064:4;20060:20;20056:1;20045:9;20041:17;20034:47;20098:131;20224:4;20098:131;:::i;:::-;20090:139;;19817:419;;;:::o;20242:147::-;20343:11;20380:3;20365:18;;20242:147;;;;:::o;20395:114::-;;:::o;20515:398::-;20674:3;20695:83;20776:1;20771:3;20695:83;:::i;:::-;20688:90;;20787:93;20876:3;20787:93;:::i;:::-;20905:1;20900:3;20896:11;20889:18;;20515:398;;;:::o;20919:379::-;21103:3;21125:147;21268:3;21125:147;:::i;:::-;21118:154;;21289:3;21282:10;;20919:379;;;:::o;21304:181::-;21444:33;21440:1;21432:6;21428:14;21421:57;21304:181;:::o;21491:366::-;21633:3;21654:67;21718:2;21713:3;21654:67;:::i;:::-;21647:74;;21730:93;21819:3;21730:93;:::i;:::-;21848:2;21843:3;21839:12;21832:19;;21491:366;;;:::o;21863:419::-;22029:4;22067:2;22056:9;22052:18;22044:26;;22116:9;22110:4;22106:20;22102:1;22091:9;22087:17;22080:47;22144:131;22270:4;22144:131;:::i;:::-;22136:139;;21863:419;;;:::o;22288:240::-;22428:34;22424:1;22416:6;22412:14;22405:58;22497:23;22492:2;22484:6;22480:15;22473:48;22288:240;:::o;22534:366::-;22676:3;22697:67;22761:2;22756:3;22697:67;:::i;:::-;22690:74;;22773:93;22862:3;22773:93;:::i;:::-;22891:2;22886:3;22882:12;22875:19;;22534:366;;;:::o;22906:419::-;23072:4;23110:2;23099:9;23095:18;23087:26;;23159:9;23153:4;23149:20;23145:1;23134:9;23130:17;23123:47;23187:131;23313:4;23187:131;:::i;:::-;23179:139;;22906:419;;;:::o;23331:237::-;23471:34;23467:1;23459:6;23455:14;23448:58;23540:20;23535:2;23527:6;23523:15;23516:45;23331:237;:::o;23574:366::-;23716:3;23737:67;23801:2;23796:3;23737:67;:::i;:::-;23730:74;;23813:93;23902:3;23813:93;:::i;:::-;23931:2;23926:3;23922:12;23915:19;;23574:366;;;:::o;23946:419::-;24112:4;24150:2;24139:9;24135:18;24127:26;;24199:9;24193:4;24189:20;24185:1;24174:9;24170:17;24163:47;24227:131;24353:4;24227:131;:::i;:::-;24219:139;;23946:419;;;:::o;24371:348::-;24411:7;24434:20;24452:1;24434:20;:::i;:::-;24429:25;;24468:20;24486:1;24468:20;:::i;:::-;24463:25;;24656:1;24588:66;24584:74;24581:1;24578:81;24573:1;24566:9;24559:17;24555:105;24552:131;;;24663:18;;:::i;:::-;24552:131;24711:1;24708;24704:9;24693:20;;24371:348;;;;:::o;24725:181::-;24865:33;24861:1;24853:6;24849:14;24842:57;24725:181;:::o;24912:366::-;25054:3;25075:67;25139:2;25134:3;25075:67;:::i;:::-;25068:74;;25151:93;25240:3;25151:93;:::i;:::-;25269:2;25264:3;25260:12;25253:19;;24912:366;;;:::o;25284:419::-;25450:4;25488:2;25477:9;25473:18;25465:26;;25537:9;25531:4;25527:20;25523:1;25512:9;25508:17;25501:47;25565:131;25691:4;25565:131;:::i;:::-;25557:139;;25284:419;;;:::o;25709:166::-;25849:18;25845:1;25837:6;25833:14;25826:42;25709:166;:::o;25881:366::-;26023:3;26044:67;26108:2;26103:3;26044:67;:::i;:::-;26037:74;;26120:93;26209:3;26120:93;:::i;:::-;26238:2;26233:3;26229:12;26222:19;;25881:366;;;:::o;26253:419::-;26419:4;26457:2;26446:9;26442:18;26434:26;;26506:9;26500:4;26496:20;26492:1;26481:9;26477:17;26470:47;26534:131;26660:4;26534:131;:::i;:::-;26526:139;;26253:419;;;:::o;26678:230::-;26818:34;26814:1;26806:6;26802:14;26795:58;26887:13;26882:2;26874:6;26870:15;26863:38;26678:230;:::o;26914:366::-;27056:3;27077:67;27141:2;27136:3;27077:67;:::i;:::-;27070:74;;27153:93;27242:3;27153:93;:::i;:::-;27271:2;27266:3;27262:12;27255:19;;26914:366;;;:::o;27286:419::-;27452:4;27490:2;27479:9;27475:18;27467:26;;27539:9;27533:4;27529:20;27525:1;27514:9;27510:17;27503:47;27567:131;27693:4;27567:131;:::i;:::-;27559:139;;27286:419;;;:::o;27711:94::-;27744:8;27792:5;27788:2;27784:14;27763:35;;27711:94;;;:::o;27811:::-;27850:7;27879:20;27893:5;27879:20;:::i;:::-;27868:31;;27811:94;;;:::o;27911:100::-;27950:7;27979:26;27999:5;27979:26;:::i;:::-;27968:37;;27911:100;;;:::o;28017:157::-;28122:45;28142:24;28160:5;28142:24;:::i;:::-;28122:45;:::i;:::-;28117:3;28110:58;28017:157;;:::o;28180:256::-;28292:3;28307:75;28378:3;28369:6;28307:75;:::i;:::-;28407:2;28402:3;28398:12;28391:19;;28427:3;28420:10;;28180:256;;;;:::o;28442:165::-;28582:17;28578:1;28570:6;28566:14;28559:41;28442:165;:::o;28613:366::-;28755:3;28776:67;28840:2;28835:3;28776:67;:::i;:::-;28769:74;;28852:93;28941:3;28852:93;:::i;:::-;28970:2;28965:3;28961:12;28954:19;;28613:366;;;:::o;28985:419::-;29151:4;29189:2;29178:9;29174:18;29166:26;;29238:9;29232:4;29228:20;29224:1;29213:9;29209:17;29202:47;29266:131;29392:4;29266:131;:::i;:::-;29258:139;;28985:419;;;:::o;29410:180::-;29458:77;29455:1;29448:88;29555:4;29552:1;29545:15;29579:4;29576:1;29569:15;29596:148;29698:11;29735:3;29720:18;;29596:148;;;;:::o;29750:377::-;29856:3;29884:39;29917:5;29884:39;:::i;:::-;29939:89;30021:6;30016:3;29939:89;:::i;:::-;29932:96;;30037:52;30082:6;30077:3;30070:4;30063:5;30059:16;30037:52;:::i;:::-;30114:6;30109:3;30105:16;30098:23;;29860:267;29750:377;;;;:::o;30133:435::-;30313:3;30335:95;30426:3;30417:6;30335:95;:::i;:::-;30328:102;;30447:95;30538:3;30529:6;30447:95;:::i;:::-;30440:102;;30559:3;30552:10;;30133:435;;;;;:::o;30574:239::-;30714:34;30710:1;30702:6;30698:14;30691:58;30783:22;30778:2;30770:6;30766:15;30759:47;30574:239;:::o;30819:366::-;30961:3;30982:67;31046:2;31041:3;30982:67;:::i;:::-;30975:74;;31058:93;31147:3;31058:93;:::i;:::-;31176:2;31171:3;31167:12;31160:19;;30819:366;;;:::o;31191:419::-;31357:4;31395:2;31384:9;31380:18;31372:26;;31444:9;31438:4;31434:20;31430:1;31419:9;31415:17;31408:47;31472:131;31598:4;31472:131;:::i;:::-;31464:139;;31191:419;;;:::o;31616:182::-;31756:34;31752:1;31744:6;31740:14;31733:58;31616:182;:::o;31804:366::-;31946:3;31967:67;32031:2;32026:3;31967:67;:::i;:::-;31960:74;;32043:93;32132:3;32043:93;:::i;:::-;32161:2;32156:3;32152:12;32145:19;;31804:366;;;:::o;32176:419::-;32342:4;32380:2;32369:9;32365:18;32357:26;;32429:9;32423:4;32419:20;32415:1;32404:9;32400:17;32393:47;32457:131;32583:4;32457:131;:::i;:::-;32449:139;;32176:419;;;:::o;32601:225::-;32741:34;32737:1;32729:6;32725:14;32718:58;32810:8;32805:2;32797:6;32793:15;32786:33;32601:225;:::o;32832:366::-;32974:3;32995:67;33059:2;33054:3;32995:67;:::i;:::-;32988:74;;33071:93;33160:3;33071:93;:::i;:::-;33189:2;33184:3;33180:12;33173:19;;32832:366;;;:::o;33204:419::-;33370:4;33408:2;33397:9;33393:18;33385:26;;33457:9;33451:4;33447:20;33443:1;33432:9;33428:17;33421:47;33485:131;33611:4;33485:131;:::i;:::-;33477:139;;33204:419;;;:::o;33629:180::-;33677:77;33674:1;33667:88;33774:4;33771:1;33764:15;33798:4;33795:1;33788:15;33815:185;33855:1;33872:20;33890:1;33872:20;:::i;:::-;33867:25;;33906:20;33924:1;33906:20;:::i;:::-;33901:25;;33945:1;33935:35;;33950:18;;:::i;:::-;33935:35;33992:1;33989;33985:9;33980:14;;33815:185;;;;:::o;34006:191::-;34046:4;34066:20;34084:1;34066:20;:::i;:::-;34061:25;;34100:20;34118:1;34100:20;:::i;:::-;34095:25;;34139:1;34136;34133:8;34130:34;;;34144:18;;:::i;:::-;34130:34;34189:1;34186;34182:9;34174:17;;34006:191;;;;:::o;34203:179::-;34343:31;34339:1;34331:6;34327:14;34320:55;34203:179;:::o;34388:366::-;34530:3;34551:67;34615:2;34610:3;34551:67;:::i;:::-;34544:74;;34627:93;34716:3;34627:93;:::i;:::-;34745:2;34740:3;34736:12;34729:19;;34388:366;;;:::o;34760:419::-;34926:4;34964:2;34953:9;34949:18;34941:26;;35013:9;35007:4;35003:20;34999:1;34988:9;34984:17;34977:47;35041:131;35167:4;35041:131;:::i;:::-;35033:139;;34760:419;;;:::o;35185:245::-;35325:34;35321:1;35313:6;35309:14;35302:58;35394:28;35389:2;35381:6;35377:15;35370:53;35185:245;:::o;35436:366::-;35578:3;35599:67;35663:2;35658:3;35599:67;:::i;:::-;35592:74;;35675:93;35764:3;35675:93;:::i;:::-;35793:2;35788:3;35784:12;35777:19;;35436:366;;;:::o;35808:419::-;35974:4;36012:2;36001:9;35997:18;35989:26;;36061:9;36055:4;36051:20;36047:1;36036:9;36032:17;36025:47;36089:131;36215:4;36089:131;:::i;:::-;36081:139;;35808:419;;;:::o;36233:98::-;36284:6;36318:5;36312:12;36302:22;;36233:98;;;:::o;36337:168::-;36420:11;36454:6;36449:3;36442:19;36494:4;36489:3;36485:14;36470:29;;36337:168;;;;:::o;36511:360::-;36597:3;36625:38;36657:5;36625:38;:::i;:::-;36679:70;36742:6;36737:3;36679:70;:::i;:::-;36672:77;;36758:52;36803:6;36798:3;36791:4;36784:5;36780:16;36758:52;:::i;:::-;36835:29;36857:6;36835:29;:::i;:::-;36830:3;36826:39;36819:46;;36601:270;36511:360;;;;:::o;36877:640::-;37072:4;37110:3;37099:9;37095:19;37087:27;;37124:71;37192:1;37181:9;37177:17;37168:6;37124:71;:::i;:::-;37205:72;37273:2;37262:9;37258:18;37249:6;37205:72;:::i;:::-;37287;37355:2;37344:9;37340:18;37331:6;37287:72;:::i;:::-;37406:9;37400:4;37396:20;37391:2;37380:9;37376:18;37369:48;37434:76;37505:4;37496:6;37434:76;:::i;:::-;37426:84;;36877:640;;;;;;;:::o;37523:141::-;37579:5;37610:6;37604:13;37595:22;;37626:32;37652:5;37626:32;:::i;:::-;37523:141;;;;:::o;37670:349::-;37739:6;37788:2;37776:9;37767:7;37763:23;37759:32;37756:119;;;37794:79;;:::i;:::-;37756:119;37914:1;37939:63;37994:7;37985:6;37974:9;37970:22;37939:63;:::i;:::-;37929:73;;37885:127;37670:349;;;;:::o;38025:214::-;38165:66;38161:1;38153:6;38149:14;38142:90;38025:214;:::o;38245:402::-;38405:3;38426:85;38508:2;38503:3;38426:85;:::i;:::-;38419:92;;38520:93;38609:3;38520:93;:::i;:::-;38638:2;38633:3;38629:12;38622:19;;38245:402;;;:::o;38653:77::-;38690:7;38719:5;38708:16;;38653:77;;;:::o;38736:79::-;38775:7;38804:5;38793:16;;38736:79;;;:::o;38821:157::-;38926:45;38946:24;38964:5;38946:24;:::i;:::-;38926:45;:::i;:::-;38921:3;38914:58;38821:157;;:::o;38984:522::-;39197:3;39219:148;39363:3;39219:148;:::i;:::-;39212:155;;39377:75;39448:3;39439:6;39377:75;:::i;:::-;39477:2;39472:3;39468:12;39461:19;;39497:3;39490:10;;38984:522;;;;:::o;39512:180::-;39560:77;39557:1;39550:88;39657:4;39654:1;39647:15;39681:4;39678:1;39671:15;39698:174;39838:26;39834:1;39826:6;39822:14;39815:50;39698:174;:::o;39878:366::-;40020:3;40041:67;40105:2;40100:3;40041:67;:::i;:::-;40034:74;;40117:93;40206:3;40117:93;:::i;:::-;40235:2;40230:3;40226:12;40219:19;;39878:366;;;:::o;40250:419::-;40416:4;40454:2;40443:9;40439:18;40431:26;;40503:9;40497:4;40493:20;40489:1;40478:9;40474:17;40467:47;40531:131;40657:4;40531:131;:::i;:::-;40523:139;;40250:419;;;:::o;40675:181::-;40815:33;40811:1;40803:6;40799:14;40792:57;40675:181;:::o;40862:366::-;41004:3;41025:67;41089:2;41084:3;41025:67;:::i;:::-;41018:74;;41101:93;41190:3;41101:93;:::i;:::-;41219:2;41214:3;41210:12;41203:19;;40862:366;;;:::o;41234:419::-;41400:4;41438:2;41427:9;41423:18;41415:26;;41487:9;41481:4;41477:20;41473:1;41462:9;41458:17;41451:47;41515:131;41641:4;41515:131;:::i;:::-;41507:139;;41234:419;;;:::o;41659:221::-;41799:34;41795:1;41787:6;41783:14;41776:58;41868:4;41863:2;41855:6;41851:15;41844:29;41659:221;:::o;41886:366::-;42028:3;42049:67;42113:2;42108:3;42049:67;:::i;:::-;42042:74;;42125:93;42214:3;42125:93;:::i;:::-;42243:2;42238:3;42234:12;42227:19;;41886:366;;;:::o;42258:419::-;42424:4;42462:2;42451:9;42447:18;42439:26;;42511:9;42505:4;42501:20;42497:1;42486:9;42482:17;42475:47;42539:131;42665:4;42539:131;:::i;:::-;42531:139;;42258:419;;;:::o;42683:221::-;42823:34;42819:1;42811:6;42807:14;42800:58;42892:4;42887:2;42879:6;42875:15;42868:29;42683:221;:::o;42910:366::-;43052:3;43073:67;43137:2;43132:3;43073:67;:::i;:::-;43066:74;;43149:93;43238:3;43149:93;:::i;:::-;43267:2;43262:3;43258:12;43251:19;;42910:366;;;:::o;43282:419::-;43448:4;43486:2;43475:9;43471:18;43463:26;;43535:9;43529:4;43525:20;43521:1;43510:9;43506:17;43499:47;43563:131;43689:4;43563:131;:::i;:::-;43555:139;;43282:419;;;:::o;43707:118::-;43794:24;43812:5;43794:24;:::i;:::-;43789:3;43782:37;43707:118;;:::o;43831:86::-;43866:7;43906:4;43899:5;43895:16;43884:27;;43831:86;;;:::o;43923:112::-;44006:22;44022:5;44006:22;:::i;:::-;44001:3;43994:35;43923:112;;:::o;44041:545::-;44214:4;44252:3;44241:9;44237:19;44229:27;;44266:71;44334:1;44323:9;44319:17;44310:6;44266:71;:::i;:::-;44347:68;44411:2;44400:9;44396:18;44387:6;44347:68;:::i;:::-;44425:72;44493:2;44482:9;44478:18;44469:6;44425:72;:::i;:::-;44507;44575:2;44564:9;44560:18;44551:6;44507:72;:::i;:::-;44041:545;;;;;;;:::o

Swarm Source

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