ETH Price: $3,419.14 (-6.73%)

Token

Galactic Tavern Aliens (GTA)
 

Overview

Max Total Supply

5,063 GTA

Holders

1,524

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
playwithmekid.eth
Balance
3 GTA
0xa53a7e1e00b0bbfdd58a21449e2fe606f58b9fae
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GTA

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-22
*/

// 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);
}
// File: ERC721A.sol


pragma solidity ^0.8.0;









contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // 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 ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return currentIndex;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
    unchecked {
        for (uint256 i; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
    }

        revert('ERC721A: unable to get token of owner by index');
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        require(owner != address(0), 'ERC721A: balance query for the zero address');
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * 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) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

    unchecked {
        for (uint256 curr = tokenId; curr >= 0; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }
    }

        revert('ERC721A: unable to determine the owner of token');
    }

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

    /**
     * @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) {
        require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token');

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

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

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

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            'ERC721A: approve caller is not owner nor approved for all'
        );

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), 'ERC721A: approved query for nonexistent token');

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: approve to caller');

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: transfer to non ERC721Receiver implementer'
        );
    }

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

    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 {
        _mint(to, quantity, _data, true);
    }

    /**
     * @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,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
    unchecked {
        _addressData[to].balance += uint128(quantity);
        _addressData[to].numberMinted += uint128(quantity);

        _ownerships[startTokenId].addr = to;
        _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

        uint256 updatedIndex = startTokenId;

        for (uint256 i; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            if (safe) {
                require(
                    _checkOnERC721Received(address(0), to, updatedIndex, _data),
                    'ERC721A: transfer to non ERC721Receiver implementer'
                );
            }

            updatedIndex++;
        }

        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 {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
        getApproved(tokenId) == _msgSender() ||
        isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);

        // 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 {
        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;

        _ownerships[tokenId].addr = to;
        _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId].addr = prevOwnership.addr;
                _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
            }
        }
    }

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

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * 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`.
     */
    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.
     *
     * 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` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// 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 GTA is ERC721A, Ownable, ReentrancyGuard {
    using Strings for uint256;

    uint256 private constant MAX_SUPPLY = 5555; // collection size (including event token)
    uint256 private constant REGULAR_SUPPLY = 5055; // regular supply
    uint256 private constant EVENT_SUPPLY = 500; // event & giveaway supply
    uint256 private constant MAX_PER_WALLET = 3; // max mints per wallet

    struct Event {
        uint id;
        uint supply;
        uint minted;
        address signer;
        bool isClosed;
    }

    struct Coupon {
        bytes32 r;
        bytes32 s;
        uint8 v;
    }

    mapping(bytes32 => mapping(bytes32 => mapping(uint8 => bool))) private _couponsMinted;

    mapping(uint => Event) private _events;
    uint private _nextEventId = 0;

    string private _tokenBaseURI;
    string private _unrevealedURI;
    bool public _mintingIsActive = false;

    uint private _mintedRegular = 0;
    uint private _mintedEvent = 0;

    bool private _isRevealed = false;
    uint private _shift;

    constructor() ERC721A("Galactic Tavern Aliens", "GTA") {
        _unrevealedURI = "ipfs://QmcCoYrGArY5S5rvgU7HZoz8kVJPginn9Mh8PaY9bEWkD5";
        _safeMint(_msgSender(), 1); // sponsor mint
        _mintedEvent = 1;
    }

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

    function mint(uint amount_) external nonReentrant {
        require(_mintingIsActive, "minting not active");
        require(_mintedRegular + amount_ <= REGULAR_SUPPLY, "max regular supply reached");
        require(balanceOf(msg.sender) + amount_ <= MAX_PER_WALLET, "max per wallet reached");
        _mintedRegular = _mintedRegular + amount_;
        _safeMint(msg.sender, amount_);
    }

    function mintCoupon(uint eventId_, Coupon memory coupon) external nonReentrant {
        require(_mintingIsActive, "minting not active");
        require(_mintedEvent < EVENT_SUPPLY, "max event supply reached");
        require(totalSupply() < MAX_SUPPLY, "max supply reached");

        require(eventId_ < _nextEventId, "event doesnt exist");
        Event storage selectedEvent = _events[eventId_];
        require(selectedEvent.isClosed == false, "Event is closed");
        require(selectedEvent.minted < selectedEvent.supply, "No more mints for this event allowed");

        require(_couponsMinted[coupon.r][coupon.s][coupon.v] != true, "Coupon already minted");
        bytes32 digest = keccak256(abi.encode(eventId_, msg.sender));
        require(_isVerifiedCoupon(eventId_, digest, coupon), 'Invalid coupon');

        selectedEvent.minted = selectedEvent.minted + 1;
        _mintedEvent = _mintedEvent + 1;
        _couponsMinted[coupon.r][coupon.s][coupon.v] = true;
        _safeMint(msg.sender, 1);
    }

    function adminMint(uint amount_, address receiver_) external onlyOwner {
        require(_mintedEvent + amount_ <= EVENT_SUPPLY, "max event supply reached");
        require(totalSupply() + amount_ <= MAX_SUPPLY, "max regular supply reached");
        _mintedEvent = _mintedEvent + amount_;
        _safeMint(receiver_, amount_);
    }

    function switchMintStatus(bool mintingIsActive_) external onlyOwner {
        _mintingIsActive = mintingIsActive_;
    }

    function setBaseURI(string memory baseURI_) external onlyOwner {
        _tokenBaseURI = baseURI_;
    }

    function setUnrevealedURI(string memory unrevealedURI_) external onlyOwner {
        _unrevealedURI = unrevealedURI_;
    }

    function reveil(string memory baseURI_) external onlyOwner {
        _tokenBaseURI = baseURI_;
        _isRevealed = true;
        _shift = block.timestamp % MAX_SUPPLY;
    }

    function withdraw() public payable onlyOwner {
        (bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
        require(success);
    }

    function getEvent(uint eventId_) public view returns(Event memory) {
        require(eventId_ < _nextEventId, "event doesnt exist");
        return _events[eventId_];
    }

    function addEvent(uint supply_, address signer_) public onlyOwner {
        Event memory newEvent = Event(
            _nextEventId,
            supply_,
            0,
            signer_,
            false
        );
        _events[_nextEventId] = newEvent;
        _nextEventId = _nextEventId + 1;
    }

    function closeEvent(uint eventId_) public onlyOwner {
        Event storage selectedEvent = _events[eventId_];
        selectedEvent.isClosed = true;
    }

    function _isVerifiedCoupon(uint eventId_, bytes32 digest_, Coupon memory coupon_) internal view returns (bool) {
        address signer = ecrecover(digest_, coupon_.v, coupon_.r, coupon_.s);
        require(signer != address(0), 'ECDSA: invalid signature');
        Event memory selectedEvent = _events[eventId_];
        return signer == selectedEvent.signer;
    }

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

        if(!_isRevealed) {
            return _unrevealedURI;
        }

        string memory baseURI = _baseURI();

        if(_isRevealed && tokenId > 0) {
            tokenId = 1 + ((tokenId + _shift) % (MAX_SUPPLY - 1));
        }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_mintingIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply_","type":"uint256"},{"internalType":"address","name":"signer_","type":"address"}],"name":"addEvent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"eventId_","type":"uint256"}],"name":"closeEvent","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":[{"internalType":"uint256","name":"eventId_","type":"uint256"}],"name":"getEvent","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"minted","type":"uint256"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"bool","name":"isClosed","type":"bool"}],"internalType":"struct GTA.Event","name":"","type":"tuple"}],"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":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"eventId_","type":"uint256"},{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"internalType":"struct GTA.Coupon","name":"coupon","type":"tuple"}],"name":"mintCoupon","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"reveil","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"unrevealedURI_","type":"string"}],"name":"setUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"mintingIsActive_","type":"bool"}],"name":"switchMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600b556000600e60006101000a81548160ff0219169083151502179055506000600f5560006010556000601160006101000a81548160ff0219169083151502179055503480156200005657600080fd5b506040518060400160405280601681526020017f47616c61637469632054617665726e20416c69656e73000000000000000000008152506040518060400160405280600381526020017f47544100000000000000000000000000000000000000000000000000000000008152508160019080519060200190620000db9291906200080a565b508060029080519060200190620000f49291906200080a565b505050620001176200010b6200018160201b60201c565b6200018960201b60201c565b600160088190555060405180606001604052806035815260200162005f6d60359139600d9080519060200190620001509291906200080a565b5062000173620001656200018160201b60201c565b60016200024f60201b60201c565b600160108190555062000ce4565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002718282604051806020016040528060008152506200027560201b60201c565b5050565b6200028a83838360016200028f60201b60201c565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141562000308576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002ff9062000a51565b60405180910390fd5b60008414156200034f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003469062000a73565b60405180910390fd5b6200036460008683876200063160201b60201c565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156200060c57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315620005f657620005b360008884886200063760201b60201c565b620005f5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005ec9062000a2f565b60405180910390fd5b5b8180600101925050808060010191505062000532565b5080600081905550506200062a6000868387620007f160201b60201c565b5050505050565b50505050565b6000620006658473ffffffffffffffffffffffffffffffffffffffff16620007f760201b620022071760201c565b15620007e4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006976200018160201b60201c565b8786866040518563ffffffff1660e01b8152600401620006bb9493929190620009db565b602060405180830381600087803b158015620006d657600080fd5b505af19250505080156200070a57506040513d601f19601f82011682018060405250810190620007079190620008d1565b60015b62000793573d80600081146200073d576040519150601f19603f3d011682016040523d82523d6000602084013e62000742565b606091505b506000815114156200078b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007829062000a2f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620007e9565b600190505b949350505050565b50505050565b600080823b905060008111915050919050565b828054620008189062000b62565b90600052602060002090601f0160209004810192826200083c576000855562000888565b82601f106200085757805160ff191683800117855562000888565b8280016001018555821562000888579182015b82811115620008875782518255916020019190600101906200086a565b5b5090506200089791906200089b565b5090565b5b80821115620008b65760008160009055506001016200089c565b5090565b600081519050620008cb8162000cca565b92915050565b600060208284031215620008ea57620008e962000bc7565b5b6000620008fa84828501620008ba565b91505092915050565b6200090e8162000ac2565b82525050565b6000620009218262000a95565b6200092d818562000aa0565b93506200093f81856020860162000b2c565b6200094a8162000bcc565b840191505092915050565b60006200096460338362000ab1565b9150620009718262000bdd565b604082019050919050565b60006200098b60218362000ab1565b9150620009988262000c2c565b604082019050919050565b6000620009b260288362000ab1565b9150620009bf8262000c7b565b604082019050919050565b620009d58162000b22565b82525050565b6000608082019050620009f2600083018762000903565b62000a01602083018662000903565b62000a106040830185620009ca565b818103606083015262000a24818462000914565b905095945050505050565b6000602082019050818103600083015262000a4a8162000955565b9050919050565b6000602082019050818103600083015262000a6c816200097c565b9050919050565b6000602082019050818103600083015262000a8e81620009a3565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000acf8262000b02565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000b4c57808201518184015260208101905062000b2f565b8381111562000b5c576000848401525b50505050565b6000600282049050600182168062000b7b57607f821691505b6020821081141562000b925762000b9162000b98565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b62000cd58162000ad6565b811462000ce157600080fd5b50565b6152798062000cf46000396000f3fe6080604052600436106101d85760003560e01c80634f6ccce711610102578063a0712d6811610095578063e985e9c511610064578063e985e9c5146106a9578063ecd00914146106e6578063f2fde38b1461070f578063fe2c7fee14610738576101d8565b8063a0712d68146105f1578063a22cb4651461061a578063b88d4fde14610643578063c87b56dd1461066c576101d8565b806370a08231116100d157806370a0823114610547578063715018a6146105845780638da5cb5b1461059b57806395d89b41146105c6576101d8565b80634f6ccce71461046757806355f804b3146104a45780636352211e146104cd5780636d1884e01461050a576101d8565b80631a8bbe961161017a5780632ee07c00116101495780632ee07c00146103ce5780632f745c59146103f75780633ccfd60b1461043457806342842e0e1461043e576101d8565b80631a8bbe96146103285780631b655f03146103515780631d86c2281461037a57806323b872dd146103a5576101d8565b8063081812fc116101b6578063081812fc1461026e578063095ea7b3146102ab5780630dc28efe146102d457806318160ddd146102fd576101d8565b806301ffc9a7146101dd57806303e826c01461021a57806306fdde0314610243575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff91906138d9565b610761565b60405161021191906140da565b60405180910390f35b34801561022657600080fd5b50610241600480360381019061023c91906139a9565b6108ab565b005b34801561024f57600080fd5b50610258610a26565b604051610265919061413a565b60405180910390f35b34801561027a57600080fd5b506102956004803603810190610290919061397c565b610ab8565b6040516102a29190614073565b60405180910390f35b3480156102b757600080fd5b506102d260048036038101906102cd919061386c565b610b3d565b005b3480156102e057600080fd5b506102fb60048036038101906102f691906139a9565b610c56565b005b34801561030957600080fd5b50610312610d9d565b60405161031f9190614557565b60405180910390f35b34801561033457600080fd5b5061034f600480360381019061034a91906139e9565b610da6565b005b34801561035d57600080fd5b5061037860048036038101906103739190613933565b61118b565b005b34801561038657600080fd5b5061038f611250565b60405161039c91906140da565b60405180910390f35b3480156103b157600080fd5b506103cc60048036038101906103c79190613756565b611263565b005b3480156103da57600080fd5b506103f560048036038101906103f0919061397c565b611273565b005b34801561040357600080fd5b5061041e6004803603810190610419919061386c565b611327565b60405161042b9190614557565b60405180910390f35b61043c611519565b005b34801561044a57600080fd5b5061046560048036038101906104609190613756565b61160e565b005b34801561047357600080fd5b5061048e6004803603810190610489919061397c565b61162e565b60405161049b9190614557565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c69190613933565b611681565b005b3480156104d957600080fd5b506104f460048036038101906104ef919061397c565b611717565b6040516105019190614073565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c919061397c565b61172d565b60405161053e919061453c565b60405180910390f35b34801561055357600080fd5b5061056e600480360381019061056991906136e9565b61182d565b60405161057b9190614557565b60405180910390f35b34801561059057600080fd5b50610599611916565b005b3480156105a757600080fd5b506105b061199e565b6040516105bd9190614073565b60405180910390f35b3480156105d257600080fd5b506105db6119c8565b6040516105e8919061413a565b60405180910390f35b3480156105fd57600080fd5b506106186004803603810190610613919061397c565b611a5a565b005b34801561062657600080fd5b50610641600480360381019061063c919061382c565b611bc9565b005b34801561064f57600080fd5b5061066a600480360381019061066591906137a9565b611d4a565b005b34801561067857600080fd5b50610693600480360381019061068e919061397c565b611da6565b6040516106a0919061413a565b60405180910390f35b3480156106b557600080fd5b506106d060048036038101906106cb9190613716565b611f4c565b6040516106dd91906140da565b60405180910390f35b3480156106f257600080fd5b5061070d600480360381019061070891906138ac565b611fe0565b005b34801561071b57600080fd5b50610736600480360381019061073191906136e9565b612079565b005b34801561074457600080fd5b5061075f600480360381019061075a9190613933565b612171565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061082c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061089457507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108a457506108a38261221a565b5b9050919050565b6108b3612284565b73ffffffffffffffffffffffffffffffffffffffff166108d161199e565b73ffffffffffffffffffffffffffffffffffffffff1614610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091e9061437c565b60405180910390fd5b60006040518060a00160405280600b548152602001848152602001600081526020018373ffffffffffffffffffffffffffffffffffffffff16815260200160001515815250905080600a6000600b54815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060808201518160030160146101000a81548160ff0219169083151502179055509050506001600b54610a1b9190614670565b600b81905550505050565b606060018054610a35906147f8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a61906147f8565b8015610aae5780601f10610a8357610100808354040283529160200191610aae565b820191906000526020600020905b815481529060010190602001808311610a9157829003601f168201915b5050505050905090565b6000610ac38261228c565b610b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af99061451c565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b4882611717565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb09061441c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bd8612284565b73ffffffffffffffffffffffffffffffffffffffff161480610c075750610c0681610c01612284565b611f4c565b5b610c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3d906142bc565b60405180910390fd5b610c51838383612299565b505050565b610c5e612284565b73ffffffffffffffffffffffffffffffffffffffff16610c7c61199e565b73ffffffffffffffffffffffffffffffffffffffff1614610cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc99061437c565b60405180910390fd5b6101f482601054610ce39190614670565b1115610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b9061433c565b60405180910390fd5b6115b382610d30610d9d565b610d3a9190614670565b1115610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d729061429c565b60405180910390fd5b81601054610d899190614670565b601081905550610d99818361234b565b5050565b60008054905090565b60026008541415610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de3906144dc565b60405180910390fd5b6002600881905550600e60009054906101000a900460ff16610e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3a9061431c565b60405180910390fd5b6101f460105410610e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e809061433c565b60405180910390fd5b6115b3610e94610d9d565b10610ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecb906142fc565b60405180910390fd5b600b548210610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f906143fc565b60405180910390fd5b6000600a60008481526020019081526020016000209050600015158160030160149054906101000a900460ff16151514610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e9061425c565b60405180910390fd5b8060010154816002015410610fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc8906141fc565b60405180910390fd5b6001151560096000846000015181526020019081526020016000206000846020015181526020019081526020016000206000846040015160ff1660ff16815260200190815260200160002060009054906101000a900460ff161515141561106d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110649061447c565b60405180910390fd5b60008333604051602001611082929190614572565b6040516020818303038152906040528051906020012090506110a5848285612369565b6110e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110db906141dc565b60405180910390fd5b600182600201546110f59190614670565b8260020181905550600160105461110c9190614670565b601081905550600160096000856000015181526020019081526020016000206000856020015181526020019081526020016000206000856040015160ff1660ff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061117d33600161234b565b505060016008819055505050565b611193612284565b73ffffffffffffffffffffffffffffffffffffffff166111b161199e565b73ffffffffffffffffffffffffffffffffffffffff1614611207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fe9061437c565b60405180910390fd5b80600c908051906020019061121d9291906133ee565b506001601160006101000a81548160ff0219169083151502179055506115b34261124791906148a4565b60128190555050565b600e60009054906101000a900460ff1681565b61126e838383612528565b505050565b61127b612284565b73ffffffffffffffffffffffffffffffffffffffff1661129961199e565b73ffffffffffffffffffffffffffffffffffffffff16146112ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e69061437c565b60405180910390fd5b6000600a6000838152602001908152602001600020905060018160030160146101000a81548160ff0219169083151502179055505050565b60006113328361182d565b8210611373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136a9061417c565b60405180910390fd5b600061137d610d9d565b905060008060005b838110156114d7576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461147757806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156114c957868414156114c0578195505050505050611513565b83806001019450505b508080600101915050611385565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150a906144bc565b60405180910390fd5b92915050565b611521612284565b73ffffffffffffffffffffffffffffffffffffffff1661153f61199e565b73ffffffffffffffffffffffffffffffffffffffff1614611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158c9061437c565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516115bb9061405e565b60006040518083038185875af1925050503d80600081146115f8576040519150601f19603f3d011682016040523d82523d6000602084013e6115fd565b606091505b505090508061160b57600080fd5b50565b61162983838360405180602001604052806000815250611d4a565b505050565b6000611638610d9d565b8210611679576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116709061421c565b60405180910390fd5b819050919050565b611689612284565b73ffffffffffffffffffffffffffffffffffffffff166116a761199e565b73ffffffffffffffffffffffffffffffffffffffff16146116fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f49061437c565b60405180910390fd5b80600c90805190602001906117139291906133ee565b5050565b600061172282612a68565b600001519050919050565b611735613474565b600b548210611779576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611770906143fc565b60405180910390fd5b600a60008381526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160149054906101000a900460ff1615151515815250509050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561189e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611895906142dc565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61191e612284565b73ffffffffffffffffffffffffffffffffffffffff1661193c61199e565b73ffffffffffffffffffffffffffffffffffffffff1614611992576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119899061437c565b60405180910390fd5b61199c6000612c02565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546119d7906147f8565b80601f0160208091040260200160405190810160405280929190818152602001828054611a03906147f8565b8015611a505780601f10611a2557610100808354040283529160200191611a50565b820191906000526020600020905b815481529060010190602001808311611a3357829003601f168201915b5050505050905090565b60026008541415611aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a97906144dc565b60405180910390fd5b6002600881905550600e60009054906101000a900460ff16611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee9061431c565b60405180910390fd5b6113bf81600f54611b089190614670565b1115611b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b409061429c565b60405180910390fd5b600381611b553361182d565b611b5f9190614670565b1115611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b979061427c565b60405180910390fd5b80600f54611bae9190614670565b600f81905550611bbe338261234b565b600160088190555050565b611bd1612284565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c36906143bc565b60405180910390fd5b8060066000611c4c612284565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611cf9612284565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d3e91906140da565b60405180910390a35050565b611d55848484612528565b611d6184848484612cc8565b611da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d979061443c565b60405180910390fd5b50505050565b6060611db18261228c565b611df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de79061439c565b60405180910390fd5b601160009054906101000a900460ff16611e9657600d8054611e11906147f8565b80601f0160208091040260200160405190810160405280929190818152602001828054611e3d906147f8565b8015611e8a5780601f10611e5f57610100808354040283529160200191611e8a565b820191906000526020600020905b815481529060010190602001808311611e6d57829003601f168201915b50505050509050611f47565b6000611ea0612e5f565b9050601160009054906101000a900460ff168015611ebe5750600083115b15611ef95760016115b3611ed291906146f7565b60125484611ee09190614670565b611eea91906148a4565b6001611ef69190614670565b92505b600081511415611f185760405180602001604052806000815250611f43565b80611f2284612ef1565b604051602001611f3392919061402f565b6040516020818303038152906040525b9150505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fe8612284565b73ffffffffffffffffffffffffffffffffffffffff1661200661199e565b73ffffffffffffffffffffffffffffffffffffffff161461205c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120539061437c565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b612081612284565b73ffffffffffffffffffffffffffffffffffffffff1661209f61199e565b73ffffffffffffffffffffffffffffffffffffffff16146120f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ec9061437c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215c9061419c565b60405180910390fd5b61216e81612c02565b50565b612179612284565b73ffffffffffffffffffffffffffffffffffffffff1661219761199e565b73ffffffffffffffffffffffffffffffffffffffff16146121ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e49061437c565b60405180910390fd5b80600d90805190602001906122039291906133ee565b5050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b612365828260405180602001604052806000815250613052565b5050565b6000806001848460400151856000015186602001516040516000815260200160405260405161239b94939291906140f5565b6020604051602081039080840390855afa1580156123bd573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612439576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124309061415c565b60405180910390fd5b6000600a60008781526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160149054906101000a900460ff1615151515815250509050806060015173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614925050509392505050565b600061253382612a68565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661255a612284565b73ffffffffffffffffffffffffffffffffffffffff1614806125b6575061257f612284565b73ffffffffffffffffffffffffffffffffffffffff1661259e84610ab8565b73ffffffffffffffffffffffffffffffffffffffff16145b806125d257506125d182600001516125cc612284565b611f4c565b5b905080612614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260b906143dc565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267d9061435c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156126f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ed9061423c565b60405180910390fd5b6127038585856001613064565b6127136000848460000151612299565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156129f8576129578161228c565b156129f75782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a61858585600161306a565b5050505050565b612a706134bb565b612a798261228c565b612ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aaf906141bc565b60405180910390fd5b60008290505b60008110612bc1576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612bb2578092505050612bfd565b50808060019003915050612abe565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf4906144fc565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612ce98473ffffffffffffffffffffffffffffffffffffffff16612207565b15612e52578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d12612284565b8786866040518563ffffffff1660e01b8152600401612d34949392919061408e565b602060405180830381600087803b158015612d4e57600080fd5b505af1925050508015612d7f57506040513d601f19601f82011682018060405250810190612d7c9190613906565b60015b612e02573d8060008114612daf576040519150601f19603f3d011682016040523d82523d6000602084013e612db4565b606091505b50600081511415612dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df19061443c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e57565b600190505b949350505050565b6060600c8054612e6e906147f8565b80601f0160208091040260200160405190810160405280929190818152602001828054612e9a906147f8565b8015612ee75780601f10612ebc57610100808354040283529160200191612ee7565b820191906000526020600020905b815481529060010190602001808311612eca57829003601f168201915b5050505050905090565b60606000821415612f39576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061304d565b600082905060005b60008214612f6b578080612f549061485b565b915050600a82612f6491906146c6565b9150612f41565b60008167ffffffffffffffff811115612f8757612f86614991565b5b6040519080825280601f01601f191660200182016040528015612fb95781602001600182028036833780820191505090505b5090505b6000851461304657600182612fd291906146f7565b9150600a85612fe191906148a4565b6030612fed9190614670565b60f81b81838151811061300357613002614962565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561303f91906146c6565b9450612fbd565b8093505050505b919050565b61305f8383836001613070565b505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156130e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130dd9061445c565b60405180910390fd5b600084141561312a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131219061449c565b60405180910390fd5b6131376000868387613064565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156133d157818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156133bc5761337c6000888488612cc8565b6133bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b29061443c565b60405180910390fd5b5b81806001019250508080600101915050613305565b5080600081905550506133e7600086838761306a565b5050505050565b8280546133fa906147f8565b90600052602060002090601f01602090048101928261341c5760008555613463565b82601f1061343557805160ff1916838001178555613463565b82800160010185558215613463579182015b82811115613462578251825591602001919060010190613447565b5b50905061347091906134f5565b5090565b6040518060a00160405280600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581525090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561350e5760008160009055506001016134f6565b5090565b6000613525613520846145c0565b61459b565b905082815260208101848484011115613541576135406149ca565b5b61354c8482856147b6565b509392505050565b6000613567613562846145f1565b61459b565b905082815260208101848484011115613583576135826149ca565b5b61358e8482856147b6565b509392505050565b6000813590506135a5816151b9565b92915050565b6000813590506135ba816151d0565b92915050565b6000813590506135cf816151e7565b92915050565b6000813590506135e4816151fe565b92915050565b6000815190506135f9816151fe565b92915050565b600082601f830112613614576136136149c0565b5b8135613624848260208601613512565b91505092915050565b600082601f830112613642576136416149c0565b5b8135613652848260208601613554565b91505092915050565b600060608284031215613671576136706149c5565b5b61367b606061459b565b9050600061368b848285016135c0565b600083015250602061369f848285016135c0565b60208301525060406136b3848285016136d4565b60408301525092915050565b6000813590506136ce81615215565b92915050565b6000813590506136e38161522c565b92915050565b6000602082840312156136ff576136fe6149d4565b5b600061370d84828501613596565b91505092915050565b6000806040838503121561372d5761372c6149d4565b5b600061373b85828601613596565b925050602061374c85828601613596565b9150509250929050565b60008060006060848603121561376f5761376e6149d4565b5b600061377d86828701613596565b935050602061378e86828701613596565b925050604061379f868287016136bf565b9150509250925092565b600080600080608085870312156137c3576137c26149d4565b5b60006137d187828801613596565b94505060206137e287828801613596565b93505060406137f3878288016136bf565b925050606085013567ffffffffffffffff811115613814576138136149cf565b5b613820878288016135ff565b91505092959194509250565b60008060408385031215613843576138426149d4565b5b600061385185828601613596565b9250506020613862858286016135ab565b9150509250929050565b60008060408385031215613883576138826149d4565b5b600061389185828601613596565b92505060206138a2858286016136bf565b9150509250929050565b6000602082840312156138c2576138c16149d4565b5b60006138d0848285016135ab565b91505092915050565b6000602082840312156138ef576138ee6149d4565b5b60006138fd848285016135d5565b91505092915050565b60006020828403121561391c5761391b6149d4565b5b600061392a848285016135ea565b91505092915050565b600060208284031215613949576139486149d4565b5b600082013567ffffffffffffffff811115613967576139666149cf565b5b6139738482850161362d565b91505092915050565b600060208284031215613992576139916149d4565b5b60006139a0848285016136bf565b91505092915050565b600080604083850312156139c0576139bf6149d4565b5b60006139ce858286016136bf565b92505060206139df85828601613596565b9150509250929050565b60008060808385031215613a00576139ff6149d4565b5b6000613a0e858286016136bf565b9250506020613a1f8582860161365b565b9150509250929050565b613a328161472b565b82525050565b613a418161472b565b82525050565b613a508161473d565b82525050565b613a5f8161473d565b82525050565b613a6e81614749565b82525050565b6000613a7f82614622565b613a898185614638565b9350613a998185602086016147c5565b613aa2816149d9565b840191505092915050565b6000613ab88261462d565b613ac28185614654565b9350613ad28185602086016147c5565b613adb816149d9565b840191505092915050565b6000613af18261462d565b613afb8185614665565b9350613b0b8185602086016147c5565b80840191505092915050565b6000613b24601883614654565b9150613b2f826149ea565b602082019050919050565b6000613b47602283614654565b9150613b5282614a13565b604082019050919050565b6000613b6a602683614654565b9150613b7582614a62565b604082019050919050565b6000613b8d602a83614654565b9150613b9882614ab1565b604082019050919050565b6000613bb0600e83614654565b9150613bbb82614b00565b602082019050919050565b6000613bd3602483614654565b9150613bde82614b29565b604082019050919050565b6000613bf6602383614654565b9150613c0182614b78565b604082019050919050565b6000613c19602583614654565b9150613c2482614bc7565b604082019050919050565b6000613c3c600f83614654565b9150613c4782614c16565b602082019050919050565b6000613c5f601683614654565b9150613c6a82614c3f565b602082019050919050565b6000613c82601a83614654565b9150613c8d82614c68565b602082019050919050565b6000613ca5603983614654565b9150613cb082614c91565b604082019050919050565b6000613cc8602b83614654565b9150613cd382614ce0565b604082019050919050565b6000613ceb601283614654565b9150613cf682614d2f565b602082019050919050565b6000613d0e601283614654565b9150613d1982614d58565b602082019050919050565b6000613d31601883614654565b9150613d3c82614d81565b602082019050919050565b6000613d54602683614654565b9150613d5f82614daa565b604082019050919050565b6000613d77600583614665565b9150613d8282614df9565b600582019050919050565b6000613d9a602083614654565b9150613da582614e22565b602082019050919050565b6000613dbd602f83614654565b9150613dc882614e4b565b604082019050919050565b6000613de0601a83614654565b9150613deb82614e9a565b602082019050919050565b6000613e03603283614654565b9150613e0e82614ec3565b604082019050919050565b6000613e26601283614654565b9150613e3182614f12565b602082019050919050565b6000613e49602283614654565b9150613e5482614f3b565b604082019050919050565b6000613e6c600083614649565b9150613e7782614f8a565b600082019050919050565b6000613e8f603383614654565b9150613e9a82614f8d565b604082019050919050565b6000613eb2602183614654565b9150613ebd82614fdc565b604082019050919050565b6000613ed5601583614654565b9150613ee08261502b565b602082019050919050565b6000613ef8602883614654565b9150613f0382615054565b604082019050919050565b6000613f1b602e83614654565b9150613f26826150a3565b604082019050919050565b6000613f3e601f83614654565b9150613f49826150f2565b602082019050919050565b6000613f61602f83614654565b9150613f6c8261511b565b604082019050919050565b6000613f84602d83614654565b9150613f8f8261516a565b604082019050919050565b60a082016000820151613fb06000850182614002565b506020820151613fc36020850182614002565b506040820151613fd66040850182614002565b506060820151613fe96060850182613a29565b506080820151613ffc6080850182613a47565b50505050565b61400b8161479f565b82525050565b61401a8161479f565b82525050565b614029816147a9565b82525050565b600061403b8285613ae6565b91506140478284613ae6565b915061405282613d6a565b91508190509392505050565b600061406982613e5f565b9150819050919050565b60006020820190506140886000830184613a38565b92915050565b60006080820190506140a36000830187613a38565b6140b06020830186613a38565b6140bd6040830185614011565b81810360608301526140cf8184613a74565b905095945050505050565b60006020820190506140ef6000830184613a56565b92915050565b600060808201905061410a6000830187613a65565b6141176020830186614020565b6141246040830185613a65565b6141316060830184613a65565b95945050505050565b600060208201905081810360008301526141548184613aad565b905092915050565b6000602082019050818103600083015261417581613b17565b9050919050565b6000602082019050818103600083015261419581613b3a565b9050919050565b600060208201905081810360008301526141b581613b5d565b9050919050565b600060208201905081810360008301526141d581613b80565b9050919050565b600060208201905081810360008301526141f581613ba3565b9050919050565b6000602082019050818103600083015261421581613bc6565b9050919050565b6000602082019050818103600083015261423581613be9565b9050919050565b6000602082019050818103600083015261425581613c0c565b9050919050565b6000602082019050818103600083015261427581613c2f565b9050919050565b6000602082019050818103600083015261429581613c52565b9050919050565b600060208201905081810360008301526142b581613c75565b9050919050565b600060208201905081810360008301526142d581613c98565b9050919050565b600060208201905081810360008301526142f581613cbb565b9050919050565b6000602082019050818103600083015261431581613cde565b9050919050565b6000602082019050818103600083015261433581613d01565b9050919050565b6000602082019050818103600083015261435581613d24565b9050919050565b6000602082019050818103600083015261437581613d47565b9050919050565b6000602082019050818103600083015261439581613d8d565b9050919050565b600060208201905081810360008301526143b581613db0565b9050919050565b600060208201905081810360008301526143d581613dd3565b9050919050565b600060208201905081810360008301526143f581613df6565b9050919050565b6000602082019050818103600083015261441581613e19565b9050919050565b6000602082019050818103600083015261443581613e3c565b9050919050565b6000602082019050818103600083015261445581613e82565b9050919050565b6000602082019050818103600083015261447581613ea5565b9050919050565b6000602082019050818103600083015261449581613ec8565b9050919050565b600060208201905081810360008301526144b581613eeb565b9050919050565b600060208201905081810360008301526144d581613f0e565b9050919050565b600060208201905081810360008301526144f581613f31565b9050919050565b6000602082019050818103600083015261451581613f54565b9050919050565b6000602082019050818103600083015261453581613f77565b9050919050565b600060a0820190506145516000830184613f9a565b92915050565b600060208201905061456c6000830184614011565b92915050565b60006040820190506145876000830185614011565b6145946020830184613a38565b9392505050565b60006145a56145b6565b90506145b1828261482a565b919050565b6000604051905090565b600067ffffffffffffffff8211156145db576145da614991565b5b6145e4826149d9565b9050602081019050919050565b600067ffffffffffffffff82111561460c5761460b614991565b5b614615826149d9565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061467b8261479f565b91506146868361479f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146bb576146ba6148d5565b5b828201905092915050565b60006146d18261479f565b91506146dc8361479f565b9250826146ec576146eb614904565b5b828204905092915050565b60006147028261479f565b915061470d8361479f565b9250828210156147205761471f6148d5565b5b828203905092915050565b60006147368261477f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156147e35780820151818401526020810190506147c8565b838111156147f2576000848401525b50505050565b6000600282049050600182168061481057607f821691505b6020821081141561482457614823614933565b5b50919050565b614833826149d9565b810181811067ffffffffffffffff8211171561485257614851614991565b5b80604052505050565b60006148668261479f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614899576148986148d5565b5b600182019050919050565b60006148af8261479f565b91506148ba8361479f565b9250826148ca576148c9614904565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f496e76616c696420636f75706f6e000000000000000000000000000000000000600082015250565b7f4e6f206d6f7265206d696e747320666f722074686973206576656e7420616c6c60008201527f6f77656400000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4576656e7420697320636c6f7365640000000000000000000000000000000000600082015250565b7f6d6178207065722077616c6c6574207265616368656400000000000000000000600082015250565b7f6d617820726567756c617220737570706c792072656163686564000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f6d617820737570706c7920726561636865640000000000000000000000000000600082015250565b7f6d696e74696e67206e6f74206163746976650000000000000000000000000000600082015250565b7f6d6178206576656e7420737570706c7920726561636865640000000000000000600082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f6576656e7420646f65736e742065786973740000000000000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f436f75706f6e20616c7265616479206d696e7465640000000000000000000000600082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6151c28161472b565b81146151cd57600080fd5b50565b6151d98161473d565b81146151e457600080fd5b50565b6151f081614749565b81146151fb57600080fd5b50565b61520781614753565b811461521257600080fd5b50565b61521e8161479f565b811461522957600080fd5b50565b615235816147a9565b811461524057600080fd5b5056fea26469706673582212206fada78469738451184f9aa155972b06c3db8de442a0f84c67f8950081e1589964736f6c63430008070033697066733a2f2f516d63436f5972474172593553357276675537485a6f7a386b564a5067696e6e394d6838506159396245576b4435

Deployed Bytecode

0x6080604052600436106101d85760003560e01c80634f6ccce711610102578063a0712d6811610095578063e985e9c511610064578063e985e9c5146106a9578063ecd00914146106e6578063f2fde38b1461070f578063fe2c7fee14610738576101d8565b8063a0712d68146105f1578063a22cb4651461061a578063b88d4fde14610643578063c87b56dd1461066c576101d8565b806370a08231116100d157806370a0823114610547578063715018a6146105845780638da5cb5b1461059b57806395d89b41146105c6576101d8565b80634f6ccce71461046757806355f804b3146104a45780636352211e146104cd5780636d1884e01461050a576101d8565b80631a8bbe961161017a5780632ee07c00116101495780632ee07c00146103ce5780632f745c59146103f75780633ccfd60b1461043457806342842e0e1461043e576101d8565b80631a8bbe96146103285780631b655f03146103515780631d86c2281461037a57806323b872dd146103a5576101d8565b8063081812fc116101b6578063081812fc1461026e578063095ea7b3146102ab5780630dc28efe146102d457806318160ddd146102fd576101d8565b806301ffc9a7146101dd57806303e826c01461021a57806306fdde0314610243575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff91906138d9565b610761565b60405161021191906140da565b60405180910390f35b34801561022657600080fd5b50610241600480360381019061023c91906139a9565b6108ab565b005b34801561024f57600080fd5b50610258610a26565b604051610265919061413a565b60405180910390f35b34801561027a57600080fd5b506102956004803603810190610290919061397c565b610ab8565b6040516102a29190614073565b60405180910390f35b3480156102b757600080fd5b506102d260048036038101906102cd919061386c565b610b3d565b005b3480156102e057600080fd5b506102fb60048036038101906102f691906139a9565b610c56565b005b34801561030957600080fd5b50610312610d9d565b60405161031f9190614557565b60405180910390f35b34801561033457600080fd5b5061034f600480360381019061034a91906139e9565b610da6565b005b34801561035d57600080fd5b5061037860048036038101906103739190613933565b61118b565b005b34801561038657600080fd5b5061038f611250565b60405161039c91906140da565b60405180910390f35b3480156103b157600080fd5b506103cc60048036038101906103c79190613756565b611263565b005b3480156103da57600080fd5b506103f560048036038101906103f0919061397c565b611273565b005b34801561040357600080fd5b5061041e6004803603810190610419919061386c565b611327565b60405161042b9190614557565b60405180910390f35b61043c611519565b005b34801561044a57600080fd5b5061046560048036038101906104609190613756565b61160e565b005b34801561047357600080fd5b5061048e6004803603810190610489919061397c565b61162e565b60405161049b9190614557565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c69190613933565b611681565b005b3480156104d957600080fd5b506104f460048036038101906104ef919061397c565b611717565b6040516105019190614073565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c919061397c565b61172d565b60405161053e919061453c565b60405180910390f35b34801561055357600080fd5b5061056e600480360381019061056991906136e9565b61182d565b60405161057b9190614557565b60405180910390f35b34801561059057600080fd5b50610599611916565b005b3480156105a757600080fd5b506105b061199e565b6040516105bd9190614073565b60405180910390f35b3480156105d257600080fd5b506105db6119c8565b6040516105e8919061413a565b60405180910390f35b3480156105fd57600080fd5b506106186004803603810190610613919061397c565b611a5a565b005b34801561062657600080fd5b50610641600480360381019061063c919061382c565b611bc9565b005b34801561064f57600080fd5b5061066a600480360381019061066591906137a9565b611d4a565b005b34801561067857600080fd5b50610693600480360381019061068e919061397c565b611da6565b6040516106a0919061413a565b60405180910390f35b3480156106b557600080fd5b506106d060048036038101906106cb9190613716565b611f4c565b6040516106dd91906140da565b60405180910390f35b3480156106f257600080fd5b5061070d600480360381019061070891906138ac565b611fe0565b005b34801561071b57600080fd5b50610736600480360381019061073191906136e9565b612079565b005b34801561074457600080fd5b5061075f600480360381019061075a9190613933565b612171565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061082c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061089457507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108a457506108a38261221a565b5b9050919050565b6108b3612284565b73ffffffffffffffffffffffffffffffffffffffff166108d161199e565b73ffffffffffffffffffffffffffffffffffffffff1614610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091e9061437c565b60405180910390fd5b60006040518060a00160405280600b548152602001848152602001600081526020018373ffffffffffffffffffffffffffffffffffffffff16815260200160001515815250905080600a6000600b54815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060808201518160030160146101000a81548160ff0219169083151502179055509050506001600b54610a1b9190614670565b600b81905550505050565b606060018054610a35906147f8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a61906147f8565b8015610aae5780601f10610a8357610100808354040283529160200191610aae565b820191906000526020600020905b815481529060010190602001808311610a9157829003601f168201915b5050505050905090565b6000610ac38261228c565b610b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af99061451c565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b4882611717565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb09061441c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bd8612284565b73ffffffffffffffffffffffffffffffffffffffff161480610c075750610c0681610c01612284565b611f4c565b5b610c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3d906142bc565b60405180910390fd5b610c51838383612299565b505050565b610c5e612284565b73ffffffffffffffffffffffffffffffffffffffff16610c7c61199e565b73ffffffffffffffffffffffffffffffffffffffff1614610cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc99061437c565b60405180910390fd5b6101f482601054610ce39190614670565b1115610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b9061433c565b60405180910390fd5b6115b382610d30610d9d565b610d3a9190614670565b1115610d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d729061429c565b60405180910390fd5b81601054610d899190614670565b601081905550610d99818361234b565b5050565b60008054905090565b60026008541415610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de3906144dc565b60405180910390fd5b6002600881905550600e60009054906101000a900460ff16610e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3a9061431c565b60405180910390fd5b6101f460105410610e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e809061433c565b60405180910390fd5b6115b3610e94610d9d565b10610ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecb906142fc565b60405180910390fd5b600b548210610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f906143fc565b60405180910390fd5b6000600a60008481526020019081526020016000209050600015158160030160149054906101000a900460ff16151514610f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7e9061425c565b60405180910390fd5b8060010154816002015410610fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc8906141fc565b60405180910390fd5b6001151560096000846000015181526020019081526020016000206000846020015181526020019081526020016000206000846040015160ff1660ff16815260200190815260200160002060009054906101000a900460ff161515141561106d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110649061447c565b60405180910390fd5b60008333604051602001611082929190614572565b6040516020818303038152906040528051906020012090506110a5848285612369565b6110e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110db906141dc565b60405180910390fd5b600182600201546110f59190614670565b8260020181905550600160105461110c9190614670565b601081905550600160096000856000015181526020019081526020016000206000856020015181526020019081526020016000206000856040015160ff1660ff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061117d33600161234b565b505060016008819055505050565b611193612284565b73ffffffffffffffffffffffffffffffffffffffff166111b161199e565b73ffffffffffffffffffffffffffffffffffffffff1614611207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fe9061437c565b60405180910390fd5b80600c908051906020019061121d9291906133ee565b506001601160006101000a81548160ff0219169083151502179055506115b34261124791906148a4565b60128190555050565b600e60009054906101000a900460ff1681565b61126e838383612528565b505050565b61127b612284565b73ffffffffffffffffffffffffffffffffffffffff1661129961199e565b73ffffffffffffffffffffffffffffffffffffffff16146112ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e69061437c565b60405180910390fd5b6000600a6000838152602001908152602001600020905060018160030160146101000a81548160ff0219169083151502179055505050565b60006113328361182d565b8210611373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136a9061417c565b60405180910390fd5b600061137d610d9d565b905060008060005b838110156114d7576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461147757806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156114c957868414156114c0578195505050505050611513565b83806001019450505b508080600101915050611385565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150a906144bc565b60405180910390fd5b92915050565b611521612284565b73ffffffffffffffffffffffffffffffffffffffff1661153f61199e565b73ffffffffffffffffffffffffffffffffffffffff1614611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158c9061437c565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516115bb9061405e565b60006040518083038185875af1925050503d80600081146115f8576040519150601f19603f3d011682016040523d82523d6000602084013e6115fd565b606091505b505090508061160b57600080fd5b50565b61162983838360405180602001604052806000815250611d4a565b505050565b6000611638610d9d565b8210611679576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116709061421c565b60405180910390fd5b819050919050565b611689612284565b73ffffffffffffffffffffffffffffffffffffffff166116a761199e565b73ffffffffffffffffffffffffffffffffffffffff16146116fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f49061437c565b60405180910390fd5b80600c90805190602001906117139291906133ee565b5050565b600061172282612a68565b600001519050919050565b611735613474565b600b548210611779576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611770906143fc565b60405180910390fd5b600a60008381526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160149054906101000a900460ff1615151515815250509050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561189e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611895906142dc565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61191e612284565b73ffffffffffffffffffffffffffffffffffffffff1661193c61199e565b73ffffffffffffffffffffffffffffffffffffffff1614611992576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119899061437c565b60405180910390fd5b61199c6000612c02565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546119d7906147f8565b80601f0160208091040260200160405190810160405280929190818152602001828054611a03906147f8565b8015611a505780601f10611a2557610100808354040283529160200191611a50565b820191906000526020600020905b815481529060010190602001808311611a3357829003601f168201915b5050505050905090565b60026008541415611aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a97906144dc565b60405180910390fd5b6002600881905550600e60009054906101000a900460ff16611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee9061431c565b60405180910390fd5b6113bf81600f54611b089190614670565b1115611b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b409061429c565b60405180910390fd5b600381611b553361182d565b611b5f9190614670565b1115611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b979061427c565b60405180910390fd5b80600f54611bae9190614670565b600f81905550611bbe338261234b565b600160088190555050565b611bd1612284565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c36906143bc565b60405180910390fd5b8060066000611c4c612284565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611cf9612284565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d3e91906140da565b60405180910390a35050565b611d55848484612528565b611d6184848484612cc8565b611da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d979061443c565b60405180910390fd5b50505050565b6060611db18261228c565b611df0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de79061439c565b60405180910390fd5b601160009054906101000a900460ff16611e9657600d8054611e11906147f8565b80601f0160208091040260200160405190810160405280929190818152602001828054611e3d906147f8565b8015611e8a5780601f10611e5f57610100808354040283529160200191611e8a565b820191906000526020600020905b815481529060010190602001808311611e6d57829003601f168201915b50505050509050611f47565b6000611ea0612e5f565b9050601160009054906101000a900460ff168015611ebe5750600083115b15611ef95760016115b3611ed291906146f7565b60125484611ee09190614670565b611eea91906148a4565b6001611ef69190614670565b92505b600081511415611f185760405180602001604052806000815250611f43565b80611f2284612ef1565b604051602001611f3392919061402f565b6040516020818303038152906040525b9150505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fe8612284565b73ffffffffffffffffffffffffffffffffffffffff1661200661199e565b73ffffffffffffffffffffffffffffffffffffffff161461205c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120539061437c565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b612081612284565b73ffffffffffffffffffffffffffffffffffffffff1661209f61199e565b73ffffffffffffffffffffffffffffffffffffffff16146120f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ec9061437c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215c9061419c565b60405180910390fd5b61216e81612c02565b50565b612179612284565b73ffffffffffffffffffffffffffffffffffffffff1661219761199e565b73ffffffffffffffffffffffffffffffffffffffff16146121ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e49061437c565b60405180910390fd5b80600d90805190602001906122039291906133ee565b5050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b612365828260405180602001604052806000815250613052565b5050565b6000806001848460400151856000015186602001516040516000815260200160405260405161239b94939291906140f5565b6020604051602081039080840390855afa1580156123bd573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612439576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124309061415c565b60405180910390fd5b6000600a60008781526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160149054906101000a900460ff1615151515815250509050806060015173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614925050509392505050565b600061253382612a68565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661255a612284565b73ffffffffffffffffffffffffffffffffffffffff1614806125b6575061257f612284565b73ffffffffffffffffffffffffffffffffffffffff1661259e84610ab8565b73ffffffffffffffffffffffffffffffffffffffff16145b806125d257506125d182600001516125cc612284565b611f4c565b5b905080612614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260b906143dc565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267d9061435c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156126f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ed9061423c565b60405180910390fd5b6127038585856001613064565b6127136000848460000151612299565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156129f8576129578161228c565b156129f75782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a61858585600161306a565b5050505050565b612a706134bb565b612a798261228c565b612ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aaf906141bc565b60405180910390fd5b60008290505b60008110612bc1576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612bb2578092505050612bfd565b50808060019003915050612abe565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf4906144fc565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612ce98473ffffffffffffffffffffffffffffffffffffffff16612207565b15612e52578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d12612284565b8786866040518563ffffffff1660e01b8152600401612d34949392919061408e565b602060405180830381600087803b158015612d4e57600080fd5b505af1925050508015612d7f57506040513d601f19601f82011682018060405250810190612d7c9190613906565b60015b612e02573d8060008114612daf576040519150601f19603f3d011682016040523d82523d6000602084013e612db4565b606091505b50600081511415612dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df19061443c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e57565b600190505b949350505050565b6060600c8054612e6e906147f8565b80601f0160208091040260200160405190810160405280929190818152602001828054612e9a906147f8565b8015612ee75780601f10612ebc57610100808354040283529160200191612ee7565b820191906000526020600020905b815481529060010190602001808311612eca57829003601f168201915b5050505050905090565b60606000821415612f39576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061304d565b600082905060005b60008214612f6b578080612f549061485b565b915050600a82612f6491906146c6565b9150612f41565b60008167ffffffffffffffff811115612f8757612f86614991565b5b6040519080825280601f01601f191660200182016040528015612fb95781602001600182028036833780820191505090505b5090505b6000851461304657600182612fd291906146f7565b9150600a85612fe191906148a4565b6030612fed9190614670565b60f81b81838151811061300357613002614962565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561303f91906146c6565b9450612fbd565b8093505050505b919050565b61305f8383836001613070565b505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156130e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130dd9061445c565b60405180910390fd5b600084141561312a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131219061449c565b60405180910390fd5b6131376000868387613064565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156133d157818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156133bc5761337c6000888488612cc8565b6133bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b29061443c565b60405180910390fd5b5b81806001019250508080600101915050613305565b5080600081905550506133e7600086838761306a565b5050505050565b8280546133fa906147f8565b90600052602060002090601f01602090048101928261341c5760008555613463565b82601f1061343557805160ff1916838001178555613463565b82800160010185558215613463579182015b82811115613462578251825591602001919060010190613447565b5b50905061347091906134f5565b5090565b6040518060a00160405280600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581525090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561350e5760008160009055506001016134f6565b5090565b6000613525613520846145c0565b61459b565b905082815260208101848484011115613541576135406149ca565b5b61354c8482856147b6565b509392505050565b6000613567613562846145f1565b61459b565b905082815260208101848484011115613583576135826149ca565b5b61358e8482856147b6565b509392505050565b6000813590506135a5816151b9565b92915050565b6000813590506135ba816151d0565b92915050565b6000813590506135cf816151e7565b92915050565b6000813590506135e4816151fe565b92915050565b6000815190506135f9816151fe565b92915050565b600082601f830112613614576136136149c0565b5b8135613624848260208601613512565b91505092915050565b600082601f830112613642576136416149c0565b5b8135613652848260208601613554565b91505092915050565b600060608284031215613671576136706149c5565b5b61367b606061459b565b9050600061368b848285016135c0565b600083015250602061369f848285016135c0565b60208301525060406136b3848285016136d4565b60408301525092915050565b6000813590506136ce81615215565b92915050565b6000813590506136e38161522c565b92915050565b6000602082840312156136ff576136fe6149d4565b5b600061370d84828501613596565b91505092915050565b6000806040838503121561372d5761372c6149d4565b5b600061373b85828601613596565b925050602061374c85828601613596565b9150509250929050565b60008060006060848603121561376f5761376e6149d4565b5b600061377d86828701613596565b935050602061378e86828701613596565b925050604061379f868287016136bf565b9150509250925092565b600080600080608085870312156137c3576137c26149d4565b5b60006137d187828801613596565b94505060206137e287828801613596565b93505060406137f3878288016136bf565b925050606085013567ffffffffffffffff811115613814576138136149cf565b5b613820878288016135ff565b91505092959194509250565b60008060408385031215613843576138426149d4565b5b600061385185828601613596565b9250506020613862858286016135ab565b9150509250929050565b60008060408385031215613883576138826149d4565b5b600061389185828601613596565b92505060206138a2858286016136bf565b9150509250929050565b6000602082840312156138c2576138c16149d4565b5b60006138d0848285016135ab565b91505092915050565b6000602082840312156138ef576138ee6149d4565b5b60006138fd848285016135d5565b91505092915050565b60006020828403121561391c5761391b6149d4565b5b600061392a848285016135ea565b91505092915050565b600060208284031215613949576139486149d4565b5b600082013567ffffffffffffffff811115613967576139666149cf565b5b6139738482850161362d565b91505092915050565b600060208284031215613992576139916149d4565b5b60006139a0848285016136bf565b91505092915050565b600080604083850312156139c0576139bf6149d4565b5b60006139ce858286016136bf565b92505060206139df85828601613596565b9150509250929050565b60008060808385031215613a00576139ff6149d4565b5b6000613a0e858286016136bf565b9250506020613a1f8582860161365b565b9150509250929050565b613a328161472b565b82525050565b613a418161472b565b82525050565b613a508161473d565b82525050565b613a5f8161473d565b82525050565b613a6e81614749565b82525050565b6000613a7f82614622565b613a898185614638565b9350613a998185602086016147c5565b613aa2816149d9565b840191505092915050565b6000613ab88261462d565b613ac28185614654565b9350613ad28185602086016147c5565b613adb816149d9565b840191505092915050565b6000613af18261462d565b613afb8185614665565b9350613b0b8185602086016147c5565b80840191505092915050565b6000613b24601883614654565b9150613b2f826149ea565b602082019050919050565b6000613b47602283614654565b9150613b5282614a13565b604082019050919050565b6000613b6a602683614654565b9150613b7582614a62565b604082019050919050565b6000613b8d602a83614654565b9150613b9882614ab1565b604082019050919050565b6000613bb0600e83614654565b9150613bbb82614b00565b602082019050919050565b6000613bd3602483614654565b9150613bde82614b29565b604082019050919050565b6000613bf6602383614654565b9150613c0182614b78565b604082019050919050565b6000613c19602583614654565b9150613c2482614bc7565b604082019050919050565b6000613c3c600f83614654565b9150613c4782614c16565b602082019050919050565b6000613c5f601683614654565b9150613c6a82614c3f565b602082019050919050565b6000613c82601a83614654565b9150613c8d82614c68565b602082019050919050565b6000613ca5603983614654565b9150613cb082614c91565b604082019050919050565b6000613cc8602b83614654565b9150613cd382614ce0565b604082019050919050565b6000613ceb601283614654565b9150613cf682614d2f565b602082019050919050565b6000613d0e601283614654565b9150613d1982614d58565b602082019050919050565b6000613d31601883614654565b9150613d3c82614d81565b602082019050919050565b6000613d54602683614654565b9150613d5f82614daa565b604082019050919050565b6000613d77600583614665565b9150613d8282614df9565b600582019050919050565b6000613d9a602083614654565b9150613da582614e22565b602082019050919050565b6000613dbd602f83614654565b9150613dc882614e4b565b604082019050919050565b6000613de0601a83614654565b9150613deb82614e9a565b602082019050919050565b6000613e03603283614654565b9150613e0e82614ec3565b604082019050919050565b6000613e26601283614654565b9150613e3182614f12565b602082019050919050565b6000613e49602283614654565b9150613e5482614f3b565b604082019050919050565b6000613e6c600083614649565b9150613e7782614f8a565b600082019050919050565b6000613e8f603383614654565b9150613e9a82614f8d565b604082019050919050565b6000613eb2602183614654565b9150613ebd82614fdc565b604082019050919050565b6000613ed5601583614654565b9150613ee08261502b565b602082019050919050565b6000613ef8602883614654565b9150613f0382615054565b604082019050919050565b6000613f1b602e83614654565b9150613f26826150a3565b604082019050919050565b6000613f3e601f83614654565b9150613f49826150f2565b602082019050919050565b6000613f61602f83614654565b9150613f6c8261511b565b604082019050919050565b6000613f84602d83614654565b9150613f8f8261516a565b604082019050919050565b60a082016000820151613fb06000850182614002565b506020820151613fc36020850182614002565b506040820151613fd66040850182614002565b506060820151613fe96060850182613a29565b506080820151613ffc6080850182613a47565b50505050565b61400b8161479f565b82525050565b61401a8161479f565b82525050565b614029816147a9565b82525050565b600061403b8285613ae6565b91506140478284613ae6565b915061405282613d6a565b91508190509392505050565b600061406982613e5f565b9150819050919050565b60006020820190506140886000830184613a38565b92915050565b60006080820190506140a36000830187613a38565b6140b06020830186613a38565b6140bd6040830185614011565b81810360608301526140cf8184613a74565b905095945050505050565b60006020820190506140ef6000830184613a56565b92915050565b600060808201905061410a6000830187613a65565b6141176020830186614020565b6141246040830185613a65565b6141316060830184613a65565b95945050505050565b600060208201905081810360008301526141548184613aad565b905092915050565b6000602082019050818103600083015261417581613b17565b9050919050565b6000602082019050818103600083015261419581613b3a565b9050919050565b600060208201905081810360008301526141b581613b5d565b9050919050565b600060208201905081810360008301526141d581613b80565b9050919050565b600060208201905081810360008301526141f581613ba3565b9050919050565b6000602082019050818103600083015261421581613bc6565b9050919050565b6000602082019050818103600083015261423581613be9565b9050919050565b6000602082019050818103600083015261425581613c0c565b9050919050565b6000602082019050818103600083015261427581613c2f565b9050919050565b6000602082019050818103600083015261429581613c52565b9050919050565b600060208201905081810360008301526142b581613c75565b9050919050565b600060208201905081810360008301526142d581613c98565b9050919050565b600060208201905081810360008301526142f581613cbb565b9050919050565b6000602082019050818103600083015261431581613cde565b9050919050565b6000602082019050818103600083015261433581613d01565b9050919050565b6000602082019050818103600083015261435581613d24565b9050919050565b6000602082019050818103600083015261437581613d47565b9050919050565b6000602082019050818103600083015261439581613d8d565b9050919050565b600060208201905081810360008301526143b581613db0565b9050919050565b600060208201905081810360008301526143d581613dd3565b9050919050565b600060208201905081810360008301526143f581613df6565b9050919050565b6000602082019050818103600083015261441581613e19565b9050919050565b6000602082019050818103600083015261443581613e3c565b9050919050565b6000602082019050818103600083015261445581613e82565b9050919050565b6000602082019050818103600083015261447581613ea5565b9050919050565b6000602082019050818103600083015261449581613ec8565b9050919050565b600060208201905081810360008301526144b581613eeb565b9050919050565b600060208201905081810360008301526144d581613f0e565b9050919050565b600060208201905081810360008301526144f581613f31565b9050919050565b6000602082019050818103600083015261451581613f54565b9050919050565b6000602082019050818103600083015261453581613f77565b9050919050565b600060a0820190506145516000830184613f9a565b92915050565b600060208201905061456c6000830184614011565b92915050565b60006040820190506145876000830185614011565b6145946020830184613a38565b9392505050565b60006145a56145b6565b90506145b1828261482a565b919050565b6000604051905090565b600067ffffffffffffffff8211156145db576145da614991565b5b6145e4826149d9565b9050602081019050919050565b600067ffffffffffffffff82111561460c5761460b614991565b5b614615826149d9565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061467b8261479f565b91506146868361479f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146bb576146ba6148d5565b5b828201905092915050565b60006146d18261479f565b91506146dc8361479f565b9250826146ec576146eb614904565b5b828204905092915050565b60006147028261479f565b915061470d8361479f565b9250828210156147205761471f6148d5565b5b828203905092915050565b60006147368261477f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156147e35780820151818401526020810190506147c8565b838111156147f2576000848401525b50505050565b6000600282049050600182168061481057607f821691505b6020821081141561482457614823614933565b5b50919050565b614833826149d9565b810181811067ffffffffffffffff8211171561485257614851614991565b5b80604052505050565b60006148668261479f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614899576148986148d5565b5b600182019050919050565b60006148af8261479f565b91506148ba8361479f565b9250826148ca576148c9614904565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f496e76616c696420636f75706f6e000000000000000000000000000000000000600082015250565b7f4e6f206d6f7265206d696e747320666f722074686973206576656e7420616c6c60008201527f6f77656400000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4576656e7420697320636c6f7365640000000000000000000000000000000000600082015250565b7f6d6178207065722077616c6c6574207265616368656400000000000000000000600082015250565b7f6d617820726567756c617220737570706c792072656163686564000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f6d617820737570706c7920726561636865640000000000000000000000000000600082015250565b7f6d696e74696e67206e6f74206163746976650000000000000000000000000000600082015250565b7f6d6178206576656e7420737570706c7920726561636865640000000000000000600082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f6576656e7420646f65736e742065786973740000000000000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f436f75706f6e20616c7265616479206d696e7465640000000000000000000000600082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6151c28161472b565b81146151cd57600080fd5b50565b6151d98161473d565b81146151e457600080fd5b50565b6151f081614749565b81146151fb57600080fd5b50565b61520781614753565b811461521257600080fd5b50565b61521e8161479f565b811461522957600080fd5b50565b615235816147a9565b811461524057600080fd5b5056fea26469706673582212206fada78469738451184f9aa155972b06c3db8de442a0f84c67f8950081e1589964736f6c63430008070033

Deployed Bytecode Sourcemap

55956:5565:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40301:356;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60102:317;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42139:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43701:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43222:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58831:340;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38614:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57787:1036;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59556:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56839:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44577:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60427:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39278:951;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59743:168;;;:::i;:::-;;44810:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38791:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59309:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41948:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59919:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40721:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13944:94;;;;;;;;;;;;;:::i;:::-;;13293:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42308:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57383:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43987:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45058:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60972:546;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44346:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59179:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14193:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59423:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40301:356;40403:4;40451:25;40436:40;;;:11;:40;;;;:101;;;;40504:33;40489:48;;;:11;:48;;;;40436:101;:164;;;;40565:35;40550:50;;;:11;:50;;;;40436:164;:213;;;;40613:36;40637:11;40613:23;:36::i;:::-;40436:213;40420:229;;40301:356;;;:::o;60102:317::-;13524:12;:10;:12::i;:::-;13513:23;;:7;:5;:7::i;:::-;:23;;;13505:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60179:21:::1;60203:123;;;;;;;;60223:12;;60203:123;;;;60250:7;60203:123;;;;60272:1;60203:123;;;;60288:7;60203:123;;;;;;60310:5;60203:123;;;;::::0;60179:147:::1;;60361:8;60337:7;:21;60345:12;;60337:21;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60410:1;60395:12;;:16;;;;:::i;:::-;60380:12;:31;;;;60168:251;60102:317:::0;;:::o;42139:100::-;42193:13;42226:5;42219:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42139:100;:::o;43701:214::-;43769:7;43797:16;43805:7;43797;:16::i;:::-;43789:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;43883:15;:24;43899:7;43883:24;;;;;;;;;;;;;;;;;;;;;43876:31;;43701:214;;;:::o;43222:413::-;43295:13;43311:24;43327:7;43311:15;:24::i;:::-;43295:40;;43360:5;43354:11;;:2;:11;;;;43346:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;43455:5;43439:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;43464:37;43481:5;43488:12;:10;:12::i;:::-;43464:16;:37::i;:::-;43439:62;43417:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;43599:28;43608:2;43612:7;43621:5;43599:8;:28::i;:::-;43284:351;43222:413;;:::o;58831:340::-;13524:12;:10;:12::i;:::-;13513:23;;:7;:5;:7::i;:::-;:23;;;13505:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56250:3:::1;58936:7;58921:12;;:22;;;;:::i;:::-;:38;;58913:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;56085:4;59023:7;59007:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:37;;58999:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;59116:7;59101:12;;:22;;;;:::i;:::-;59086:12;:37;;;;59134:29;59144:9;59155:7;59134:9;:29::i;:::-;58831:340:::0;;:::o;38614:100::-;38667:7;38694:12;;38687:19;;38614:100;:::o;57787:1036::-;54982:1;55580:7;;:19;;55572:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;54982:1;55713:7;:18;;;;57885:16:::1;;;;;;;;;;;57877:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;56250:3;57943:12;;:27;57935:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;56085:4;58018:13;:11;:13::i;:::-;:26;58010:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;58099:12;;58088:8;:23;58080:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;58145:27;58175:7;:17;58183:8;58175:17;;;;;;;;;;;58145:47;;58237:5;58211:31;;:13;:22;;;;;;;;;;;;:31;;;58203:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;58304:13;:20;;;58281:13;:20;;;:43;58273:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;58434:4;58386:52;;:14;:24;58401:6;:8;;;58386:24;;;;;;;;;;;:34;58411:6;:8;;;58386:34;;;;;;;;;;;:44;58421:6;:8;;;58386:44;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;58378:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;58475:14;58513:8;58523:10;58502:32;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58492:43;;;;;;58475:60;;58554:43;58572:8;58582:6;58590;58554:17;:43::i;:::-;58546:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;58675:1;58652:13;:20;;;:24;;;;:::i;:::-;58629:13;:20;;:47;;;;58717:1;58702:12;;:16;;;;:::i;:::-;58687:12;:31;;;;58776:4;58729:14;:24;58744:6;:8;;;58729:24;;;;;;;;;;;:34;58754:6;:8;;;58729:34;;;;;;;;;;;:44;58764:6;:8;;;58729:44;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;58791:24;58801:10;58813:1;58791:9;:24::i;:::-;57866:957;;54938:1:::0;55892:7;:22;;;;57787:1036;;:::o;59556:179::-;13524:12;:10;:12::i;:::-;13513:23;;:7;:5;:7::i;:::-;:23;;;13505:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59642:8:::1;59626:13;:24;;;;;;;;;;;;:::i;:::-;;59675:4;59661:11;;:18;;;;;;;;;;;;;;;;;;56085:4;59699:15;:28;;;;:::i;:::-;59690:6;:37;;;;59556:179:::0;:::o;56839:36::-;;;;;;;;;;;;;:::o;44577:162::-;44703:28;44713:4;44719:2;44723:7;44703:9;:28::i;:::-;44577:162;;;:::o;60427:158::-;13524:12;:10;:12::i;:::-;13513:23;;:7;:5;:7::i;:::-;:23;;;13505:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60490:27:::1;60520:7;:17;60528:8;60520:17;;;;;;;;;;;60490:47;;60573:4;60548:13;:22;;;:29;;;;;;;;;;;;;;;;;;60479:106;60427:158:::0;:::o;39278:951::-;39367:7;39403:16;39413:5;39403:9;:16::i;:::-;39395:5;:24;39387:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;39469:22;39494:13;:11;:13::i;:::-;39469:38;;39518:19;39548:25;39729:9;39724:422;39744:14;39740:1;:18;39724:422;;;39780:31;39814:11;:14;39826:1;39814:14;;;;;;;;;;;39780:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39873:1;39847:28;;:9;:14;;;:28;;;39843:103;;39916:9;:14;;;39896:34;;39843:103;39985:5;39964:26;;:17;:26;;;39960:175;;;40030:5;40015:11;:20;40011:77;;;40067:1;40060:8;;;;;;;;;40011:77;40106:13;;;;;;;39960:175;39765:381;39760:3;;;;;;;39724:422;;;;40165:56;;;;;;;;;;:::i;:::-;;;;;;;;39278:951;;;;;:::o;59743:168::-;13524:12;:10;:12::i;:::-;13513:23;;:7;:5;:7::i;:::-;:23;;;13505:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59800:12:::1;59826:10;59818:24;;59850:21;59818:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59799:77;;;59895:7;59887:16;;;::::0;::::1;;59788:123;59743:168::o:0;44810:177::-;44940:39;44957:4;44963:2;44967:7;44940:39;;;;;;;;;;;;:16;:39::i;:::-;44810:177;;;:::o;38791:187::-;38858:7;38894:13;:11;:13::i;:::-;38886:5;:21;38878:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;38965:5;38958:12;;38791:187;;;:::o;59309:106::-;13524:12;:10;:12::i;:::-;13513:23;;:7;:5;:7::i;:::-;:23;;;13505:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59399:8:::1;59383:13;:24;;;;;;;;;;;;:::i;:::-;;59309:106:::0;:::o;41948:124::-;42012:7;42039:20;42051:7;42039:11;:20::i;:::-;:25;;;42032:32;;41948:124;;;:::o;59919:175::-;59972:12;;:::i;:::-;60016;;60005:8;:23;59997:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;60069:7;:17;60077:8;60069:17;;;;;;;;;;;60062:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59919:175;;;:::o;40721:221::-;40785:7;40830:1;40813:19;;:5;:19;;;;40805:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;40906:12;:19;40919:5;40906:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;40898:36;;40891:43;;40721:221;;;:::o;13944:94::-;13524:12;:10;:12::i;:::-;13513:23;;:7;:5;:7::i;:::-;:23;;;13505:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14009:21:::1;14027:1;14009:9;:21::i;:::-;13944:94::o:0;13293:87::-;13339:7;13366:6;;;;;;;;;;;13359:13;;13293:87;:::o;42308:104::-;42364:13;42397:7;42390:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42308:104;:::o;57383:396::-;54982:1;55580:7;;:19;;55572:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;54982:1;55713:7;:18;;;;57452:16:::1;;;;;;;;;;;57444:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;56181:4;57527:7;57510:14;;:24;;;;:::i;:::-;:42;;57502:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;56329:1;57626:7;57602:21;57612:10;57602:9;:21::i;:::-;:31;;;;:::i;:::-;:49;;57594:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;57723:7;57706:14;;:24;;;;:::i;:::-;57689:14;:41;;;;57741:30;57751:10;57763:7;57741:9;:30::i;:::-;54938:1:::0;55892:7;:22;;;;57383:396;:::o;43987:288::-;44094:12;:10;:12::i;:::-;44082:24;;:8;:24;;;;44074:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;44195:8;44150:18;:32;44169:12;:10;:12::i;:::-;44150:32;;;;;;;;;;;;;;;:42;44183:8;44150:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;44248:8;44219:48;;44234:12;:10;:12::i;:::-;44219:48;;;44258:8;44219:48;;;;;;:::i;:::-;;;;;;;;43987:288;;:::o;45058:355::-;45217:28;45227:4;45233:2;45237:7;45217:9;:28::i;:::-;45278:48;45301:4;45307:2;45311:7;45320:5;45278:22;:48::i;:::-;45256:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;45058:355;;;;:::o;60972:546::-;61045:13;61079:16;61087:7;61079;:16::i;:::-;61071:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;61164:11;;;;;;;;;;;61160:65;;61199:14;61192:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61160:65;61237:21;61261:10;:8;:10::i;:::-;61237:34;;61287:11;;;;;;;;;;;:26;;;;;61312:1;61302:7;:11;61287:26;61284:111;;;61380:1;56085:4;61367:14;;;;:::i;:::-;61356:6;;61346:7;:16;;;;:::i;:::-;61345:37;;;;:::i;:::-;61340:1;:43;;;;:::i;:::-;61330:53;;61284:111;61439:1;61420:7;61414:21;:26;;:96;;;;;;;;;;;;;;;;;61467:7;61476:18;:7;:16;:18::i;:::-;61450:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61414:96;61407:103;;;60972:546;;;;:::o;44346:164::-;44443:4;44467:18;:25;44486:5;44467:25;;;;;;;;;;;;;;;:35;44493:8;44467:35;;;;;;;;;;;;;;;;;;;;;;;;;44460:42;;44346:164;;;;:::o;59179:122::-;13524:12;:10;:12::i;:::-;13513:23;;:7;:5;:7::i;:::-;:23;;;13505:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59277:16:::1;59258;;:35;;;;;;;;;;;;;;;;;;59179:122:::0;:::o;14193:192::-;13524:12;:10;:12::i;:::-;13513:23;;:7;:5;:7::i;:::-;:23;;;13505:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14302:1:::1;14282:22;;:8;:22;;;;14274:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14358:19;14368:8;14358:9;:19::i;:::-;14193:192:::0;:::o;59423:125::-;13524:12;:10;:12::i;:::-;13513:23;;:7;:5;:7::i;:::-;:23;;;13505:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59526:14:::1;59509;:31;;;;;;;;;;;;:::i;:::-;;59423:125:::0;:::o;15307:387::-;15367:4;15575:12;15642:7;15630:20;15622:28;;15685:1;15678:4;:8;15671:15;;;15307:387;;;:::o;30745:157::-;30830:4;30869:25;30854:40;;;:11;:40;;;;30847:47;;30745:157;;;:::o;12114:98::-;12167:7;12194:10;12187:17;;12114:98;:::o;45668:111::-;45725:4;45759:12;;45749:7;:22;45742:29;;45668:111;;;:::o;50448:196::-;50590:2;50563:15;:24;50579:7;50563:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;50628:7;50624:2;50608:28;;50617:5;50608:28;;;;;;;;;;;;50448:196;;;:::o;45787:104::-;45856:27;45866:2;45870:8;45856:27;;;;;;;;;;;;:9;:27::i;:::-;45787:104;;:::o;60593:371::-;60698:4;60715:14;60732:51;60742:7;60751;:9;;;60762:7;:9;;;60773:7;:9;;;60732:51;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60715:68;;60820:1;60802:20;;:6;:20;;;;60794:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;60862:26;60891:7;:17;60899:8;60891:17;;;;;;;;;;;60862:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60936:13;:20;;;60926:30;;:6;:30;;;60919:37;;;;60593:371;;;;;:::o;48396:1934::-;48511:35;48549:20;48561:7;48549:11;:20::i;:::-;48511:58;;48582:22;48624:13;:18;;;48608:34;;:12;:10;:12::i;:::-;:34;;;:83;;;;48679:12;:10;:12::i;:::-;48655:36;;:20;48667:7;48655:11;:20::i;:::-;:36;;;48608:83;:146;;;;48704:50;48721:13;:18;;;48741:12;:10;:12::i;:::-;48704:16;:50::i;:::-;48608:146;48582:173;;48776:17;48768:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;48891:4;48869:26;;:13;:18;;;:26;;;48861:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;48971:1;48957:16;;:2;:16;;;;48949:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;49028:43;49050:4;49056:2;49060:7;49069:1;49028:21;:43::i;:::-;49136:49;49153:1;49157:7;49166:13;:18;;;49136:8;:49::i;:::-;49503:1;49473:12;:18;49486:4;49473:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49543:1;49515:12;:16;49528:2;49515:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49585:2;49557:11;:20;49569:7;49557:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;49643:15;49598:11;:20;49610:7;49598:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;49899:19;49931:1;49921:7;:11;49899:33;;49988:1;49947:43;;:11;:24;49959:11;49947:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;49943:275;;;50011:20;50019:11;50011:7;:20::i;:::-;50007:200;;;50084:13;:18;;;50052:11;:24;50064:11;50052:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;50163:13;:28;;;50121:11;:24;50133:11;50121:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;50007:200;49943:275;49452:773;50261:7;50257:2;50242:27;;50251:4;50242:27;;;;;;;;;;;;50280:42;50301:4;50307:2;50311:7;50320:1;50280:20;:42::i;:::-;48500:1830;;48396:1934;;;:::o;41381:505::-;41442:21;;:::i;:::-;41484:16;41492:7;41484;:16::i;:::-;41476:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;41582:12;41597:7;41582:22;;41577:225;41614:1;41606:4;:9;41577:225;;41640:31;41674:11;:17;41686:4;41674:17;;;;;;;;;;;41640:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41736:1;41710:28;;:9;:14;;;:28;;;41706:85;;41766:9;41759:16;;;;;;41706:85;41625:177;41617:6;;;;;;;;41577:225;;;;41821:57;;;;;;;;;;:::i;:::-;;;;;;;;41381:505;;;;:::o;14393:173::-;14449:16;14468:6;;;;;;;;;;;14449:25;;14494:8;14485:6;;:17;;;;;;;;;;;;;;;;;;14549:8;14518:40;;14539:8;14518:40;;;;;;;;;;;;14438:128;14393:173;:::o;51209:804::-;51364:4;51385:15;:2;:13;;;:15::i;:::-;51381:625;;;51437:2;51421:36;;;51458:12;:10;:12::i;:::-;51472:4;51478:7;51487:5;51421:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51417:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51684:1;51667:6;:13;:18;51663:273;;;51710:61;;;;;;;;;;:::i;:::-;;;;;;;;51663:273;51886:6;51880:13;51871:6;51867:2;51863:15;51856:38;51417:534;51554:45;;;51544:55;;;:6;:55;;;;51537:62;;;;;51381:625;51990:4;51983:11;;51209:804;;;;;;;:::o;57261:114::-;57321:13;57354;57347:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57261:114;:::o;288:723::-;344:13;574:1;565:5;:10;561:53;;;592:10;;;;;;;;;;;;;;;;;;;;;561:53;624:12;639:5;624:20;;655:14;680:78;695:1;687:4;:9;680:78;;713:8;;;;;:::i;:::-;;;;744:2;736:10;;;;;:::i;:::-;;;680:78;;;768:19;800:6;790:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;768:39;;818:154;834:1;825:5;:10;818:154;;862:1;852:11;;;;;:::i;:::-;;;929:2;921:5;:10;;;;:::i;:::-;908:2;:24;;;;:::i;:::-;895:39;;878:6;885;878:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;958:2;949:11;;;;;:::i;:::-;;;818:154;;;996:6;982:21;;;;;288:723;;;;:::o;46254:163::-;46377:32;46383:2;46387:8;46397:5;46404:4;46377:5;:32::i;:::-;46254:163;;;:::o;52501:159::-;;;;;:::o;53072:158::-;;;;;:::o;46676:1466::-;46815:20;46838:12;;46815:35;;46883:1;46869:16;;:2;:16;;;;46861:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;46954:1;46942:8;:13;;46934:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;47013:61;47043:1;47047:2;47051:12;47065:8;47013:21;:61::i;:::-;47380:8;47344:12;:16;47357:2;47344:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47441:8;47400:12;:16;47413:2;47400:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47496:2;47463:11;:25;47475:12;47463:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;47559:15;47509:11;:25;47521:12;47509:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;47588:20;47611:12;47588:35;;47641:9;47636:379;47656:8;47652:1;:12;47636:379;;;47716:12;47712:2;47691:38;;47708:1;47691:38;;;;;;;;;;;;47748:4;47744:229;;;47803:59;47834:1;47838:2;47842:12;47856:5;47803:22;:59::i;:::-;47773:184;;;;;;;;;;;;:::i;:::-;;;;;;;;;47744:229;47989:14;;;;;;;47666:3;;;;;;;47636:379;;;;48042:12;48027;:27;;;;47323:739;48074:60;48103:1;48107:2;48111:12;48125:8;48074:20;:60::i;:::-;46804:1338;46676:1466;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:139::-;1171:5;1209:6;1196:20;1187:29;;1225:33;1252:5;1225:33;:::i;:::-;1125:139;;;;:::o;1270:137::-;1315:5;1353:6;1340:20;1331:29;;1369:32;1395:5;1369:32;:::i;:::-;1270:137;;;;:::o;1413:141::-;1469:5;1500:6;1494:13;1485:22;;1516:32;1542:5;1516:32;:::i;:::-;1413:141;;;;:::o;1573:338::-;1628:5;1677:3;1670:4;1662:6;1658:17;1654:27;1644:122;;1685:79;;:::i;:::-;1644:122;1802:6;1789:20;1827:78;1901:3;1893:6;1886:4;1878:6;1874:17;1827:78;:::i;:::-;1818:87;;1634:277;1573:338;;;;:::o;1931:340::-;1987:5;2036:3;2029:4;2021:6;2017:17;2013:27;2003:122;;2044:79;;:::i;:::-;2003:122;2161:6;2148:20;2186:79;2261:3;2253:6;2246:4;2238:6;2234:17;2186:79;:::i;:::-;2177:88;;1993:278;1931:340;;;;:::o;2302:723::-;2375:5;2419:4;2407:9;2402:3;2398:19;2394:30;2391:117;;;2427:79;;:::i;:::-;2391:117;2526:21;2542:4;2526:21;:::i;:::-;2517:30;;2603:1;2643:49;2688:3;2679:6;2668:9;2664:22;2643:49;:::i;:::-;2636:4;2629:5;2625:16;2618:75;2557:147;2760:2;2801:49;2846:3;2837:6;2826:9;2822:22;2801:49;:::i;:::-;2794:4;2787:5;2783:16;2776:75;2714:148;2918:2;2959:47;3002:3;2993:6;2982:9;2978:22;2959:47;:::i;:::-;2952:4;2945:5;2941:16;2934:73;2872:146;2302:723;;;;:::o;3031:139::-;3077:5;3115:6;3102:20;3093:29;;3131:33;3158:5;3131:33;:::i;:::-;3031:139;;;;:::o;3176:135::-;3220:5;3258:6;3245:20;3236:29;;3274:31;3299:5;3274:31;:::i;:::-;3176:135;;;;:::o;3317:329::-;3376:6;3425:2;3413:9;3404:7;3400:23;3396:32;3393:119;;;3431:79;;:::i;:::-;3393:119;3551:1;3576:53;3621:7;3612:6;3601:9;3597:22;3576:53;:::i;:::-;3566:63;;3522:117;3317:329;;;;:::o;3652:474::-;3720:6;3728;3777:2;3765:9;3756:7;3752:23;3748:32;3745:119;;;3783:79;;:::i;:::-;3745:119;3903:1;3928:53;3973:7;3964:6;3953:9;3949:22;3928:53;:::i;:::-;3918:63;;3874:117;4030:2;4056:53;4101:7;4092:6;4081:9;4077:22;4056:53;:::i;:::-;4046:63;;4001:118;3652:474;;;;;:::o;4132:619::-;4209:6;4217;4225;4274:2;4262:9;4253:7;4249:23;4245:32;4242:119;;;4280:79;;:::i;:::-;4242:119;4400:1;4425:53;4470:7;4461:6;4450:9;4446:22;4425:53;:::i;:::-;4415:63;;4371:117;4527:2;4553:53;4598:7;4589:6;4578:9;4574:22;4553:53;:::i;:::-;4543:63;;4498:118;4655:2;4681:53;4726:7;4717:6;4706:9;4702:22;4681:53;:::i;:::-;4671:63;;4626:118;4132:619;;;;;:::o;4757:943::-;4852:6;4860;4868;4876;4925:3;4913:9;4904:7;4900:23;4896:33;4893:120;;;4932:79;;:::i;:::-;4893:120;5052:1;5077:53;5122:7;5113:6;5102:9;5098:22;5077:53;:::i;:::-;5067:63;;5023:117;5179:2;5205:53;5250:7;5241:6;5230:9;5226:22;5205:53;:::i;:::-;5195:63;;5150:118;5307:2;5333:53;5378:7;5369:6;5358:9;5354:22;5333:53;:::i;:::-;5323:63;;5278:118;5463:2;5452:9;5448:18;5435:32;5494:18;5486:6;5483:30;5480:117;;;5516:79;;:::i;:::-;5480:117;5621:62;5675:7;5666:6;5655:9;5651:22;5621:62;:::i;:::-;5611:72;;5406:287;4757:943;;;;;;;:::o;5706:468::-;5771:6;5779;5828:2;5816:9;5807:7;5803:23;5799:32;5796:119;;;5834:79;;:::i;:::-;5796:119;5954:1;5979:53;6024:7;6015:6;6004:9;6000:22;5979:53;:::i;:::-;5969:63;;5925:117;6081:2;6107:50;6149:7;6140:6;6129:9;6125:22;6107:50;:::i;:::-;6097:60;;6052:115;5706:468;;;;;:::o;6180:474::-;6248:6;6256;6305:2;6293:9;6284:7;6280:23;6276:32;6273:119;;;6311:79;;:::i;:::-;6273:119;6431:1;6456:53;6501:7;6492:6;6481:9;6477:22;6456:53;:::i;:::-;6446:63;;6402:117;6558:2;6584:53;6629:7;6620:6;6609:9;6605:22;6584:53;:::i;:::-;6574:63;;6529:118;6180:474;;;;;:::o;6660:323::-;6716:6;6765:2;6753:9;6744:7;6740:23;6736:32;6733:119;;;6771:79;;:::i;:::-;6733:119;6891:1;6916:50;6958:7;6949:6;6938:9;6934:22;6916:50;:::i;:::-;6906:60;;6862:114;6660:323;;;;:::o;6989:327::-;7047:6;7096:2;7084:9;7075:7;7071:23;7067:32;7064:119;;;7102:79;;:::i;:::-;7064:119;7222:1;7247:52;7291:7;7282:6;7271:9;7267:22;7247:52;:::i;:::-;7237:62;;7193:116;6989:327;;;;:::o;7322:349::-;7391:6;7440:2;7428:9;7419:7;7415:23;7411:32;7408:119;;;7446:79;;:::i;:::-;7408:119;7566:1;7591:63;7646:7;7637:6;7626:9;7622:22;7591:63;:::i;:::-;7581:73;;7537:127;7322:349;;;;:::o;7677:509::-;7746:6;7795:2;7783:9;7774:7;7770:23;7766:32;7763:119;;;7801:79;;:::i;:::-;7763:119;7949:1;7938:9;7934:17;7921:31;7979:18;7971:6;7968:30;7965:117;;;8001:79;;:::i;:::-;7965:117;8106:63;8161:7;8152:6;8141:9;8137:22;8106:63;:::i;:::-;8096:73;;7892:287;7677:509;;;;:::o;8192:329::-;8251:6;8300:2;8288:9;8279:7;8275:23;8271:32;8268:119;;;8306:79;;:::i;:::-;8268:119;8426:1;8451:53;8496:7;8487:6;8476:9;8472:22;8451:53;:::i;:::-;8441:63;;8397:117;8192:329;;;;:::o;8527:474::-;8595:6;8603;8652:2;8640:9;8631:7;8627:23;8623:32;8620:119;;;8658:79;;:::i;:::-;8620:119;8778:1;8803:53;8848:7;8839:6;8828:9;8824:22;8803:53;:::i;:::-;8793:63;;8749:117;8905:2;8931:53;8976:7;8967:6;8956:9;8952:22;8931:53;:::i;:::-;8921:63;;8876:118;8527:474;;;;;:::o;9007:523::-;9099:6;9107;9156:3;9144:9;9135:7;9131:23;9127:33;9124:120;;;9163:79;;:::i;:::-;9124:120;9283:1;9308:53;9353:7;9344:6;9333:9;9329:22;9308:53;:::i;:::-;9298:63;;9254:117;9410:2;9436:77;9505:7;9496:6;9485:9;9481:22;9436:77;:::i;:::-;9426:87;;9381:142;9007:523;;;;;:::o;9536:108::-;9613:24;9631:5;9613:24;:::i;:::-;9608:3;9601:37;9536:108;;:::o;9650:118::-;9737:24;9755:5;9737:24;:::i;:::-;9732:3;9725:37;9650:118;;:::o;9774:99::-;9845:21;9860:5;9845:21;:::i;:::-;9840:3;9833:34;9774:99;;:::o;9879:109::-;9960:21;9975:5;9960:21;:::i;:::-;9955:3;9948:34;9879:109;;:::o;9994:118::-;10081:24;10099:5;10081:24;:::i;:::-;10076:3;10069:37;9994:118;;:::o;10118:360::-;10204:3;10232:38;10264:5;10232:38;:::i;:::-;10286:70;10349:6;10344:3;10286:70;:::i;:::-;10279:77;;10365:52;10410:6;10405:3;10398:4;10391:5;10387:16;10365:52;:::i;:::-;10442:29;10464:6;10442:29;:::i;:::-;10437:3;10433:39;10426:46;;10208:270;10118:360;;;;:::o;10484:364::-;10572:3;10600:39;10633:5;10600:39;:::i;:::-;10655:71;10719:6;10714:3;10655:71;:::i;:::-;10648:78;;10735:52;10780:6;10775:3;10768:4;10761:5;10757:16;10735:52;:::i;:::-;10812:29;10834:6;10812:29;:::i;:::-;10807:3;10803:39;10796:46;;10576:272;10484:364;;;;:::o;10854:377::-;10960:3;10988:39;11021:5;10988:39;:::i;:::-;11043:89;11125:6;11120:3;11043:89;:::i;:::-;11036:96;;11141:52;11186:6;11181:3;11174:4;11167:5;11163:16;11141:52;:::i;:::-;11218:6;11213:3;11209:16;11202:23;;10964:267;10854:377;;;;:::o;11237:366::-;11379:3;11400:67;11464:2;11459:3;11400:67;:::i;:::-;11393:74;;11476:93;11565:3;11476:93;:::i;:::-;11594:2;11589:3;11585:12;11578:19;;11237:366;;;:::o;11609:::-;11751:3;11772:67;11836:2;11831:3;11772:67;:::i;:::-;11765:74;;11848:93;11937:3;11848:93;:::i;:::-;11966:2;11961:3;11957:12;11950:19;;11609:366;;;:::o;11981:::-;12123:3;12144:67;12208:2;12203:3;12144:67;:::i;:::-;12137:74;;12220:93;12309:3;12220:93;:::i;:::-;12338:2;12333:3;12329:12;12322:19;;11981:366;;;:::o;12353:::-;12495:3;12516:67;12580:2;12575:3;12516:67;:::i;:::-;12509:74;;12592:93;12681:3;12592:93;:::i;:::-;12710:2;12705:3;12701:12;12694:19;;12353:366;;;:::o;12725:::-;12867:3;12888:67;12952:2;12947:3;12888:67;:::i;:::-;12881:74;;12964:93;13053:3;12964:93;:::i;:::-;13082:2;13077:3;13073:12;13066:19;;12725:366;;;:::o;13097:::-;13239:3;13260:67;13324:2;13319:3;13260:67;:::i;:::-;13253:74;;13336:93;13425:3;13336:93;:::i;:::-;13454:2;13449:3;13445:12;13438:19;;13097:366;;;:::o;13469:::-;13611:3;13632:67;13696:2;13691:3;13632:67;:::i;:::-;13625:74;;13708:93;13797:3;13708:93;:::i;:::-;13826:2;13821:3;13817:12;13810:19;;13469:366;;;:::o;13841:::-;13983:3;14004:67;14068:2;14063:3;14004:67;:::i;:::-;13997:74;;14080:93;14169:3;14080:93;:::i;:::-;14198:2;14193:3;14189:12;14182:19;;13841:366;;;:::o;14213:::-;14355:3;14376:67;14440:2;14435:3;14376:67;:::i;:::-;14369:74;;14452:93;14541:3;14452:93;:::i;:::-;14570:2;14565:3;14561:12;14554:19;;14213:366;;;:::o;14585:::-;14727:3;14748:67;14812:2;14807:3;14748:67;:::i;:::-;14741:74;;14824:93;14913:3;14824:93;:::i;:::-;14942:2;14937:3;14933:12;14926:19;;14585:366;;;:::o;14957:::-;15099:3;15120:67;15184:2;15179:3;15120:67;:::i;:::-;15113:74;;15196:93;15285:3;15196:93;:::i;:::-;15314:2;15309:3;15305:12;15298:19;;14957:366;;;:::o;15329:::-;15471:3;15492:67;15556:2;15551:3;15492:67;:::i;:::-;15485:74;;15568:93;15657:3;15568:93;:::i;:::-;15686:2;15681:3;15677:12;15670:19;;15329:366;;;:::o;15701:::-;15843:3;15864:67;15928:2;15923:3;15864:67;:::i;:::-;15857:74;;15940:93;16029:3;15940:93;:::i;:::-;16058:2;16053:3;16049:12;16042:19;;15701:366;;;:::o;16073:::-;16215:3;16236:67;16300:2;16295:3;16236:67;:::i;:::-;16229:74;;16312:93;16401:3;16312:93;:::i;:::-;16430:2;16425:3;16421:12;16414:19;;16073:366;;;:::o;16445:::-;16587:3;16608:67;16672:2;16667:3;16608:67;:::i;:::-;16601:74;;16684:93;16773:3;16684:93;:::i;:::-;16802:2;16797:3;16793:12;16786:19;;16445:366;;;:::o;16817:::-;16959:3;16980:67;17044:2;17039:3;16980:67;:::i;:::-;16973:74;;17056:93;17145:3;17056:93;:::i;:::-;17174:2;17169:3;17165:12;17158:19;;16817:366;;;:::o;17189:::-;17331:3;17352:67;17416:2;17411:3;17352:67;:::i;:::-;17345:74;;17428:93;17517:3;17428:93;:::i;:::-;17546:2;17541:3;17537:12;17530:19;;17189:366;;;:::o;17561:400::-;17721:3;17742:84;17824:1;17819:3;17742:84;:::i;:::-;17735:91;;17835:93;17924:3;17835:93;:::i;:::-;17953:1;17948:3;17944:11;17937:18;;17561:400;;;:::o;17967:366::-;18109:3;18130:67;18194:2;18189:3;18130:67;:::i;:::-;18123:74;;18206:93;18295:3;18206:93;:::i;:::-;18324:2;18319:3;18315:12;18308:19;;17967:366;;;:::o;18339:::-;18481:3;18502:67;18566:2;18561:3;18502:67;:::i;:::-;18495:74;;18578:93;18667:3;18578:93;:::i;:::-;18696:2;18691:3;18687:12;18680:19;;18339:366;;;:::o;18711:::-;18853:3;18874:67;18938:2;18933:3;18874:67;:::i;:::-;18867:74;;18950:93;19039:3;18950:93;:::i;:::-;19068:2;19063:3;19059:12;19052:19;;18711:366;;;:::o;19083:::-;19225:3;19246:67;19310:2;19305:3;19246:67;:::i;:::-;19239:74;;19322:93;19411:3;19322:93;:::i;:::-;19440:2;19435:3;19431:12;19424:19;;19083:366;;;:::o;19455:::-;19597:3;19618:67;19682:2;19677:3;19618:67;:::i;:::-;19611:74;;19694:93;19783:3;19694:93;:::i;:::-;19812:2;19807:3;19803:12;19796:19;;19455:366;;;:::o;19827:::-;19969:3;19990:67;20054:2;20049:3;19990:67;:::i;:::-;19983:74;;20066:93;20155:3;20066:93;:::i;:::-;20184:2;20179:3;20175:12;20168:19;;19827:366;;;:::o;20199:398::-;20358:3;20379:83;20460:1;20455:3;20379:83;:::i;:::-;20372:90;;20471:93;20560:3;20471:93;:::i;:::-;20589:1;20584:3;20580:11;20573:18;;20199:398;;;:::o;20603:366::-;20745:3;20766:67;20830:2;20825:3;20766:67;:::i;:::-;20759:74;;20842:93;20931:3;20842:93;:::i;:::-;20960:2;20955:3;20951:12;20944:19;;20603:366;;;:::o;20975:::-;21117:3;21138:67;21202:2;21197:3;21138:67;:::i;:::-;21131:74;;21214:93;21303:3;21214:93;:::i;:::-;21332:2;21327:3;21323:12;21316:19;;20975:366;;;:::o;21347:::-;21489:3;21510:67;21574:2;21569:3;21510:67;:::i;:::-;21503:74;;21586:93;21675:3;21586:93;:::i;:::-;21704:2;21699:3;21695:12;21688:19;;21347:366;;;:::o;21719:::-;21861:3;21882:67;21946:2;21941:3;21882:67;:::i;:::-;21875:74;;21958:93;22047:3;21958:93;:::i;:::-;22076:2;22071:3;22067:12;22060:19;;21719:366;;;:::o;22091:::-;22233:3;22254:67;22318:2;22313:3;22254:67;:::i;:::-;22247:74;;22330:93;22419:3;22330:93;:::i;:::-;22448:2;22443:3;22439:12;22432:19;;22091:366;;;:::o;22463:::-;22605:3;22626:67;22690:2;22685:3;22626:67;:::i;:::-;22619:74;;22702:93;22791:3;22702:93;:::i;:::-;22820:2;22815:3;22811:12;22804:19;;22463:366;;;:::o;22835:::-;22977:3;22998:67;23062:2;23057:3;22998:67;:::i;:::-;22991:74;;23074:93;23163:3;23074:93;:::i;:::-;23192:2;23187:3;23183:12;23176:19;;22835:366;;;:::o;23207:::-;23349:3;23370:67;23434:2;23429:3;23370:67;:::i;:::-;23363:74;;23446:93;23535:3;23446:93;:::i;:::-;23564:2;23559:3;23555:12;23548:19;;23207:366;;;:::o;23623:1027::-;23766:4;23761:3;23757:14;23851:4;23844:5;23840:16;23834:23;23870:63;23927:4;23922:3;23918:14;23904:12;23870:63;:::i;:::-;23781:162;24027:4;24020:5;24016:16;24010:23;24046:63;24103:4;24098:3;24094:14;24080:12;24046:63;:::i;:::-;23953:166;24203:4;24196:5;24192:16;24186:23;24222:63;24279:4;24274:3;24270:14;24256:12;24222:63;:::i;:::-;24129:166;24379:4;24372:5;24368:16;24362:23;24398:63;24455:4;24450:3;24446:14;24432:12;24398:63;:::i;:::-;24305:166;24557:4;24550:5;24546:16;24540:23;24576:57;24627:4;24622:3;24618:14;24604:12;24576:57;:::i;:::-;24481:162;23735:915;23623:1027;;:::o;24656:108::-;24733:24;24751:5;24733:24;:::i;:::-;24728:3;24721:37;24656:108;;:::o;24770:118::-;24857:24;24875:5;24857:24;:::i;:::-;24852:3;24845:37;24770:118;;:::o;24894:112::-;24977:22;24993:5;24977:22;:::i;:::-;24972:3;24965:35;24894:112;;:::o;25012:701::-;25293:3;25315:95;25406:3;25397:6;25315:95;:::i;:::-;25308:102;;25427:95;25518:3;25509:6;25427:95;:::i;:::-;25420:102;;25539:148;25683:3;25539:148;:::i;:::-;25532:155;;25704:3;25697:10;;25012:701;;;;;:::o;25719:379::-;25903:3;25925:147;26068:3;25925:147;:::i;:::-;25918:154;;26089:3;26082:10;;25719:379;;;:::o;26104:222::-;26197:4;26235:2;26224:9;26220:18;26212:26;;26248:71;26316:1;26305:9;26301:17;26292:6;26248:71;:::i;:::-;26104:222;;;;:::o;26332:640::-;26527:4;26565:3;26554:9;26550:19;26542:27;;26579:71;26647:1;26636:9;26632:17;26623:6;26579:71;:::i;:::-;26660:72;26728:2;26717:9;26713:18;26704:6;26660:72;:::i;:::-;26742;26810:2;26799:9;26795:18;26786:6;26742:72;:::i;:::-;26861:9;26855:4;26851:20;26846:2;26835:9;26831:18;26824:48;26889:76;26960:4;26951:6;26889:76;:::i;:::-;26881:84;;26332:640;;;;;;;:::o;26978:210::-;27065:4;27103:2;27092:9;27088:18;27080:26;;27116:65;27178:1;27167:9;27163:17;27154:6;27116:65;:::i;:::-;26978:210;;;;:::o;27194:545::-;27367:4;27405:3;27394:9;27390:19;27382:27;;27419:71;27487:1;27476:9;27472:17;27463:6;27419:71;:::i;:::-;27500:68;27564:2;27553:9;27549:18;27540:6;27500:68;:::i;:::-;27578:72;27646:2;27635:9;27631:18;27622:6;27578:72;:::i;:::-;27660;27728:2;27717:9;27713:18;27704:6;27660:72;:::i;:::-;27194:545;;;;;;;:::o;27745:313::-;27858:4;27896:2;27885:9;27881:18;27873:26;;27945:9;27939:4;27935:20;27931:1;27920:9;27916:17;27909:47;27973:78;28046:4;28037:6;27973:78;:::i;:::-;27965:86;;27745:313;;;;:::o;28064:419::-;28230:4;28268:2;28257:9;28253:18;28245:26;;28317:9;28311:4;28307:20;28303:1;28292:9;28288:17;28281:47;28345:131;28471:4;28345:131;:::i;:::-;28337:139;;28064:419;;;:::o;28489:::-;28655:4;28693:2;28682:9;28678:18;28670:26;;28742:9;28736:4;28732:20;28728:1;28717:9;28713:17;28706:47;28770:131;28896:4;28770:131;:::i;:::-;28762:139;;28489:419;;;:::o;28914:::-;29080:4;29118:2;29107:9;29103:18;29095:26;;29167:9;29161:4;29157:20;29153:1;29142:9;29138:17;29131:47;29195:131;29321:4;29195:131;:::i;:::-;29187:139;;28914:419;;;:::o;29339:::-;29505:4;29543:2;29532:9;29528:18;29520:26;;29592:9;29586:4;29582:20;29578:1;29567:9;29563:17;29556:47;29620:131;29746:4;29620:131;:::i;:::-;29612:139;;29339:419;;;:::o;29764:::-;29930:4;29968:2;29957:9;29953:18;29945:26;;30017:9;30011:4;30007:20;30003:1;29992:9;29988:17;29981:47;30045:131;30171:4;30045:131;:::i;:::-;30037:139;;29764:419;;;:::o;30189:::-;30355:4;30393:2;30382:9;30378:18;30370:26;;30442:9;30436:4;30432:20;30428:1;30417:9;30413:17;30406:47;30470:131;30596:4;30470:131;:::i;:::-;30462:139;;30189:419;;;:::o;30614:::-;30780:4;30818:2;30807:9;30803:18;30795:26;;30867:9;30861:4;30857:20;30853:1;30842:9;30838:17;30831:47;30895:131;31021:4;30895:131;:::i;:::-;30887:139;;30614:419;;;:::o;31039:::-;31205:4;31243:2;31232:9;31228:18;31220:26;;31292:9;31286:4;31282:20;31278:1;31267:9;31263:17;31256:47;31320:131;31446:4;31320:131;:::i;:::-;31312:139;;31039:419;;;:::o;31464:::-;31630:4;31668:2;31657:9;31653:18;31645:26;;31717:9;31711:4;31707:20;31703:1;31692:9;31688:17;31681:47;31745:131;31871:4;31745:131;:::i;:::-;31737:139;;31464:419;;;:::o;31889:::-;32055:4;32093:2;32082:9;32078:18;32070:26;;32142:9;32136:4;32132:20;32128:1;32117:9;32113:17;32106:47;32170:131;32296:4;32170:131;:::i;:::-;32162:139;;31889:419;;;:::o;32314:::-;32480:4;32518:2;32507:9;32503:18;32495:26;;32567:9;32561:4;32557:20;32553:1;32542:9;32538:17;32531:47;32595:131;32721:4;32595:131;:::i;:::-;32587:139;;32314:419;;;:::o;32739:::-;32905:4;32943:2;32932:9;32928:18;32920:26;;32992:9;32986:4;32982:20;32978:1;32967:9;32963:17;32956:47;33020:131;33146:4;33020:131;:::i;:::-;33012:139;;32739:419;;;:::o;33164:::-;33330:4;33368:2;33357:9;33353:18;33345:26;;33417:9;33411:4;33407:20;33403:1;33392:9;33388:17;33381:47;33445:131;33571:4;33445:131;:::i;:::-;33437:139;;33164:419;;;:::o;33589:::-;33755:4;33793:2;33782:9;33778:18;33770:26;;33842:9;33836:4;33832:20;33828:1;33817:9;33813:17;33806:47;33870:131;33996:4;33870:131;:::i;:::-;33862:139;;33589:419;;;:::o;34014:::-;34180:4;34218:2;34207:9;34203:18;34195:26;;34267:9;34261:4;34257:20;34253:1;34242:9;34238:17;34231:47;34295:131;34421:4;34295:131;:::i;:::-;34287:139;;34014:419;;;:::o;34439:::-;34605:4;34643:2;34632:9;34628:18;34620:26;;34692:9;34686:4;34682:20;34678:1;34667:9;34663:17;34656:47;34720:131;34846:4;34720:131;:::i;:::-;34712:139;;34439:419;;;:::o;34864:::-;35030:4;35068:2;35057:9;35053:18;35045:26;;35117:9;35111:4;35107:20;35103:1;35092:9;35088:17;35081:47;35145:131;35271:4;35145:131;:::i;:::-;35137:139;;34864:419;;;:::o;35289:::-;35455:4;35493:2;35482:9;35478:18;35470:26;;35542:9;35536:4;35532:20;35528:1;35517:9;35513:17;35506:47;35570:131;35696:4;35570:131;:::i;:::-;35562:139;;35289:419;;;:::o;35714:::-;35880:4;35918:2;35907:9;35903:18;35895:26;;35967:9;35961:4;35957:20;35953:1;35942:9;35938:17;35931:47;35995:131;36121:4;35995:131;:::i;:::-;35987:139;;35714:419;;;:::o;36139:::-;36305:4;36343:2;36332:9;36328:18;36320:26;;36392:9;36386:4;36382:20;36378:1;36367:9;36363:17;36356:47;36420:131;36546:4;36420:131;:::i;:::-;36412:139;;36139:419;;;:::o;36564:::-;36730:4;36768:2;36757:9;36753:18;36745:26;;36817:9;36811:4;36807:20;36803:1;36792:9;36788:17;36781:47;36845:131;36971:4;36845:131;:::i;:::-;36837:139;;36564:419;;;:::o;36989:::-;37155:4;37193:2;37182:9;37178:18;37170:26;;37242:9;37236:4;37232:20;37228:1;37217:9;37213:17;37206:47;37270:131;37396:4;37270:131;:::i;:::-;37262:139;;36989:419;;;:::o;37414:::-;37580:4;37618:2;37607:9;37603:18;37595:26;;37667:9;37661:4;37657:20;37653:1;37642:9;37638:17;37631:47;37695:131;37821:4;37695:131;:::i;:::-;37687:139;;37414:419;;;:::o;37839:::-;38005:4;38043:2;38032:9;38028:18;38020:26;;38092:9;38086:4;38082:20;38078:1;38067:9;38063:17;38056:47;38120:131;38246:4;38120:131;:::i;:::-;38112:139;;37839:419;;;:::o;38264:::-;38430:4;38468:2;38457:9;38453:18;38445:26;;38517:9;38511:4;38507:20;38503:1;38492:9;38488:17;38481:47;38545:131;38671:4;38545:131;:::i;:::-;38537:139;;38264:419;;;:::o;38689:::-;38855:4;38893:2;38882:9;38878:18;38870:26;;38942:9;38936:4;38932:20;38928:1;38917:9;38913:17;38906:47;38970:131;39096:4;38970:131;:::i;:::-;38962:139;;38689:419;;;:::o;39114:::-;39280:4;39318:2;39307:9;39303:18;39295:26;;39367:9;39361:4;39357:20;39353:1;39342:9;39338:17;39331:47;39395:131;39521:4;39395:131;:::i;:::-;39387:139;;39114:419;;;:::o;39539:::-;39705:4;39743:2;39732:9;39728:18;39720:26;;39792:9;39786:4;39782:20;39778:1;39767:9;39763:17;39756:47;39820:131;39946:4;39820:131;:::i;:::-;39812:139;;39539:419;;;:::o;39964:::-;40130:4;40168:2;40157:9;40153:18;40145:26;;40217:9;40211:4;40207:20;40203:1;40192:9;40188:17;40181:47;40245:131;40371:4;40245:131;:::i;:::-;40237:139;;39964:419;;;:::o;40389:::-;40555:4;40593:2;40582:9;40578:18;40570:26;;40642:9;40636:4;40632:20;40628:1;40617:9;40613:17;40606:47;40670:131;40796:4;40670:131;:::i;:::-;40662:139;;40389:419;;;:::o;40814:::-;40980:4;41018:2;41007:9;41003:18;40995:26;;41067:9;41061:4;41057:20;41053:1;41042:9;41038:17;41031:47;41095:131;41221:4;41095:131;:::i;:::-;41087:139;;40814:419;;;:::o;41239:315::-;41378:4;41416:3;41405:9;41401:19;41393:27;;41430:117;41544:1;41533:9;41529:17;41520:6;41430:117;:::i;:::-;41239:315;;;;:::o;41560:222::-;41653:4;41691:2;41680:9;41676:18;41668:26;;41704:71;41772:1;41761:9;41757:17;41748:6;41704:71;:::i;:::-;41560:222;;;;:::o;41788:332::-;41909:4;41947:2;41936:9;41932:18;41924:26;;41960:71;42028:1;42017:9;42013:17;42004:6;41960:71;:::i;:::-;42041:72;42109:2;42098:9;42094:18;42085:6;42041:72;:::i;:::-;41788:332;;;;;:::o;42126:129::-;42160:6;42187:20;;:::i;:::-;42177:30;;42216:33;42244:4;42236:6;42216:33;:::i;:::-;42126:129;;;:::o;42261:75::-;42294:6;42327:2;42321:9;42311:19;;42261:75;:::o;42342:307::-;42403:4;42493:18;42485:6;42482:30;42479:56;;;42515:18;;:::i;:::-;42479:56;42553:29;42575:6;42553:29;:::i;:::-;42545:37;;42637:4;42631;42627:15;42619:23;;42342:307;;;:::o;42655:308::-;42717:4;42807:18;42799:6;42796:30;42793:56;;;42829:18;;:::i;:::-;42793:56;42867:29;42889:6;42867:29;:::i;:::-;42859:37;;42951:4;42945;42941:15;42933:23;;42655:308;;;:::o;42969:98::-;43020:6;43054:5;43048:12;43038:22;;42969:98;;;:::o;43073:99::-;43125:6;43159:5;43153:12;43143:22;;43073:99;;;:::o;43178:168::-;43261:11;43295:6;43290:3;43283:19;43335:4;43330:3;43326:14;43311:29;;43178:168;;;;:::o;43352:147::-;43453:11;43490:3;43475:18;;43352:147;;;;:::o;43505:169::-;43589:11;43623:6;43618:3;43611:19;43663:4;43658:3;43654:14;43639:29;;43505:169;;;;:::o;43680:148::-;43782:11;43819:3;43804:18;;43680:148;;;;:::o;43834:305::-;43874:3;43893:20;43911:1;43893:20;:::i;:::-;43888:25;;43927:20;43945:1;43927:20;:::i;:::-;43922:25;;44081:1;44013:66;44009:74;44006:1;44003:81;44000:107;;;44087:18;;:::i;:::-;44000:107;44131:1;44128;44124:9;44117:16;;43834:305;;;;:::o;44145:185::-;44185:1;44202:20;44220:1;44202:20;:::i;:::-;44197:25;;44236:20;44254:1;44236:20;:::i;:::-;44231:25;;44275:1;44265:35;;44280:18;;:::i;:::-;44265:35;44322:1;44319;44315:9;44310:14;;44145:185;;;;:::o;44336:191::-;44376:4;44396:20;44414:1;44396:20;:::i;:::-;44391:25;;44430:20;44448:1;44430:20;:::i;:::-;44425:25;;44469:1;44466;44463:8;44460:34;;;44474:18;;:::i;:::-;44460:34;44519:1;44516;44512:9;44504:17;;44336:191;;;;:::o;44533:96::-;44570:7;44599:24;44617:5;44599:24;:::i;:::-;44588:35;;44533:96;;;:::o;44635:90::-;44669:7;44712:5;44705:13;44698:21;44687:32;;44635:90;;;:::o;44731:77::-;44768:7;44797:5;44786:16;;44731:77;;;:::o;44814:149::-;44850:7;44890:66;44883:5;44879:78;44868:89;;44814:149;;;:::o;44969:126::-;45006:7;45046:42;45039:5;45035:54;45024:65;;44969:126;;;:::o;45101:77::-;45138:7;45167:5;45156:16;;45101:77;;;:::o;45184:86::-;45219:7;45259:4;45252:5;45248:16;45237:27;;45184:86;;;:::o;45276:154::-;45360:6;45355:3;45350;45337:30;45422:1;45413:6;45408:3;45404:16;45397:27;45276:154;;;:::o;45436:307::-;45504:1;45514:113;45528:6;45525:1;45522:13;45514:113;;;45613:1;45608:3;45604:11;45598:18;45594:1;45589:3;45585:11;45578:39;45550:2;45547:1;45543:10;45538:15;;45514:113;;;45645:6;45642:1;45639:13;45636:101;;;45725:1;45716:6;45711:3;45707:16;45700:27;45636:101;45485:258;45436:307;;;:::o;45749:320::-;45793:6;45830:1;45824:4;45820:12;45810:22;;45877:1;45871:4;45867:12;45898:18;45888:81;;45954:4;45946:6;45942:17;45932:27;;45888:81;46016:2;46008:6;46005:14;45985:18;45982:38;45979:84;;;46035:18;;:::i;:::-;45979:84;45800:269;45749:320;;;:::o;46075:281::-;46158:27;46180:4;46158:27;:::i;:::-;46150:6;46146:40;46288:6;46276:10;46273:22;46252:18;46240:10;46237:34;46234:62;46231:88;;;46299:18;;:::i;:::-;46231:88;46339:10;46335:2;46328:22;46118:238;46075:281;;:::o;46362:233::-;46401:3;46424:24;46442:5;46424:24;:::i;:::-;46415:33;;46470:66;46463:5;46460:77;46457:103;;;46540:18;;:::i;:::-;46457:103;46587:1;46580:5;46576:13;46569:20;;46362:233;;;:::o;46601:176::-;46633:1;46650:20;46668:1;46650:20;:::i;:::-;46645:25;;46684:20;46702:1;46684:20;:::i;:::-;46679:25;;46723:1;46713:35;;46728:18;;:::i;:::-;46713:35;46769:1;46766;46762:9;46757:14;;46601:176;;;;:::o;46783:180::-;46831:77;46828:1;46821:88;46928:4;46925:1;46918:15;46952:4;46949:1;46942:15;46969:180;47017:77;47014:1;47007:88;47114:4;47111:1;47104:15;47138:4;47135:1;47128:15;47155:180;47203:77;47200:1;47193:88;47300:4;47297:1;47290:15;47324:4;47321:1;47314:15;47341:180;47389:77;47386:1;47379:88;47486:4;47483:1;47476:15;47510:4;47507:1;47500:15;47527:180;47575:77;47572:1;47565:88;47672:4;47669:1;47662:15;47696:4;47693:1;47686:15;47713:117;47822:1;47819;47812:12;47836:117;47945:1;47942;47935:12;48082:117;48191:1;48188;48181:12;48205:117;48314:1;48311;48304:12;48328:117;48437:1;48434;48427:12;48451:102;48492:6;48543:2;48539:7;48534:2;48527:5;48523:14;48519:28;48509:38;;48451:102;;;:::o;48559:174::-;48699:26;48695:1;48687:6;48683:14;48676:50;48559:174;:::o;48739:221::-;48879:34;48875:1;48867:6;48863:14;48856:58;48948:4;48943:2;48935:6;48931:15;48924:29;48739:221;:::o;48966:225::-;49106:34;49102:1;49094:6;49090:14;49083:58;49175:8;49170:2;49162:6;49158:15;49151:33;48966:225;:::o;49197:229::-;49337:34;49333:1;49325:6;49321:14;49314:58;49406:12;49401:2;49393:6;49389:15;49382:37;49197:229;:::o;49432:164::-;49572:16;49568:1;49560:6;49556:14;49549:40;49432:164;:::o;49602:223::-;49742:34;49738:1;49730:6;49726:14;49719:58;49811:6;49806:2;49798:6;49794:15;49787:31;49602:223;:::o;49831:222::-;49971:34;49967:1;49959:6;49955:14;49948:58;50040:5;50035:2;50027:6;50023:15;50016:30;49831:222;:::o;50059:224::-;50199:34;50195:1;50187:6;50183:14;50176:58;50268:7;50263:2;50255:6;50251:15;50244:32;50059:224;:::o;50289:165::-;50429:17;50425:1;50417:6;50413:14;50406:41;50289:165;:::o;50460:172::-;50600:24;50596:1;50588:6;50584:14;50577:48;50460:172;:::o;50638:176::-;50778:28;50774:1;50766:6;50762:14;50755:52;50638:176;:::o;50820:244::-;50960:34;50956:1;50948:6;50944:14;50937:58;51029:27;51024:2;51016:6;51012:15;51005:52;50820:244;:::o;51070:230::-;51210:34;51206:1;51198:6;51194:14;51187:58;51279:13;51274:2;51266:6;51262:15;51255:38;51070:230;:::o;51306:168::-;51446:20;51442:1;51434:6;51430:14;51423:44;51306:168;:::o;51480:::-;51620:20;51616:1;51608:6;51604:14;51597:44;51480:168;:::o;51654:174::-;51794:26;51790:1;51782:6;51778:14;51771:50;51654:174;:::o;51834:225::-;51974:34;51970:1;51962:6;51958:14;51951:58;52043:8;52038:2;52030:6;52026:15;52019:33;51834:225;:::o;52065:155::-;52205:7;52201:1;52193:6;52189:14;52182:31;52065:155;:::o;52226:182::-;52366:34;52362:1;52354:6;52350:14;52343:58;52226:182;:::o;52414:234::-;52554:34;52550:1;52542:6;52538:14;52531:58;52623:17;52618:2;52610:6;52606:15;52599:42;52414:234;:::o;52654:176::-;52794:28;52790:1;52782:6;52778:14;52771:52;52654:176;:::o;52836:237::-;52976:34;52972:1;52964:6;52960:14;52953:58;53045:20;53040:2;53032:6;53028:15;53021:45;52836:237;:::o;53079:168::-;53219:20;53215:1;53207:6;53203:14;53196:44;53079:168;:::o;53253:221::-;53393:34;53389:1;53381:6;53377:14;53370:58;53462:4;53457:2;53449:6;53445:15;53438:29;53253:221;:::o;53480:114::-;;:::o;53600:238::-;53740:34;53736:1;53728:6;53724:14;53717:58;53809:21;53804:2;53796:6;53792:15;53785:46;53600:238;:::o;53844:220::-;53984:34;53980:1;53972:6;53968:14;53961:58;54053:3;54048:2;54040:6;54036:15;54029:28;53844:220;:::o;54070:171::-;54210:23;54206:1;54198:6;54194:14;54187:47;54070:171;:::o;54247:227::-;54387:34;54383:1;54375:6;54371:14;54364:58;54456:10;54451:2;54443:6;54439:15;54432:35;54247:227;:::o;54480:233::-;54620:34;54616:1;54608:6;54604:14;54597:58;54689:16;54684:2;54676:6;54672:15;54665:41;54480:233;:::o;54719:181::-;54859:33;54855:1;54847:6;54843:14;54836:57;54719:181;:::o;54906:234::-;55046:34;55042:1;55034:6;55030:14;55023:58;55115:17;55110:2;55102:6;55098:15;55091:42;54906:234;:::o;55146:232::-;55286:34;55282:1;55274:6;55270:14;55263:58;55355:15;55350:2;55342:6;55338:15;55331:40;55146:232;:::o;55384:122::-;55457:24;55475:5;55457:24;:::i;:::-;55450:5;55447:35;55437:63;;55496:1;55493;55486:12;55437:63;55384:122;:::o;55512:116::-;55582:21;55597:5;55582:21;:::i;:::-;55575:5;55572:32;55562:60;;55618:1;55615;55608:12;55562:60;55512:116;:::o;55634:122::-;55707:24;55725:5;55707:24;:::i;:::-;55700:5;55697:35;55687:63;;55746:1;55743;55736:12;55687:63;55634:122;:::o;55762:120::-;55834:23;55851:5;55834:23;:::i;:::-;55827:5;55824:34;55814:62;;55872:1;55869;55862:12;55814:62;55762:120;:::o;55888:122::-;55961:24;55979:5;55961:24;:::i;:::-;55954:5;55951:35;55941:63;;56000:1;55997;55990:12;55941:63;55888:122;:::o;56016:118::-;56087:22;56103:5;56087:22;:::i;:::-;56080:5;56077:33;56067:61;;56124:1;56121;56114:12;56067:61;56016:118;:::o

Swarm Source

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