ETH Price: $2,937.89 (+4.18%)
 

Overview

Max Total Supply

890 PFC

Holders

597

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 PFC
0xc51b0647fa1a815799b128b7901e93b2b6c9982e
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:
ParrotsNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-12
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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


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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev 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 {
        _transferOwnership(address(0));
    }

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/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);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // 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: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: @openzeppelin/contracts/finance/PaymentSplitter.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 PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(IERC20 indexed token, 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;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @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 total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @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 amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account) public view returns (uint256) {
        return _erc20Released[token][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 Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

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

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

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, 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: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, 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: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        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 virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

        _balances[to] += 1;
        _owners[tokenId] = to;

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

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

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

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: contracts/ParrotsNFT.sol



pragma solidity ^0.8.0;





pragma solidity ^0.8.0;

contract ParrotsNFT is Ownable, ERC721, PaymentSplitter {

    using Strings for uint256;

    using Counters for Counters.Counter;
    Counters.Counter private supply;

    string private baseURI = "";
    string public baseExtension = ".json";
    uint256 public preSaleCost = 0.12 ether;
    uint256 public cost = 0.15 ether;
    uint16 public maxSupply = 5555;
    uint8 public maxMintAmountFreemint = 150;
    uint16 public maxMintAmountPresale = 250;
    uint16 public maxMintAmount = 5555;
    uint8 public nftPerAddressLimit = 3;
    bool public preSaleState = false;
    bool public publicSaleState = false;
    mapping(address => bool) public whitelistedAddresses;
    mapping(address => bool) public freemintAddresses;
    mapping(address => uint256) public balances;
    uint256[] private _teamShares = [19, 15, 15, 15, 15, 9, 6, 3, 1, 1, 1];
    address[] private _team = [
        0x69b59DF9e946a67056c34D15392d5356cf8B1d09,
        0x8367E283CC671a823E7918230240ff49307709c8,
        0x0dB5583d46fe7c4127C59A3A8e913f413A310053,
        0x71510C98974778961dd80425d6b384763a8141BB,
        0x239F9BdD1859D46eD2e0B11BC5FDAaaE5C26fAC5,
        0xd26ED430d45c87d844359b367302C895C96929f1,
        0x3C73AF9F2Adf8CD99169d69C68Eb3542e8877B57,
        0x8302C108798A2856eCfb8eF32ed174CC396f1039,
        0x933F384a22e57870303669C452192D0ecb293afc,
        0x5F887298a09BfA7Cd9E588f17bf9A6eBb85e12bd,
        0x4d7cF77Db9Ac4A4E681eca2766Ca27168bDf5ce9
    ];

    address[] private _freemint = [
        0x6856c4185242B75baAA0460a28B1AaE3f7Cbd1ff,
        0x4bFfFe2c5785dD8938A8bEe1e28ce1Ab22Efb811,
        0xBA2a47e7dF7A1E327d90327d1C944dB2d016fceF,
        0x1e4c6b29CAd7F218cBd8493a84588850D06D9B8C,
        0x1B7bbf042fBDFaE039e62e6758D3e281AF9d4120,
        0x710b35F5D18f05BcB4356F13070b45309842E49c,
        0x9D4F0BA16699eB345B564800d6F97c72fB44C6a0,
        0xD4d14F60d0E99E7a69683CdD8da9255Bb3d792Cf,
        0x31524Ce745E00a945f192076a2DB282fa3b41050,
        0x69b59DF9e946a67056c34D15392d5356cf8B1d09,
        0x2906C780E7a6F098D1569Da398c71DD1769CCDdA,
        0xF71c62934A6927eeEeC0fbf7E72167e4336C5616,
        0x7A195e1D1d09e9A3bfB3e3bE4e2D3B1462f7c6c8,
        0x48336131b2D83C606E7fD38fADe515c3dCfF469B,
        0x64519f5f85e8dA14c6aAdFc45521a5c0d183dd40,
        0xeA85C23e6e6632f87236C369c06Da876225cE213,
        0xA9AA2CCC9dFc392d9F63f1E7C093C065dd0E8326,
        0x6C87651e920C3482912d35FefE410E266C311e8B,
        0xC873C17DC72df930d5E6A79854Aef1FB028Ee4a1,
        0x931ad0C26ed6e55775918D8319D17022732D5eD0,
        0xae1c7cfD49DF5e74ebC4C5aeF72bD29A388E5F9c,
        0xBddeF6A10475918434E8Dc4530D7BfEdfB9C4B76,
        0x5ad876757E6D7Ea79B84B4c3d4Cc3d8882C091dB,
        0x09931a7D5AD71c89F04bd25297fd33892318D70b,
        0xb700Bc75930662c78bFd6f4E11CfE428eA2fAf17,
        0x0bF91b43047Ed6B14464EE4D6732391A9dbe7be8,
        0x6766dD8174720D28f7Cd71Ce42fF3bFc363892f4,
        0x5Eb281686277dE80Ef8156a3965f6Be79aC8c51d,
        0xe6Ae3EecE57E315Ee5CA2B81fF059C4Ea8A6CCe2,
        0x60c727D4447849D5611c4fd08f024E00ee7F8Ebf,
        0xA7251941f230Cf552F0C972123a89108537E3Da5,
        0x279793Ca6773DB3cf073D3931150cA1b3bAe542D,
        0xb5B20e842839cfbE543c3811ae91fB089A110E78,
        0x29AEfCB1690745b8f80163f7f56100C4D2Dc6783,
        0xf7147ba5865A58f87859072436d63f1C758E0064,
        0x042C617d92366B0900A9cFBf6757ecfE69945Fa0,
        0x3b2deb1FB5AB574f1ca121FA520860ddAA11d736,
        0xE521959C73d3680A321D271F98bBAa57DC1af411,
        0x7E34c4564EdB5477f07eCCe29b4A1329441a63b5,
        0x5feFDb8E576BDA70f63E8e8EdaAc7426C67C6B5a,
        0x96a38bA834f116CbC67E7473CbBdECEAdbBf813a,
        0xe900Fbe2F280e608774Aeb5A28031960e420ED77,
        0x4EC913743a90b7B9Cf36d2907F0b12b3E36bb8bF,
        0xD8f47B07648F43cbCac55bb0BddBC46605290077,
        0xcACfB66c905BBE26518bEb93710bD4eb3f1D43e8,
        0x82DBa121A74a4Ce1aac6afB88622BB87937FF6Db,
        0xe2f81a3E16af0115665660153f24DD7C6C97064B,
        0x417C2408475318d6253AC8BfB8d495259c3D9b1d,
        0x4245c65e9b5F1Fc16A76Ca6C31c0d34C736dc4d9,
        0xc7349d553951D82Bcb3C9864B8CDb60729e5eaf6,
        0xC3E81f8f2104fB6cA80f81f7fD8AD804E513a604,
        0x42B6Bf95c9Baa73c82504a965a8714Df90DDFDf9,
        0x2DD5f56Db86A9eE0aE5c564A0c99e38DDeB23cd6,
        0x934c3b2ddA3EB34Dc624316DA52A72e022622f8e,
        0x37F9bC8FFBB43C4A30a939c7Be94A9eeB266B6DC,
        0x08519937699B3fA307d981125479043DA2D48bb2,
        0x5f4101f13c232b5bD65bED11842186C1A7203924,
        0xB6443a75c2a7E95Bf64DCfCa24D7dd431036c4e3,
        0x96A939F94383f3f7028EAe3A9AB94F66d3d7541C,
        0xbdE95Edb2305f9270A5e3bb778EAe03d14b68CCa,
        0xD378Ca5fffAa6701c2aE9a71120D702cc303c7E5,
        0x0d4Bb1849E8D669F170515887A7C143DD3F33310,
        0x6a565970C37ec3d9A6b7169bE0e419e91d173c8F,
        0xC428141B2eeCB2c901e2208b61E87D664473154a,
        0x2FbAaEEB80D2bCc8B2e36D6CaD8e31921337ED50,
        0xe08e347676C52C8818b76e46D71956b84B4e2F42,
        0x27F76D1361A76531f95D9b38DA8Cf9463056B8ce,
        0xE47D699fF0D480dC953069FBC023757dE70052F9,
        0xf3058AB3e0fBd58853B7e14eAB9041Ee849e7a61,
        0x235461b7cB87CBa28a91F5E2feF3CCEd0e2C8213,
        0xbD6fF0686654dfd73763292Cd7BEa075aF62D373,
        0x0f04fE8682e84dD0aB01e04728B00F65D6e994f8,
        0x0e8D6f2d576462bEe696D9B4cD759943518a4a86,
        0x74C3a7320c24af6833F685e8f424051a6c6c6A70,
        0x888FAfab68b701400289EF5A7496488af5C3A0e7,
        0x25A0Ef64bdE79eC315013B0971765EBa7f4b5C38,
        0xA7ba82817614e6d45Be6d3C0adB0F282Cc58654B,
        0x3D88B72b75e05Dcf6fD3FdB29C986887EC7BBe23,
        0x9D57E8FC7198a9afe31f7Cbffd350fd7a6ae6928,
        0xA055A40E9a298F7F073E8D50A1874ECD6dC17876,
        0xA65Bea89ac1aBaC7A135aeB477833f8054b9aC2b,
        0xD1dfA3c5794C4cE2E0AF0bf400C6FCd59E63c18D,
        0x1Bb44f56BC21226F9e7142e26Edfac41D2209B56,
        0x971D16aa905E02FA4FD305030F4a68aB940F870c,
        0xDb58e63662d4985e47b82Fc66482362C9b615495,
        0x6974535d3408a989d9D6f7a6ec62A50767715a2E,
        0x8642214d3cb4Eb38EE618Be37f78DD74a3093869,
        0xED8c6b13e9e8e9937923c9197946FBF743DA9652,
        0x3253BBBAcB15cC5994f2fcb04e323337060B4486,
        0xbC0C5acb5a65CA9deD3BdD2B0F0F36F71cD7Dd7C,
        0x850081ce7386e6163E3f1bdcCA75d5CFE00aD0c9,
        0x979E98f34d082CBeee90C7eF8C1dF5942d4f4A33,
        0x9342B1556AbDEB2a11580C3dbe0F6C4b73908034,
        0x97B9F5264Ab6350ff5D0f721510B6De061e9B8Fc,
        0x74A84160255ca66fE8689c1C9C286506Bf40Dd86,
        0xd3532Ee9a985635f505106df24ed961925995C17,
        0x9493dfe3588f3eBCD30E5129224d186320a44E80,
        0xd88948b7a22E239492a56790F9c1c1418Ab56235,
        0x8277c5a6c1dEe6B59B34Cf184c751f47348462Dd,
        0xbBeb83FFa7b1Cd7C4FB1542B0C41102891846feE,
        0xeFD785f5B4a08C2997E97976E313988d9f5bcD23,
        0xD2179324C4f053A4ce0Ef8dB264b51DC0ae36F28,
        0xF1a47b921c8af2dF1aF1938d4AE971f9f30A53D1,
        0x7766004e6D3FcbB85E0E926055435192D3efD32a,
        0x8C8A4e818184F701A32561d6Ccfff05DBE931D1a,
        0xD5e4fCeac7a6d3E815e93300e6a98232E99F1d16,
        0xD09bED30d34B679B2ae788827405e093E4CDB79f,
        0x8A2947e6c510Dc460837D064DB39e2f8cb47761C,
        0xD593cDeaE037babFE7a1D1bE264AD3ff682eC323,
        0x766967Fb94F2D63ebA81683AB64f3a3aF0939F5E,
        0x899AAFb2fa96f91839388C481f0CCB4a559B1B54,
        0xd6e4E1266162a8AB3DEF49290F0f223c55617a42,
        0x5d4647B9f465c7914884D9a3df7C185ED29857cF,
        0x3a9514c5320b61e77716388a5fd1DDfD5943A7FF,
        0x2b51F9Dc94089851C322fa073a609290f4a9028c,
        0xD09B06295c0DDC1DdE40e2D89D23D586Ed0C5f62,
        0x0d771F90dB99D1AF85caC5478e6048b62ede161F,
        0xEA54ee7226c4e2660d51aD5e2fB8740D857DEfc2,
        0xcA249F0bC7D5CC77A6AED5FE676ede528C97e592,
        0x7d6f8CB7544a4b4F685e4583eB738A416eF3E1B2,
        0x1cf4Fb976C31f8b429bBf8840b223B53365727C3
    ];

    address[] private _whitelist = [
        0xAD518777148D88Bd58D00E002fc8E45b5f446B7e,
        0x5CB33CCD52B77713F50e9d948Ae7726393E27382,
        0x51B71d2064d14dA817F2fC549a732CED8B7Cf8C9,
        0xfe35510eFB0F99e6821794d666b2a5569A5c7B24,
        0xf22E7577cE33A8b245B0EDeA5ed6889349c1a299,
        0x850889f786f41201e174c01442Dfcb6f71cF1378,
        0x87f8b399a61542da8dec4fd72d356D8355Af29C8,
        0x443896193d2d59CB7890Fcc7bE97388579480Dbf,
        0x89D19A0476333ae014994985769DD0567d38078D,
        0x9Ae83525AD39a614929E90185cfA3A7c10a7241F,
        0x455bdb872450C5D001AE7AbD514F1528B3e1200d,
        0xFC677f5562EECE9199CA05766d12e6CAcecd2846,
        0xca215e6Ef56BE6e243d496b890669559e40cc6eF,
        0xBe53473c8EF51c16f67AaB8C04a6D78D727DA1C9,
        0xBFe4E6714A4AA3c2e6C3654A10ddAf799f96de61,
        0x8D339dF2EdDD662cc27c830fbEf7Ab21194f7Ef4,
        0x6A1126Be17657AD3121a8350d78C09aBE13aCB99,
        0x33EbF6b1c5292330299441Bbf684b29d245D39D1,
        0x3E68E0717157480573204793D965A9E98E28B29f,
        0xAC81e6377EA7532239fCc30258C5d0fb95017c8F,
        0xCEF02b86e9d4dE6c154d01e1762462f215aDcBc0,
        0xEa54D4752Ff06f5dd56b351791E382449eEc1E4F,
        0x4Bc8B9a2c943c7e4aDdb1C593A14a297049607c7,
        0x66b1e927C3d35cbF4de05A29DcD76aE4D8947081,
        0x0F9AD89E821596eFcE28F55dEaBF1504d071f6eE,
        0x8beb8308fdf9744b69ea6E9990A9242d9E2c9874,
        0xb323f5141b4f90e6F601A1D049B0aA8390C1D069,
        0x22602754F5a7b2D298534D20Ff36E574d67854C6,
        0x3Dd40EF3461209737A3a55f52994213ED29826bf,
        0xA9E604C2C839499013c87136b24ABe734a213046,
        0xe3cB79Cf7ce8e7D5cB32dBf19df9Fc4f0b421995,
        0x0492b87512e07f4B69e179fEabAD98AB510aa5cB,
        0xCb6a27E8D0cCd5be971c65Bde697d31A911611Ac,
        0x758773d0E8Fb8F3bcc67847993059a54230bf6a2,
        0x314aD4E3Cd27f1300a51F70730B49794b21070B8,
        0xbb76799edbbfEDd6f8462140e7378f80D2C48B50,
        0x1C1E34C4E56d5b132b03247dA2CCeFE3d68c37cf,
        0x62aBD07411EB52D1Ed14cAa8e1A8987DA97b9BA0,
        0x226d1e6C589A2642A24C93B4F35f06426970e30C,
        0xD4398284DFD4301E4Ce6ED2cdbdc1E0Dc933e685,
        0xFB3cC3462310F26f50389EA21A3c3d0922f7E863,
        0xDa0A3C890603aE8248DF00BdfEcC49A94cE2dAc2,
        0xe4c2e41c3EE59D892585461e45bFf994B2310765,
        0xa60F1eEee54A2BD05e24fdE3f4c396F187c8D7DE,
        0xBA6D29e8Bb5A0ECcE868226bfCf4e466200bba27,
        0x730aF5B6d20548Ec8199DDD89A0876CAC4410563,
        0xC067d3834aE5C04BADC4Fb5924A7A5B317aC619b,
        0xCAFB7E50C67D1dC7229f892911178103fc4f0D03,
        0x66EC9B0683196DC6540970c061a15d61a2F3EdBF,
        0x3A5baFBC2dEec20d9977d1c8727BE83D55B9B8c9,
        0xF094e8A8F287E475f89f6dDF0cc28B5EB5EF1A8f,
        0x8Ac1bEFa7da1442ba11FacF2031361Cc6B5a643e,
        0x1AFb681A858cf655C6bC26EAA1aBb20FC2F279bF,
        0x69e3FAbDafaCF06aeE60a060c20475A4CF14f541,
        0x4C05dd7BAeae9F1c8d3985313BC7F0f080a37407,
        0x40DceDe97eBcb9db0CC4218C68057CE25e3b592C,
        0x719F0D394811D33fE88618FD4728de90706560B2,
        0x58627455B304F2073278Cc0D891D0da50e5d8008,
        0x0Fc68e59523dC0ebd99Db79a8FF2B51121652F0a,
        0x6Ca4a7F0c4C9D4d096796Ba1C753b37a8049390C,
        0xd8e20d5B3Ec873A346133479d45d7D9E989FE3f9,
        0x79c310EE0852a36EC5981def2420409d35923Cad,
        0x91eb8604FBEF0550a072611A313B68A38e9dfc3D,
        0x5341d0CEfe00d0DCe0543Fb458EfC9c477107E81,
        0x3c45eb68d1EF52214Bb17EC54b4b66610d67728a,
        0x896Ad41070f6d80011f09910D51851363EcdbA65,
        0x27527Ee841Ded49B34cf12351611652E730235fA,
        0x9fa18039D85271dAB21770374a16d4790dd28a89,
        0x564a7735cC6A043B806537173b002310b695F750,
        0x8d0F673FF0c87CDBa47D917e3CcA80e34207Bf54,
        0x89d8Fb263106dbAFE032690208733DBfF241771D,
        0xb827b5bbF83e22D2a058E606D239fC653462B593,
        0xE92F757D958B819FD5A044060522b038bA0D7A1f,
        0xF8883a39c6D6016253f61158A1Fe2c0679DA85Aa,
        0xc744BF3d4FB1b4A64C438e26100886fa1954Bd72,
        0xcf8CA4C3D3F1da9e61B1c92aaA46F84a71Ac7656,
        0x37e305B9d84AEbcAda6b44c5F55304CA61125011,
        0xC2137B2c22056485969b2b0BeA8F69002718cC74,
        0x461f2eD4F2972afD2577A0653ac9273F15df3041,
        0x1dAaA5625D90693DE5a27912f0FF3d2632F3079e,
        0x5c311deC2654c785F3c78fBb8673CAFf7493FEd8,
        0x2170919562d76304FE00e4fBBf5Fe2697043d205,
        0x7A0Fb93698C8A8Df1e6Dd5A82c55987773AE470c,
        0xFE62b81D19B45503529deC828D9258C8490207cf,
        0xEFB76D7d278Df4f5C4032e3920546e869cce1cd5,
        0xbad3695FCc025d4099BE6B72a94f51Ee522C7Ef9,
        0x2529526b89d3b748B649063262d91647437eEFeD,
        0x354d88273e0CbE4b66f3207b2b2050b519e606fe,
        0x4073250477EECcC3c7B8aF062AD775B914d6972E,
        0x0a7006c5a571167a1C1cdbb0a26C75637925C198,
        0x3A07242f26692CfA6bE526Cd0dda219E62e8a8F4,
        0x0De56aB94C36E31a367587e8Aa82FaBc55201423,
        0x87378D624fcD561D4E02e73Ca63d1cfD13D0854e,
        0x6bf7AdD154a848bD5BdedB5E4b056766e3829BE4,
        0xAeEd8dC4a12Dd8AcCa316B1a56073A3C98ada27b,
        0x2Bbc02C32192774c1ecCE9727b2f616Ed85AaD7E,
        0xe38E9F948b6e9a4adA2Eaf7Fe0cD23CCd51c5d3c,
        0xeb1564adF9B890527F280bBB939A3e022f24A81B,
        0x2fe22DC7b037Bb53feA9B75Cea374408D6bBbf78,
        0x5825b1250486834c96a03ac71C8E6b7dfEB72e4b,
        0xaED348aD21F2E72a906D918F28c07249546998Fb,
        0x41CD8891C2BdaD4dEeb9A1e777F29E5c9De492F1,
        0x625d8200cEBA526930892A884F34d534E82354e8,
        0xFE9504715B3599744CBC575186a21ab22378Ce43,
        0xA8Bb476B21D934F943AA9b22e5bD1147e1d0bE14,
        0xbB808992c2CB13420ebFf643293a5c68FDCF2FF8,
        0x6C26f980BE8935F8450a903BFcefCAC50fb77d4E,
        0x4f9a719420C66efdFF57178bC9D5D2bD6fdf4639,
        0xF5F580Ac0865Cfc8570dF0907706f3AB7C483322,
        0x67bB5c7C768296AD815D0d8109C027CF614B27f2,
        0x889AA6bbE9B87187B78bC34550F76036271BEe8a,
        0x03069364429c1815ac520F68277d12c7C9e9b45C,
        0x77C54036Cd9d353006Ec366A98920E6570efF59a,
        0x6F205746fF97969eFbD709b973649d3f18820dd9,
        0x8Dd1270731b48bd907b15554Df4dE4a33D21a1d4,
        0x75D0D29DF0B918538dA4Bb55Ed1A93866C8fc685,
        0xBC645D9c7C90c995e5dea19382a89768E8168816,
        0xBFbD5F6dFb06866ac458Fa2efFCE8B9Ad5FF1bc5,
        0x97d0cFE152797911Fae057A681Fe58E73739F9c7,
        0x2ceBa06d249BBfA20894e2092b77dD86dB0A9302,
        0x7d007D3574522Af5f17F7ddab6885585690BeA6F,
        0xC49ed8051843eebd2d78618E48B734D09e710dA5,
        0x89A6f301E1909575D4d50436f05C877502B92585,
        0x3788EEc9934868329A0D92713CccBA5e1f9D9f4c,
        0x34F92BF9290726955332B7E0730946813Ac9d3fa,
        0x553F49Ca80aD5E78b563A05E4D28Fdd1fB44B00b,
        0x1d73A4A30AE85f5101DfBb4127747D34850F5c3c,
        0x9c52f4afe7983705c4D0018E544D5837caf0c049,
        0x97Df17A92a8306fa97c6a772327ae955Cc410ca9,
        0x3a187B5285e0cBAC774A335b5315A64B4A9173c3,
        0xaBAEFebc2a98Dc02c0fa6D7F88CFf5368c1bFEE7,
        0xda862466999c1BB7D6d38B9c5457BC5627b80BdC,
        0xDF5405E5d59e3421f4735eFE49b63f0C1Ec25Cf9,
        0x72Dd867f119E044E31e6BD52E1fa6B7605dad4A4,
        0xf69eA0522Ac7022A029BC03a283725AC6B75d0C7,
        0x399f1C2A3771eAE1B9D53a5fa8209834868e8caC,
        0x0AF35D19326BB11a0d99bb4b430DB864Ab857C14,
        0x4397c6ab5896C8D8B21707b030e93e7037b8643d,
        0x631b2323d11ab1f3f5E09A0f695680379D488bd2,
        0xABA746cAa87c9Ab74B69C609a4F69Cc0120fc832,
        0xd4972F305F31a701aB5f3882043464388166912C,
        0x38def4f28d0071a7D9b207e6f461a67E21B8a1de,
        0x101F8df4E312Aa4f6ebb24241705F15716506963,
        0x5cD39D7dB616E60B56F1593b44A9dEAdbcBc2ccE,
        0x86aB8922f09923de21ECBB2e7c62d6b869772833,
        0x1765E68365FDb0935f9522093919950B8Ca98710,
        0x01df827543dc9dD766B2492e29eF1a985645Ba47,
        0x6e70A7cDc413DBEbf957bB5FD16C61B6665c8Bae,
        0x240A14190554E158f4e561BCEaD6465038b71f46,
        0xe2bAc6B98eCa59106f4A5bF4B5F96F299456aaf0,
        0xC1AfB128b3EFc6D0fA8068CE608EcEC3Fdcf5Bbf,
        0x178980bebd6A5AbcDA83cb45A9a9B9604995047d,
        0xB066d0D76c21db10e0D583E0D945Efc1128fA0b1,
        0x15BA99dfBb8E8E2b3ab57EF23e20e93E0ca658F1,
        0x8109d2849592202D07790557cD95F17310099562,
        0x5E3F84E3b1d2896e1Ac3D7d08B1f1106d0d3b209,
        0x4ACec241ea60c06D6Ab6722eBeF98725DEc3825B,
        0x8822354E02e5AdA352883f4D766FC6171e5e453c,
        0x8de855B819b9D720f52479e92FF746721BB22f86,
        0xd81E746EC71Fe9A095958C69100261D73C4718b6,
        0x65372ce086f71dBF2942B123A61b18c4D1040e2E,
        0xA0A828934E6E503EfFa076193c83abD9bAD4EC2F,
        0x583F3d3a013F3c46882BD0c7c73135Fb73632756,
        0xD9DC731cAF241ACC7daAc1510046BF31bDd5772f,
        0x6F413B49673d2f918cdE926256AB1b7191a87287,
        0x40a525edb28F6e9A1C52d310faD4201145862C3F,
        0x6Ea9823d35D0Da30bc0e801C61d9B9101061D8bf,
        0xB482Fd5076eCd520cdEd29881BD656183D2d7064,
        0x8c9BbD383eDC0dC7B207Cb3EDeA4E2D1a47507F7,
        0x27d56763f4E73956E5ce834d6E6c7710aA3521d3,
        0xB721bBDa1a7e2608CF66bCf3b3b513103cF69DF9,
        0x3D7ddb051eFb0846Abab9adA0168d5eCcAd7239D,
        0x4C566F07BD8C55Dc63caadC7dd272d3FBeF13c31,
        0x1072DD569516864dD3800C75a4A980A1Eb30Dc63,
        0xd58B7F2722371aa92C929272094c3A65482c0429,
        0xA942B1AF9CAbc692E8a5D80624AbB9f5e282514B,
        0xDDeB9f48ef957C3EAc8b2D9756979Ef5471bc05f,
        0x70d860cb44D51B54062AC1f72d07B32e5843e550,
        0x6276a59FA36661e817ee213b00dbB07F3405032a,
        0x805AA254d2bA27d7C086C482DDD9c78288C87963,
        0x19E11fa7a09fA2e5a2d6bbbFf3019aEBEfF56434,
        0x0b46e106B4C1A3e34A4873a46Af4154d7446D175,
        0x4baCf4cbdd730Da5E2d2e777971AD7508eD08C32,
        0x877d5e75368ee1311623Fd1cFfC83Fe0582719fA,
        0x543eD6291570356c650b6bA64d31B9dB036f0AD1,
        0xeBf8da1268d9510c01E9b3eA362771625863Aa41,
        0x22fbCf63F259cc6E54E58DdDC162d50EaaB0d034,
        0xB9fB6F62Fd54a0425ca448b564151b1B9D74BA2a,
        0xC1B21238311f98737A81F247bED51F4455C4c1De,
        0xfD808AD0B0942488E8De71Cf202AB9F55ADb2A2D,
        0x7EF0d352F7A77c0dF51dEF796e63a008234a7cdA,
        0x40FE266804031663dc7ec4cE4eA549A9De132a82,
        0x333F0Ffde35190B5781765499282c429F12d82b4,
        0x8B71Fd26Ed10A14f496965C4aFC65563A08FbC35,
        0x674d6a5ba766E6D43d907bB91c7bc88214D5E78c,
        0x83c672932d131989d642C28AAe4341F06aEe9090,
        0xee72B38f98Bd65811e26b2D239ec94d30C1F9457,
        0x0C5c79bF4fc8f85935932eeDD085c879d5cFE89D,
        0x5C9a49A19C0Ed8aeE4e5c560989A126Fe01568AC,
        0x9D89Ef8993101ade6ea898004D1a59f83fc9abf8,
        0x2e0dBE68B6302b8eCd423A153b938879147EE80B,
        0x6202A837D7E9F8443c0dD422b2cC1B124ffB1b27,
        0x0fb122228d710Ea0d49d914ed702660663c6b81f,
        0xeB5A0709188E324D5C93b2048c8E8EF54D31cAC1,
        0x061DB8B26D26a8AaB4bE7beA45A095EbC51da269,
        0x4ee4BdA6892769d6E2f653e1BcA2B667EFc7116c,
        0x43A1e818131aa25eAf855563Bfa53d6972d98A49,
        0x635b1d201Edd1c2ef315959136d3e6B0741c2573,
        0xBC7831bb8aF4430C59fcf8C89F652F4ADAEE82f3,
        0xd760aDbE1E1F33A7714585A4cB866634F127fD7E,
        0xB49FE211c2A96796cd13E363d837A8Cb347222Ec,
        0xE5c02961BD96181Ed6dE8415f9C6E766da6e62FE,
        0x18c1C3Cfb7BA9c5506fE5D3BE705DcFC87E96AaC,
        0xF438C974979a742Ca33e76702d6257E6606c93bd,
        0xA89fb3E1aC5Fbf850e035140E0E03f7eb663E3a1,
        0xDDfB4aE2d6b5cD791f0F34a2589745d333cdc0b6,
        0x77f68e3750Ff8949B6F60aE99285dd8C54796a0F,
        0x5F6A5E189e66AB884716Dda3Bb1eCd512926c52A,
        0x33E37c3dED2347fBDCca7d06149819Bb5Adc8948,
        0x1893aDea7c33df16aF0EDa122a24576ea27B5E58,
        0x275DB603d79E3438082d16b31A89f6D86ce886b9,
        0xBA42c5361fc138E62448B1c16cb0c56405d36f8A,
        0xD5d52FE39b4FE64782924cfEb36F655293C1cd21,
        0x93690461768e7bFec1Dc72e341fC702D5690d8cd,
        0x6a565970C37ec3d9A6b7169bE0e419e91d173c8F,
        0x382a21b40a36Eeaf94d7d6bff8ACaf55cA0937f5,
        0x909E3d07fc00C46326263739db6053676d17E964,
        0x5987a436cA03940F3F42a06bCDDFC268F6f7ACC1
    ];

    constructor() ERC721("Parrots` Fight Club Official", "PFC") PaymentSplitter(_team, _teamShares) {
        _addFreemintUsers(_freemint);
        _addwhitelistUsers(_whitelist);
    }

    modifier minimumMintAmount(uint256 _mintAmount) {
        require(_mintAmount > 0, "need to mint at least 1 NFT");
        _;
    }

    // INTERNAL
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    function totalSupply() public view returns(uint256) {
        return supply.current();
    }

    function freemintValidations(uint256 _mintAmount) internal view {
        require(isFreemint(msg.sender), "user is not in freemint list");
        require(_mintAmount <= maxMintAmountFreemint, "max mint amount pre transaction exceeded");
        require(balances[msg.sender] < 1, "you have already minted");
    }

    function presaleValidations(uint256 _mintAmount) internal {
        require(isWhitelisted(msg.sender), "user is not whitelisted");
        require(msg.value >= preSaleCost * _mintAmount, "insufficient funds");
        require(_mintAmount <= maxMintAmountPresale, "max mint amount per transaction exceeded");
        require(balances[msg.sender] < 1, "you have already minted");
    }

    function publicsaleValidations(uint256 _ownerMintedCount, uint256 _mintAmount) internal {
        require(_ownerMintedCount + _mintAmount <= nftPerAddressLimit,"max NFT per address exceeded");
        require(msg.value >= cost * _mintAmount, "insufficient funds");
        require(_mintAmount <= maxMintAmount,"max mint amount per transaction exceeded");
    }

    //MINT
    function mint(uint256 _mintAmount) public payable minimumMintAmount(_mintAmount) {
        require(supply.current() + _mintAmount <= maxSupply, "max NFT limit exceeded");
        require(preSaleState == true || publicSaleState == true, "sale not started");
        uint ownerMintedCount = balanceOf(msg.sender);

        if (preSaleState) {
            if (isWhitelisted(msg.sender)) {
                presaleValidations(_mintAmount);
            }
            else {
                freemintValidations(_mintAmount);
            }
        }
        else {
            publicsaleValidations(ownerMintedCount, _mintAmount);
        }

        for (uint256 i = 0; i < _mintAmount; i++) {
            balances[msg.sender] += 1;
            _safeMint(msg.sender, supply.current());
            supply.increment();
        }
    }

    //PUBLIC VIEWS
    function getCurrentCost() public view returns (uint256) {
        if (publicSaleState == true) {
            return cost;
        }
        else if (preSaleState == true) {
            if (isWhitelisted(msg.sender)) {
                return preSaleCost;
            }
            else {
                return 0;
            }
        }
        else {
            return 0;
        }
    }

    function walletOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = 0;
        uint256 ownedTokenIndex = 0;

        while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
            address currentTokenOwner = ownerOf(currentTokenId);

            if (currentTokenOwner == _owner) {
                ownedTokenIds[ownedTokenIndex] = currentTokenId;

                ownedTokenIndex++;
            }

            currentTokenId++;
        }

        return ownedTokenIds;
    }

    function isWhitelisted(address _user) public view returns (bool) {
        return whitelistedAddresses[_user];
    }

    function isFreemint(address _user) public view returns (bool) {
        return freemintAddresses[_user];
    }

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

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

    //ONLY OWNER VIEWS
    function getMintState() public view returns (string memory) {
        if (preSaleState) {
            return "preSale";
        }
        else if (publicSaleState) {
            return "publicSale";
        }
        else {
            return "";
        }
    }

    //ONLY OWNER SETTERS
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
        baseExtension = _newBaseExtension;
    }

    function _activatePreSale() public onlyOwner {
        preSaleState = true;
        publicSaleState = false;
    }

    function _activatePublicSale() public onlyOwner {
        preSaleState = false;
        publicSaleState = true;
    }

    function _addwhitelistUsers(address[] memory addresses) public onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            whitelistedAddresses[addresses[i]] = true;
        }
    }

    function _addFreemintUsers(address[] memory addresses) public onlyOwner {
        for (uint i = 0; i < addresses.length; i++) {
            freemintAddresses[addresses[i]] = true;
        }
    }

    function _withdrawForAll() public onlyOwner {
        for (uint i = 0; i < _team.length; i++) {
            release(payable(_team[i]));
        }
    }
}

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":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_activatePreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_activatePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"_addFreemintUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"_addwhitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_withdrawForAll","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":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freemintAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintState","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"address","name":"_user","type":"address"}],"name":"isFreemint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountFreemint","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPresale","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040819052600060808190526200001b91600f9162002e31565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200004a9160109162002e31565b506701aa535d3d0c0000601155670214e8348c4f0000601255601380546001600160501b031916670315b300fa9615b31781556040805161016081018252918252600f60208301819052908201819052606082018190526080820152600960a0820152600660c0820152600360e0820152600161010082018190526101208201819052610140820152620000e390601790600b62002ec0565b5060408051610160810182527369b59df9e946a67056c34d15392d5356cf8b1d098152738367e283cc671a823e7918230240ff49307709c86020820152730db5583d46fe7c4127c59a3a8e913f413a310053918101919091527371510c98974778961dd80425d6b384763a8141bb606082015273239f9bdd1859d46ed2e0b11bc5fdaaae5c26fac5608082015273d26ed430d45c87d844359b367302c895c96929f160a0820152733c73af9f2adf8cd99169d69c68eb3542e8877b5760c0820152738302c108798a2856ecfb8ef32ed174cc396f103960e082015273933f384a22e57870303669c452192d0ecb293afc610100820152735f887298a09bfa7cd9e588f17bf9a6ebb85e12bd610120820152734d7cf77db9ac4a4e681eca2766ca27168bdf5ce96101408201526200021f90601890600b62002f03565b5060408051610f2081018252736856c4185242b75baaa0460a28b1aae3f7cbd1ff8152734bfffe2c5785dd8938a8bee1e28ce1ab22efb811602082015273ba2a47e7df7a1e327d90327d1c944db2d016fcef91810191909152731e4c6b29cad7f218cbd8493a84588850d06d9b8c6060820152731b7bbf042fbdfae039e62e6758d3e281af9d4120608082015273710b35f5d18f05bcb4356f13070b45309842e49c60a0820152739d4f0ba16699eb345b564800d6f97c72fb44c6a060c082015273d4d14f60d0e99e7a69683cdd8da9255bb3d792cf60e08201527331524ce745e00a945f192076a2db282fa3b410506101008201527369b59df9e946a67056c34d15392d5356cf8b1d09610120820152732906c780e7a6f098d1569da398c71dd1769ccdda61014082015273f71c62934a6927eeeec0fbf7e72167e4336c5616610160820152737a195e1d1d09e9a3bfb3e3be4e2d3b1462f7c6c86101808201527348336131b2d83c606e7fd38fade515c3dcff469b6101a08201527364519f5f85e8da14c6aadfc45521a5c0d183dd406101c082015273ea85c23e6e6632f87236c369c06da876225ce2136101e082015273a9aa2ccc9dfc392d9f63f1e7c093c065dd0e8326610200820152736c87651e920c3482912d35fefe410e266c311e8b61022082015273c873c17dc72df930d5e6a79854aef1fb028ee4a161024082015273931ad0c26ed6e55775918d8319d17022732d5ed061026082015273ae1c7cfd49df5e74ebc4c5aef72bd29a388e5f9c61028082015273bddef6a10475918434e8dc4530d7bfedfb9c4b766102a0820152735ad876757e6d7ea79b84b4c3d4cc3d8882c091db6102c08201527309931a7d5ad71c89f04bd25297fd33892318d70b6102e082015273b700bc75930662c78bfd6f4e11cfe428ea2faf17610300820152730bf91b43047ed6b14464ee4d6732391a9dbe7be8610320820152736766dd8174720d28f7cd71ce42ff3bfc363892f4610340820152735eb281686277de80ef8156a3965f6be79ac8c51d61036082015273e6ae3eece57e315ee5ca2b81ff059c4ea8a6cce26103808201527360c727d4447849d5611c4fd08f024e00ee7f8ebf6103a082015273a7251941f230cf552f0c972123a89108537e3da56103c082015273279793ca6773db3cf073d3931150ca1b3bae542d6103e082015273b5b20e842839cfbe543c3811ae91fb089a110e786104008201527329aefcb1690745b8f80163f7f56100c4d2dc678361042082015273f7147ba5865a58f87859072436d63f1c758e006461044082015273042c617d92366b0900a9cfbf6757ecfe69945fa0610460820152733b2deb1fb5ab574f1ca121fa520860ddaa11d73661048082015273e521959c73d3680a321d271f98bbaa57dc1af4116104a0820152737e34c4564edb5477f07ecce29b4a1329441a63b56104c0820152735fefdb8e576bda70f63e8e8edaac7426c67c6b5a6104e08201527396a38ba834f116cbc67e7473cbbdeceadbbf813a61050082015273e900fbe2f280e608774aeb5a28031960e420ed77610520820152734ec913743a90b7b9cf36d2907f0b12b3e36bb8bf61054082015273d8f47b07648f43cbcac55bb0bddbc4660529007761056082015273cacfb66c905bbe26518beb93710bd4eb3f1d43e86105808201527382dba121a74a4ce1aac6afb88622bb87937ff6db6105a082015273e2f81a3e16af0115665660153f24dd7c6c97064b6105c082015273417c2408475318d6253ac8bfb8d495259c3d9b1d6105e0820152734245c65e9b5f1fc16a76ca6c31c0d34c736dc4d961060082015273c7349d553951d82bcb3c9864b8cdb60729e5eaf661062082015273c3e81f8f2104fb6ca80f81f7fd8ad804e513a6046106408201527342b6bf95c9baa73c82504a965a8714df90ddfdf9610660820152732dd5f56db86a9ee0ae5c564a0c99e38ddeb23cd661068082015273934c3b2dda3eb34dc624316da52a72e022622f8e6106a08201527337f9bc8ffbb43c4a30a939c7be94a9eeb266b6dc6106c08201527308519937699b3fa307d981125479043da2d48bb26106e0820152735f4101f13c232b5bd65bed11842186c1a720392461070082015273b6443a75c2a7e95bf64dcfca24d7dd431036c4e36107208201527396a939f94383f3f7028eae3a9ab94f66d3d7541c61074082015273bde95edb2305f9270a5e3bb778eae03d14b68cca61076082015273d378ca5fffaa6701c2ae9a71120d702cc303c7e5610780820152730d4bb1849e8d669f170515887a7c143dd3f333106107a0820152736a565970c37ec3d9a6b7169be0e419e91d173c8f6107c082015273c428141b2eecb2c901e2208b61e87d664473154a6107e0820152732fbaaeeb80d2bcc8b2e36d6cad8e31921337ed5061080082015273e08e347676c52c8818b76e46d71956b84b4e2f426108208201527327f76d1361a76531f95d9b38da8cf9463056b8ce61084082015273e47d699ff0d480dc953069fbc023757de70052f961086082015273f3058ab3e0fbd58853b7e14eab9041ee849e7a6161088082015273235461b7cb87cba28a91f5e2fef3cced0e2c82136108a082015273bd6ff0686654dfd73763292cd7bea075af62d3736108c0820152730f04fe8682e84dd0ab01e04728b00f65d6e994f86108e0820152730e8d6f2d576462bee696d9b4cd759943518a4a866109008201527374c3a7320c24af6833f685e8f424051a6c6c6a7061092082015273888fafab68b701400289ef5a7496488af5c3a0e76109408201527325a0ef64bde79ec315013b0971765eba7f4b5c3861096082015273a7ba82817614e6d45be6d3c0adb0f282cc58654b610980820152733d88b72b75e05dcf6fd3fdb29c986887ec7bbe236109a0820152739d57e8fc7198a9afe31f7cbffd350fd7a6ae69286109c082015273a055a40e9a298f7f073e8d50a1874ecd6dc178766109e082015273a65bea89ac1abac7a135aeb477833f8054b9ac2b610a0082015273d1dfa3c5794c4ce2e0af0bf400c6fcd59e63c18d610a20820152731bb44f56bc21226f9e7142e26edfac41d2209b56610a4082015273971d16aa905e02fa4fd305030f4a68ab940f870c610a6082015273db58e63662d4985e47b82fc66482362c9b615495610a80820152736974535d3408a989d9d6f7a6ec62a50767715a2e610aa0820152738642214d3cb4eb38ee618be37f78dd74a3093869610ac082015273ed8c6b13e9e8e9937923c9197946fbf743da9652610ae0820152733253bbbacb15cc5994f2fcb04e323337060b4486610b0082015273bc0c5acb5a65ca9ded3bdd2b0f0f36f71cd7dd7c610b2082015273850081ce7386e6163e3f1bdcca75d5cfe00ad0c9610b4082015273979e98f34d082cbeee90c7ef8c1df5942d4f4a33610b60820152739342b1556abdeb2a11580c3dbe0f6c4b73908034610b808201527397b9f5264ab6350ff5d0f721510b6de061e9b8fc610ba08201527374a84160255ca66fe8689c1c9c286506bf40dd86610bc082015273d3532ee9a985635f505106df24ed961925995c17610be0820152739493dfe3588f3ebcd30e5129224d186320a44e80610c0082015273d88948b7a22e239492a56790f9c1c1418ab56235610c20820152738277c5a6c1dee6b59b34cf184c751f47348462dd610c4082015273bbeb83ffa7b1cd7c4fb1542b0c41102891846fee610c6082015273efd785f5b4a08c2997e97976e313988d9f5bcd23610c8082015273d2179324c4f053a4ce0ef8db264b51dc0ae36f28610ca082015273f1a47b921c8af2df1af1938d4ae971f9f30a53d1610cc0820152737766004e6d3fcbb85e0e926055435192d3efd32a610ce0820152738c8a4e818184f701a32561d6ccfff05dbe931d1a610d0082015273d5e4fceac7a6d3e815e93300e6a98232e99f1d16610d2082015273d09bed30d34b679b2ae788827405e093e4cdb79f610d40820152738a2947e6c510dc460837d064db39e2f8cb47761c610d6082015273d593cdeae037babfe7a1d1be264ad3ff682ec323610d8082015273766967fb94f2d63eba81683ab64f3a3af0939f5e610da082015273899aafb2fa96f91839388c481f0ccb4a559b1b54610dc082015273d6e4e1266162a8ab3def49290f0f223c55617a42610de0820152735d4647b9f465c7914884d9a3df7c185ed29857cf610e00820152733a9514c5320b61e77716388a5fd1ddfd5943a7ff610e20820152732b51f9dc94089851c322fa073a609290f4a9028c610e4082015273d09b06295c0ddc1dde40e2d89d23d586ed0c5f62610e60820152730d771f90db99d1af85cac5478e6048b62ede161f610e8082015273ea54ee7226c4e2660d51ad5e2fb8740d857defc2610ea082015273ca249f0bc7d5cc77a6aed5fe676ede528c97e592610ec0820152737d6f8cb7544a4b4f685e4583eb738a416ef3e1b2610ee0820152731cf4fb976c31f8b429bbf8840b223b53365727c3610f0082015262000ef590601990607962002f03565b5060408051611c808101825273ad518777148d88bd58d00e002fc8e45b5f446b7e8152735cb33ccd52b77713f50e9d948ae7726393e2738260208201527351b71d2064d14da817f2fc549a732ced8b7cf8c99181019190915273fe35510efb0f99e6821794d666b2a5569a5c7b24606082015273f22e7577ce33a8b245b0edea5ed6889349c1a299608082015273850889f786f41201e174c01442dfcb6f71cf137860a08201527387f8b399a61542da8dec4fd72d356d8355af29c860c082015273443896193d2d59cb7890fcc7be97388579480dbf60e08201527389d19a0476333ae014994985769dd0567d38078d610100820152739ae83525ad39a614929e90185cfa3a7c10a7241f61012082015273455bdb872450c5d001ae7abd514f1528b3e1200d61014082015273fc677f5562eece9199ca05766d12e6cacecd284661016082015273ca215e6ef56be6e243d496b890669559e40cc6ef61018082015273be53473c8ef51c16f67aab8c04a6d78d727da1c96101a082015273bfe4e6714a4aa3c2e6c3654a10ddaf799f96de616101c0820152738d339df2eddd662cc27c830fbef7ab21194f7ef46101e0820152736a1126be17657ad3121a8350d78c09abe13acb996102008201527333ebf6b1c5292330299441bbf684b29d245d39d1610220820152733e68e0717157480573204793d965a9e98e28b29f61024082015273ac81e6377ea7532239fcc30258c5d0fb95017c8f61026082015273cef02b86e9d4de6c154d01e1762462f215adcbc061028082015273ea54d4752ff06f5dd56b351791e382449eec1e4f6102a0820152734bc8b9a2c943c7e4addb1c593a14a297049607c76102c08201527366b1e927c3d35cbf4de05a29dcd76ae4d89470816102e0820152730f9ad89e821596efce28f55deabf1504d071f6ee610300820152738beb8308fdf9744b69ea6e9990a9242d9e2c987461032082015273b323f5141b4f90e6f601a1d049b0aa8390c1d0696103408201527322602754f5a7b2d298534d20ff36e574d67854c6610360820152733dd40ef3461209737a3a55f52994213ed29826bf61038082015273a9e604c2c839499013c87136b24abe734a2130466103a082015273e3cb79cf7ce8e7d5cb32dbf19df9fc4f0b4219956103c0820152730492b87512e07f4b69e179feabad98ab510aa5cb6103e082015273cb6a27e8d0ccd5be971c65bde697d31a911611ac61040082015273758773d0e8fb8f3bcc67847993059a54230bf6a261042082015273314ad4e3cd27f1300a51f70730b49794b21070b861044082015273bb76799edbbfedd6f8462140e7378f80d2c48b50610460820152731c1e34c4e56d5b132b03247da2ccefe3d68c37cf6104808201527362abd07411eb52d1ed14caa8e1a8987da97b9ba06104a082015273226d1e6c589a2642a24c93b4f35f06426970e30c6104c082015273d4398284dfd4301e4ce6ed2cdbdc1e0dc933e6856104e082015273fb3cc3462310f26f50389ea21a3c3d0922f7e86361050082015273da0a3c890603ae8248df00bdfecc49a94ce2dac261052082015273e4c2e41c3ee59d892585461e45bff994b231076561054082015273a60f1eeee54a2bd05e24fde3f4c396f187c8d7de61056082015273ba6d29e8bb5a0ecce868226bfcf4e466200bba2761058082015273730af5b6d20548ec8199ddd89a0876cac44105636105a082015273c067d3834ae5c04badc4fb5924a7a5b317ac619b6105c082015273cafb7e50c67d1dc7229f892911178103fc4f0d036105e08201527366ec9b0683196dc6540970c061a15d61a2f3edbf610600820152733a5bafbc2deec20d9977d1c8727be83d55b9b8c961062082015273f094e8a8f287e475f89f6ddf0cc28b5eb5ef1a8f610640820152738ac1befa7da1442ba11facf2031361cc6b5a643e610660820152731afb681a858cf655c6bc26eaa1abb20fc2f279bf6106808201527369e3fabdafacf06aee60a060c20475a4cf14f5416106a0820152734c05dd7baeae9f1c8d3985313bc7f0f080a374076106c08201527340dcede97ebcb9db0cc4218c68057ce25e3b592c6106e082015273719f0d394811d33fe88618fd4728de90706560b26107008201527358627455b304f2073278cc0d891d0da50e5d8008610720820152730fc68e59523dc0ebd99db79a8ff2b51121652f0a610740820152736ca4a7f0c4c9d4d096796ba1c753b37a8049390c61076082015273d8e20d5b3ec873a346133479d45d7d9e989fe3f96107808201527379c310ee0852a36ec5981def2420409d35923cad6107a08201527391eb8604fbef0550a072611a313b68a38e9dfc3d6107c0820152735341d0cefe00d0dce0543fb458efc9c477107e816107e0820152733c45eb68d1ef52214bb17ec54b4b66610d67728a61080082015273896ad41070f6d80011f09910d51851363ecdba656108208201527327527ee841ded49b34cf12351611652e730235fa610840820152739fa18039d85271dab21770374a16d4790dd28a8961086082015273564a7735cc6a043b806537173b002310b695f750610880820152738d0f673ff0c87cdba47d917e3cca80e34207bf546108a08201527389d8fb263106dbafe032690208733dbff241771d6108c082015273b827b5bbf83e22d2a058e606d239fc653462b5936108e082015273e92f757d958b819fd5a044060522b038ba0d7a1f61090082015273f8883a39c6d6016253f61158a1fe2c0679da85aa61092082015273c744bf3d4fb1b4a64c438e26100886fa1954bd7261094082015273cf8ca4c3d3f1da9e61b1c92aaa46f84a71ac76566109608201527337e305b9d84aebcada6b44c5f55304ca6112501161098082015273c2137b2c22056485969b2b0bea8f69002718cc746109a082015273461f2ed4f2972afd2577a0653ac9273f15df30416109c0820152731daaa5625d90693de5a27912f0ff3d2632f3079e6109e0820152735c311dec2654c785f3c78fbb8673caff7493fed8610a00820152732170919562d76304fe00e4fbbf5fe2697043d205610a20820152737a0fb93698c8a8df1e6dd5a82c55987773ae470c610a4082015273fe62b81d19b45503529dec828d9258c8490207cf610a6082015273efb76d7d278df4f5c4032e3920546e869cce1cd5610a8082015273bad3695fcc025d4099be6b72a94f51ee522c7ef9610aa0820152732529526b89d3b748b649063262d91647437eefed610ac082015273354d88273e0cbe4b66f3207b2b2050b519e606fe610ae0820152734073250477eeccc3c7b8af062ad775b914d6972e610b00820152730a7006c5a571167a1c1cdbb0a26c75637925c198610b20820152733a07242f26692cfa6be526cd0dda219e62e8a8f4610b40820152730de56ab94c36e31a367587e8aa82fabc55201423610b608201527387378d624fcd561d4e02e73ca63d1cfd13d0854e610b80820152736bf7add154a848bd5bdedb5e4b056766e3829be4610ba082015273aeed8dc4a12dd8acca316b1a56073a3c98ada27b610bc0820152732bbc02c32192774c1ecce9727b2f616ed85aad7e610be082015273e38e9f948b6e9a4ada2eaf7fe0cd23ccd51c5d3c610c0082015273eb1564adf9b890527f280bbb939a3e022f24a81b610c20820152732fe22dc7b037bb53fea9b75cea374408d6bbbf78610c40820152735825b1250486834c96a03ac71c8e6b7dfeb72e4b610c6082015273aed348ad21f2e72a906d918f28c07249546998fb610c808201527341cd8891c2bdad4deeb9a1e777f29e5c9de492f1610ca082015273625d8200ceba526930892a884f34d534e82354e8610cc082015273fe9504715b3599744cbc575186a21ab22378ce43610ce082015273a8bb476b21d934f943aa9b22e5bd1147e1d0be14610d0082015273bb808992c2cb13420ebff643293a5c68fdcf2ff8610d20820152736c26f980be8935f8450a903bfcefcac50fb77d4e610d40820152734f9a719420c66efdff57178bc9d5d2bd6fdf4639610d6082015273f5f580ac0865cfc8570df0907706f3ab7c483322610d808201527367bb5c7c768296ad815d0d8109c027cf614b27f2610da082015273889aa6bbe9b87187b78bc34550f76036271bee8a610dc08201527303069364429c1815ac520f68277d12c7c9e9b45c610de08201527377c54036cd9d353006ec366a98920e6570eff59a610e00820152736f205746ff97969efbd709b973649d3f18820dd9610e20820152738dd1270731b48bd907b15554df4de4a33d21a1d4610e408201527375d0d29df0b918538da4bb55ed1a93866c8fc685610e6082015273bc645d9c7c90c995e5dea19382a89768e8168816610e8082015273bfbd5f6dfb06866ac458fa2effce8b9ad5ff1bc5610ea08201527397d0cfe152797911fae057a681fe58e73739f9c7610ec0820152732ceba06d249bbfa20894e2092b77dd86db0a9302610ee0820152737d007d3574522af5f17f7ddab6885585690bea6f610f0082015273c49ed8051843eebd2d78618e48b734d09e710da5610f208201527389a6f301e1909575d4d50436f05c877502b92585610f40820152733788eec9934868329a0d92713cccba5e1f9d9f4c610f608201527334f92bf9290726955332b7e0730946813ac9d3fa610f8082015273553f49ca80ad5e78b563a05e4d28fdd1fb44b00b610fa0820152731d73a4a30ae85f5101dfbb4127747d34850f5c3c610fc0820152739c52f4afe7983705c4d0018e544d5837caf0c049610fe08201527397df17a92a8306fa97c6a772327ae955cc410ca9611000820152733a187b5285e0cbac774a335b5315a64b4a9173c361102082015273abaefebc2a98dc02c0fa6d7f88cff5368c1bfee761104082015273da862466999c1bb7d6d38b9c5457bc5627b80bdc61106082015273df5405e5d59e3421f4735efe49b63f0c1ec25cf96110808201527372dd867f119e044e31e6bd52e1fa6b7605dad4a46110a082015273f69ea0522ac7022a029bc03a283725ac6b75d0c76110c082015273399f1c2a3771eae1b9d53a5fa8209834868e8cac6110e0820152730af35d19326bb11a0d99bb4b430db864ab857c14611100820152734397c6ab5896c8d8b21707b030e93e7037b8643d61112082015273631b2323d11ab1f3f5e09a0f695680379d488bd261114082015273aba746caa87c9ab74b69c609a4f69cc0120fc83261116082015273d4972f305f31a701ab5f3882043464388166912c6111808201527338def4f28d0071a7d9b207e6f461a67e21b8a1de6111a082015273101f8df4e312aa4f6ebb24241705f157165069636111c0820152735cd39d7db616e60b56f1593b44a9deadbcbc2cce6111e08201527386ab8922f09923de21ecbb2e7c62d6b869772833611200820152731765e68365fdb0935f9522093919950b8ca987106112208201527301df827543dc9dd766b2492e29ef1a985645ba47611240820152736e70a7cdc413dbebf957bb5fd16c61b6665c8bae61126082015273240a14190554e158f4e561bcead6465038b71f4661128082015273e2bac6b98eca59106f4a5bf4b5f96f299456aaf06112a082015273c1afb128b3efc6d0fa8068ce608ecec3fdcf5bbf6112c082015273178980bebd6a5abcda83cb45a9a9b9604995047d6112e082015273b066d0d76c21db10e0d583e0d945efc1128fa0b16113008201527315ba99dfbb8e8e2b3ab57ef23e20e93e0ca658f1611320820152738109d2849592202d07790557cd95f17310099562611340820152735e3f84e3b1d2896e1ac3d7d08b1f1106d0d3b209611360820152734acec241ea60c06d6ab6722ebef98725dec3825b611380820152738822354e02e5ada352883f4d766fc6171e5e453c6113a0820152738de855b819b9d720f52479e92ff746721bb22f866113c082015273d81e746ec71fe9a095958c69100261d73c4718b66113e08201527365372ce086f71dbf2942b123a61b18c4d1040e2e61140082015273a0a828934e6e503effa076193c83abd9bad4ec2f61142082015273583f3d3a013f3c46882bd0c7c73135fb7363275661144082015273d9dc731caf241acc7daac1510046bf31bdd5772f611460820152736f413b49673d2f918cde926256ab1b7191a872876114808201527340a525edb28f6e9a1c52d310fad4201145862c3f6114a0820152736ea9823d35d0da30bc0e801c61d9b9101061d8bf6114c082015273b482fd5076ecd520cded29881bd656183d2d70646114e0820152738c9bbd383edc0dc7b207cb3edea4e2d1a47507f76115008201527327d56763f4e73956e5ce834d6e6c7710aa3521d361152082015273b721bbda1a7e2608cf66bcf3b3b513103cf69df9611540820152733d7ddb051efb0846abab9ada0168d5eccad7239d611560820152734c566f07bd8c55dc63caadc7dd272d3fbef13c31611580820152731072dd569516864dd3800c75a4a980a1eb30dc636115a082015273d58b7f2722371aa92c929272094c3a65482c04296115c082015273a942b1af9cabc692e8a5d80624abb9f5e282514b6115e082015273ddeb9f48ef957c3eac8b2d9756979ef5471bc05f6116008201527370d860cb44d51b54062ac1f72d07b32e5843e550611620820152736276a59fa36661e817ee213b00dbb07f3405032a61164082015273805aa254d2ba27d7c086c482ddd9c78288c879636116608201527319e11fa7a09fa2e5a2d6bbbff3019aebeff56434611680820152730b46e106b4c1a3e34a4873a46af4154d7446d1756116a0820152734bacf4cbdd730da5e2d2e777971ad7508ed08c326116c082015273877d5e75368ee1311623fd1cffc83fe0582719fa6116e082015273543ed6291570356c650b6ba64d31b9db036f0ad161170082015273ebf8da1268d9510c01e9b3ea362771625863aa416117208201527322fbcf63f259cc6e54e58dddc162d50eaab0d03461174082015273b9fb6f62fd54a0425ca448b564151b1b9d74ba2a61176082015273c1b21238311f98737a81f247bed51f4455c4c1de61178082015273fd808ad0b0942488e8de71cf202ab9f55adb2a2d6117a0820152737ef0d352f7a77c0df51def796e63a008234a7cda6117c08201527340fe266804031663dc7ec4ce4ea549a9de132a826117e082015273333f0ffde35190b5781765499282c429f12d82b4611800820152738b71fd26ed10a14f496965c4afc65563a08fbc3561182082015273674d6a5ba766e6d43d907bb91c7bc88214d5e78c6118408201527383c672932d131989d642c28aae4341f06aee909061186082015273ee72b38f98bd65811e26b2d239ec94d30c1f9457611880820152730c5c79bf4fc8f85935932eedd085c879d5cfe89d6118a0820152735c9a49a19c0ed8aee4e5c560989a126fe01568ac6118c0820152739d89ef8993101ade6ea898004d1a59f83fc9abf86118e0820152732e0dbe68b6302b8ecd423a153b938879147ee80b611900820152736202a837d7e9f8443c0dd422b2cc1b124ffb1b27611920820152730fb122228d710ea0d49d914ed702660663c6b81f61194082015273eb5a0709188e324d5c93b2048c8e8ef54d31cac161196082015273061db8b26d26a8aab4be7bea45a095ebc51da269611980820152734ee4bda6892769d6e2f653e1bca2b667efc7116c6119a08201527343a1e818131aa25eaf855563bfa53d6972d98a496119c082015273635b1d201edd1c2ef315959136d3e6b0741c25736119e082015273bc7831bb8af4430c59fcf8c89f652f4adaee82f3611a0082015273d760adbe1e1f33a7714585a4cb866634f127fd7e611a2082015273b49fe211c2a96796cd13e363d837a8cb347222ec611a4082015273e5c02961bd96181ed6de8415f9c6e766da6e62fe611a608201527318c1c3cfb7ba9c5506fe5d3be705dcfc87e96aac611a8082015273f438c974979a742ca33e76702d6257e6606c93bd611aa082015273a89fb3e1ac5fbf850e035140e0e03f7eb663e3a1611ac082015273ddfb4ae2d6b5cd791f0f34a2589745d333cdc0b6611ae08201527377f68e3750ff8949b6f60ae99285dd8c54796a0f611b00820152735f6a5e189e66ab884716dda3bb1ecd512926c52a611b208201527333e37c3ded2347fbdcca7d06149819bb5adc8948611b40820152731893adea7c33df16af0eda122a24576ea27b5e58611b6082015273275db603d79e3438082d16b31a89f6d86ce886b9611b8082015273ba42c5361fc138e62448b1c16cb0c56405d36f8a611ba082015273d5d52fe39b4fe64782924cfeb36f655293c1cd21611bc08201527393690461768e7bfec1dc72e341fc702d5690d8cd611be0820152736a565970c37ec3d9a6b7169be0e419e91d173c8f611c0082015273382a21b40a36eeaf94d7d6bff8acaf55ca0937f5611c2082015273909e3d07fc00c46326263739db6053676d17e964611c40820152735987a436ca03940f3f42a06bcddfc268f6f7acc1611c608201526200271490601a9060e462002f03565b503480156200272257600080fd5b5060188054806020026020016040519081016040528092919081815260200182805480156200277b57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116200275c575b50505050506017805480602002602001604051908101604052809291908181526020018280548015620027ce57602002820191906000526020600020905b815481526020019060010190808311620027b9575b50505050506040518060400160405280601c81526020017f506172726f74736020466967687420436c7562204f6666696369616c000000008152506040518060400160405280600381526020016250464360e81b8152506200283f6200283962002a7760201b60201c565b62002a7b565b81516200285490600190602085019062002e31565b5080516200286a90600290602084019062002e31565b5050508051825114620028df5760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620029325760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207061796565730000000000006044820152606401620028d6565b60005b82518110156200299e576200298983828151811062002958576200295862002ffe565b602002602001015183838151811062002975576200297562002ffe565b602002602001015162002acb60201b60201c565b80620029958162002fca565b91505062002935565b50505062002a096019805480602002602001604051908101604052809291908181526020018280548015620029fd57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311620029de575b505062002cb992505050565b62002a71601a80548060200260200160405190810160405280929190818152602001828054801562002a6557602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831162002a46575b505062002d7792505050565b62003014565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03821662002b385760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b6064820152608401620028d6565b6000811162002b8a5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a207368617265732061726520300000006044820152606401620028d6565b6001600160a01b0382166000908152600960205260409020541562002c065760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b6064820152608401620028d6565b600b8054600181019091557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b038416908117909155600090815260096020526040902081905560075462002c7090829062002f72565b600755604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b6000546001600160a01b0316331462002d045760405162461bcd60e51b81526020600482018190526024820152600080516020620062c58339815191526044820152606401620028d6565b60005b815181101562002d735760016015600084848151811062002d2c5762002d2c62002ffe565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558062002d6a8162002fca565b91505062002d07565b5050565b6000546001600160a01b0316331462002dc25760405162461bcd60e51b81526020600482018190526024820152600080516020620062c58339815191526044820152606401620028d6565b60005b815181101562002d735760016014600084848151811062002dea5762002dea62002ffe565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558062002e288162002fca565b91505062002dc5565b82805462002e3f9062002f8d565b90600052602060002090601f01602090048101928262002e63576000855562002eae565b82601f1062002e7e57805160ff191683800117855562002eae565b8280016001018555821562002eae579182015b8281111562002eae57825182559160200191906001019062002e91565b5062002ebc92915062002f5b565b5090565b82805482825590600052602060002090810192821562002eae579160200282015b8281111562002eae578251829060ff1690559160200191906001019062002ee1565b82805482825590600052602060002090810192821562002eae579160200282015b8281111562002eae57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062002f24565b5b8082111562002ebc576000815560010162002f5c565b6000821982111562002f885762002f8862002fe8565b500190565b600181811c9082168062002fa257607f821691505b6020821081141562002fc457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141562002fe15762002fe162002fe8565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6132a180620030246000396000f3fe6080604052600436106103035760003560e01c8063831e60de11610190578063c6682862116100dc578063d79779b211610095578063e93244441161006f578063e9324444146109f0578063e985e9c514610a11578063f2fde38b14610a5a578063f5dc447214610a7a57600080fd5b8063d79779b214610985578063da3ef23f146109bb578063e33b7de3146109db57600080fd5b8063c6682862146108d4578063c87b56dd146108e9578063cb5d748e14610909578063cc9ff9c61461091e578063ce7c2ac214610934578063d5abeb011461096a57600080fd5b8063a22cb46511610149578063b88d4fde11610123578063b88d4fde1461084c578063ba7d2c761461086c578063bd79caa01461089f578063c27f45db146108bf57600080fd5b8063a22cb465146107c3578063ad74d598146107e3578063b51aed561461081357600080fd5b8063831e60de146107125780638b83209b146107275780638da5cb5b1461074757806395d89b41146107655780639852595c1461077a578063a0712d68146107b057600080fd5b80633af32abf1161024f5780636352211e1161020857806371adc02a116101e257806371adc02a1461069a578063730bc9cf146106bb578063774a8835146106db5780637effc032146106f057600080fd5b80636352211e1461064557806370a0823114610665578063715018a61461068557600080fd5b80633af32abf14610539578063406072a91461057257806342842e0e146105b8578063438b6300146105d857806348b750441461060557806355f804b31461062557600080fd5b806313faede6116102bc578063239c70ae11610296578063239c70ae146104a057806323b872dd146104d757806327e235e3146104f75780633a98ef391461052457600080fd5b806313faede61461044757806318160ddd1461046b578063191655871461048057600080fd5b806301ffc9a71461035157806306c933d81461038657806306fdde03146103b6578063081812fc146103d8578063095ea7b31461041057806311ec618f1461043257600080fd5b3661034c577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561035d57600080fd5b5061037161036c366004612cab565b610a9a565b60405190151581526020015b60405180910390f35b34801561039257600080fd5b506103716103a1366004612a64565b60146020526000908152604090205460ff1681565b3480156103c257600080fd5b506103cb610aec565b60405161037d9190612eed565b3480156103e457600080fd5b506103f86103f3366004612d2e565b610b7e565b6040516001600160a01b03909116815260200161037d565b34801561041c57600080fd5b5061043061042b366004612ba9565b610c18565b005b34801561043e57600080fd5b50610430610d2e565b34801561045357600080fd5b5061045d60125481565b60405190815260200161037d565b34801561047757600080fd5b5061045d610d6e565b34801561048c57600080fd5b5061043061049b366004612a64565b610d7e565b3480156104ac57600080fd5b506013546104c49065010000000000900461ffff1681565b60405161ffff909116815260200161037d565b3480156104e357600080fd5b506104306104f2366004612aba565b610eac565b34801561050357600080fd5b5061045d610512366004612a64565b60166020526000908152604090205481565b34801561053057600080fd5b5060075461045d565b34801561054557600080fd5b50610371610554366004612a64565b6001600160a01b031660009081526014602052604090205460ff1690565b34801561057e57600080fd5b5061045d61058d366004612a81565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b3480156105c457600080fd5b506104306105d3366004612aba565b610edd565b3480156105e457600080fd5b506105f86105f3366004612a64565b610ef8565b60405161037d9190612ea9565b34801561061157600080fd5b50610430610620366004612a81565b610fdc565b34801561063157600080fd5b50610430610640366004612ce5565b6111c4565b34801561065157600080fd5b506103f8610660366004612d2e565b611205565b34801561067157600080fd5b5061045d610680366004612a64565b61127c565b34801561069157600080fd5b50610430611303565b3480156106a657600080fd5b5060135461037190600160481b900460ff1681565b3480156106c757600080fd5b506104306106d6366004612bd5565b611339565b3480156106e757600080fd5b506103cb6113cb565b3480156106fc57600080fd5b506013546104c4906301000000900461ffff1681565b34801561071e57600080fd5b5061045d61144c565b34801561073357600080fd5b506103f8610742366004612d2e565b6114a9565b34801561075357600080fd5b506000546001600160a01b03166103f8565b34801561077157600080fd5b506103cb6114d9565b34801561078657600080fd5b5061045d610795366004612a64565b6001600160a01b03166000908152600a602052604090205490565b6104306107be366004612d2e565b6114e8565b3480156107cf57600080fd5b506104306107de366004612b7b565b6116c7565b3480156107ef57600080fd5b506103716107fe366004612a64565b60156020526000908152604090205460ff1681565b34801561081f57600080fd5b5061037161082e366004612a64565b6001600160a01b031660009081526015602052604090205460ff1690565b34801561085857600080fd5b50610430610867366004612afb565b6116d2565b34801561087857600080fd5b5060135461088d90600160381b900460ff1681565b60405160ff909116815260200161037d565b3480156108ab57600080fd5b5060135461088d9062010000900460ff1681565b3480156108cb57600080fd5b50610430611704565b3480156108e057600080fd5b506103cb611744565b3480156108f557600080fd5b506103cb610904366004612d2e565b6117d2565b34801561091557600080fd5b506104306118b0565b34801561092a57600080fd5b5061045d60115481565b34801561094057600080fd5b5061045d61094f366004612a64565b6001600160a01b031660009081526009602052604090205490565b34801561097657600080fd5b506013546104c49061ffff1681565b34801561099157600080fd5b5061045d6109a0366004612a64565b6001600160a01b03166000908152600c602052604090205490565b3480156109c757600080fd5b506104306109d6366004612ce5565b61192c565b3480156109e757600080fd5b5060085461045d565b3480156109fc57600080fd5b5060135461037190600160401b900460ff1681565b348015610a1d57600080fd5b50610371610a2c366004612a81565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610a6657600080fd5b50610430610a75366004612a64565b611969565b348015610a8657600080fd5b50610430610a95366004612bd5565b611a01565b60006001600160e01b031982166380ac58cd60e01b1480610acb57506001600160e01b03198216635b5e139f60e01b145b80610ae657506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610afb90613170565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2790613170565b8015610b745780601f10610b4957610100808354040283529160200191610b74565b820191906000526020600020905b815481529060010190602001808311610b5757829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610bfc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610c2382611205565b9050806001600160a01b0316836001600160a01b03161415610c915760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610bf3565b336001600160a01b0382161480610cad5750610cad8133610a2c565b610d1f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610bf3565b610d298383611a93565b505050565b6000546001600160a01b03163314610d585760405162461bcd60e51b8152600401610bf39061302b565b6013805461ffff60401b1916600160481b179055565b6000610d79600e5490565b905090565b6001600160a01b038116600090815260096020526040902054610db35760405162461bcd60e51b8152600401610bf390612f52565b6000610dbe60085490565b610dc890476130e2565b90506000610df58383610df0866001600160a01b03166000908152600a602052604090205490565b611b01565b905080610e145760405162461bcd60e51b8152600401610bf390612fe0565b6001600160a01b0383166000908152600a602052604081208054839290610e3c9084906130e2565b925050819055508060086000828254610e5591906130e2565b90915550610e6590508382611b47565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b610eb63382611c60565b610ed25760405162461bcd60e51b8152600401610bf390613060565b610d29838383611d56565b610d29838383604051806020016040528060008152506116d2565b60606000610f058361127c565b905060008167ffffffffffffffff811115610f2257610f2261321c565b604051908082528060200260200182016040528015610f4b578160200160208202803683370190505b5090506000805b8381108015610f67575060135461ffff168211155b15610fd2576000610f7783611205565b9050866001600160a01b0316816001600160a01b03161415610fbf5782848381518110610fa657610fa6613206565b602090810291909101015281610fbb816131ab565b9250505b82610fc9816131ab565b93505050610f52565b5090949350505050565b6001600160a01b0381166000908152600960205260409020546110115760405162461bcd60e51b8152600401610bf390612f52565b6001600160a01b0382166000908152600c60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561106957600080fd5b505afa15801561107d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a19190612d47565b6110ab91906130e2565b905060006110e48383610df087876001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b9050806111035760405162461bcd60e51b8152600401610bf390612fe0565b6001600160a01b038085166000908152600d602090815260408083209387168352929052908120805483929061113a9084906130e2565b90915550506001600160a01b0384166000908152600c6020526040812080548392906111679084906130e2565b909155506111789050848483611ef6565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b6000546001600160a01b031633146111ee5760405162461bcd60e51b8152600401610bf39061302b565b805161120190600f906020840190612973565b5050565b6000818152600360205260408120546001600160a01b031680610ae65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610bf3565b60006001600160a01b0382166112e75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610bf3565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b0316331461132d5760405162461bcd60e51b8152600401610bf39061302b565b6113376000611f48565b565b6000546001600160a01b031633146113635760405162461bcd60e51b8152600401610bf39061302b565b60005b81518110156112015760016014600084848151811061138757611387613206565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806113c3816131ab565b915050611366565b601354606090600160401b900460ff1615611402575060408051808201909152600781526670726553616c6560c81b602082015290565b601354600160481b900460ff1615611439575060408051808201909152600a8152697075626c696353616c6560b01b602082015290565b5060408051602081019091526000815290565b601354600090600160481b900460ff1615156001141561146d575060125490565b601354600160401b900460ff161515600114156114a3573360009081526014602052604090205460ff16156114a3575060115490565b50600090565b6000600b82815481106114be576114be613206565b6000918252602090912001546001600160a01b031692915050565b606060028054610afb90613170565b80600081116115395760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610bf3565b60135461ffff168261154a600e5490565b61155491906130e2565b111561159b5760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610bf3565b601354600160401b900460ff161515600114806115c65750601354600160481b900460ff1615156001145b6116055760405162461bcd60e51b815260206004820152601060248201526f1cd85b19481b9bdd081cdd185c9d195960821b6044820152606401610bf3565b60006116103361127c565b601354909150600160401b900460ff1615611654573360009081526014602052604090205460ff161561164b5761164683611f98565b61165e565b611646836120d5565b61165e81846121a0565b60005b838110156116c1573360009081526016602052604081208054600192906116899084906130e2565b909155506116a190503361169c600e5490565b612286565b6116af600e80546001019055565b806116b9816131ab565b915050611661565b50505050565b6112013383836122a0565b6116dc3383611c60565b6116f85760405162461bcd60e51b8152600401610bf390613060565b6116c18484848461236f565b6000546001600160a01b0316331461172e5760405162461bcd60e51b8152600401610bf39061302b565b6013805461ffff60401b1916600160401b179055565b6010805461175190613170565b80601f016020809104026020016040519081016040528092919081815260200182805461177d90613170565b80156117ca5780601f1061179f576101008083540402835291602001916117ca565b820191906000526020600020905b8154815290600101906020018083116117ad57829003601f168201915b505050505081565b6000818152600360205260409020546060906001600160a01b03166118515760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610bf3565b600061185b6123a2565b9050600081511161187b57604051806020016040528060008152506118a9565b80611885846123b1565b601060405160200161189993929190612da8565b6040516020818303038152906040525b9392505050565b6000546001600160a01b031633146118da5760405162461bcd60e51b8152600401610bf39061302b565b60005b60185481101561192957611917601882815481106118fd576118fd613206565b6000918252602090912001546001600160a01b0316610d7e565b80611921816131ab565b9150506118dd565b50565b6000546001600160a01b031633146119565760405162461bcd60e51b8152600401610bf39061302b565b8051611201906010906020840190612973565b6000546001600160a01b031633146119935760405162461bcd60e51b8152600401610bf39061302b565b6001600160a01b0381166119f85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bf3565b61192981611f48565b6000546001600160a01b03163314611a2b5760405162461bcd60e51b8152600401610bf39061302b565b60005b815181101561120157600160156000848481518110611a4f57611a4f613206565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611a8b816131ab565b915050611a2e565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611ac882611205565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6007546001600160a01b03841660009081526009602052604081205490918391611b2b908661310e565b611b3591906130fa565b611b3f919061312d565b949350505050565b80471015611b975760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bf3565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611be4576040519150601f19603f3d011682016040523d82523d6000602084013e611be9565b606091505b5050905080610d295760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bf3565b6000818152600360205260408120546001600160a01b0316611cd95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bf3565b6000611ce483611205565b9050806001600160a01b0316846001600160a01b03161480611d1f5750836001600160a01b0316611d1484610b7e565b6001600160a01b0316145b80611b3f57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff16949350505050565b826001600160a01b0316611d6982611205565b6001600160a01b031614611dd15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610bf3565b6001600160a01b038216611e335760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610bf3565b611e3e600082611a93565b6001600160a01b0383166000908152600460205260408120805460019290611e6790849061312d565b90915550506001600160a01b0382166000908152600460205260408120805460019290611e959084906130e2565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d299084906124af565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3360009081526014602052604090205460ff16611ff75760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f742077686974656c69737465640000000000000000006044820152606401610bf3565b80601154612005919061310e565b3410156120495760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610bf3565b6013546301000000900461ffff168111156120765760405162461bcd60e51b8152600401610bf390612f98565b336000908152601660205260409020546001116119295760405162461bcd60e51b815260206004820152601760248201527f796f75206861766520616c7265616479206d696e7465640000000000000000006044820152606401610bf3565b3360009081526015602052604090205460ff166121345760405162461bcd60e51b815260206004820152601c60248201527f75736572206973206e6f7420696e20667265656d696e74206c697374000000006044820152606401610bf3565b60135462010000900460ff168111156120765760405162461bcd60e51b815260206004820152602860248201527f6d6178206d696e7420616d6f756e7420707265207472616e73616374696f6e20604482015267195e18d95959195960c21b6064820152608401610bf3565b601354600160381b900460ff166121b782846130e2565b11156122055760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e4654207065722061646472657373206578636565646564000000006044820152606401610bf3565b80601254612213919061310e565b3410156122575760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610bf3565b60135465010000000000900461ffff168111156112015760405162461bcd60e51b8152600401610bf390612f98565b611201828260405180602001604052806000815250612581565b816001600160a01b0316836001600160a01b031614156123025760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610bf3565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61237a848484611d56565b612386848484846125b4565b6116c15760405162461bcd60e51b8152600401610bf390612f00565b6060600f8054610afb90613170565b6060816123d55750506040805180820190915260018152600360fc1b602082015290565b8160005b81156123ff57806123e9816131ab565b91506123f89050600a836130fa565b91506123d9565b60008167ffffffffffffffff81111561241a5761241a61321c565b6040519080825280601f01601f191660200182016040528015612444576020820181803683370190505b5090505b8415611b3f5761245960018361312d565b9150612466600a866131c6565b6124719060306130e2565b60f81b81838151811061248657612486613206565b60200101906001600160f81b031916908160001a9053506124a8600a866130fa565b9450612448565b6000612504826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166126c19092919063ffffffff16565b805190915015610d2957808060200190518101906125229190612c8e565b610d295760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610bf3565b61258b83836126d0565b61259860008484846125b4565b610d295760405162461bcd60e51b8152600401610bf390612f00565b60006001600160a01b0384163b156126b657604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906125f8903390899088908890600401612e6c565b602060405180830381600087803b15801561261257600080fd5b505af1925050508015612642575060408051601f3d908101601f1916820190925261263f91810190612cc8565b60015b61269c573d808015612670576040519150601f19603f3d011682016040523d82523d6000602084013e612675565b606091505b5080516126945760405162461bcd60e51b8152600401610bf390612f00565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b3f565b506001949350505050565b6060611b3f8484600085612812565b6001600160a01b0382166127265760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610bf3565b6000818152600360205260409020546001600160a01b03161561278b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bf3565b6001600160a01b03821660009081526004602052604081208054600192906127b49084906130e2565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060824710156128735760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610bf3565b843b6128c15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bf3565b600080866001600160a01b031685876040516128dd9190612d8c565b60006040518083038185875af1925050503d806000811461291a576040519150601f19603f3d011682016040523d82523d6000602084013e61291f565b606091505b509150915061292f82828661293a565b979650505050505050565b606083156129495750816118a9565b8251156129595782518084602001fd5b8160405162461bcd60e51b8152600401610bf39190612eed565b82805461297f90613170565b90600052602060002090601f0160209004810192826129a157600085556129e7565b82601f106129ba57805160ff19168380011785556129e7565b828001600101855582156129e7579182015b828111156129e75782518255916020019190600101906129cc565b506129f39291506129f7565b5090565b5b808211156129f357600081556001016129f8565b600067ffffffffffffffff831115612a2657612a2661321c565b612a39601f8401601f19166020016130b1565b9050828152838383011115612a4d57600080fd5b828260208301376000602084830101529392505050565b600060208284031215612a7657600080fd5b81356118a981613232565b60008060408385031215612a9457600080fd5b8235612a9f81613232565b91506020830135612aaf81613232565b809150509250929050565b600080600060608486031215612acf57600080fd5b8335612ada81613232565b92506020840135612aea81613232565b929592945050506040919091013590565b60008060008060808587031215612b1157600080fd5b8435612b1c81613232565b93506020850135612b2c81613232565b925060408501359150606085013567ffffffffffffffff811115612b4f57600080fd5b8501601f81018713612b6057600080fd5b612b6f87823560208401612a0c565b91505092959194509250565b60008060408385031215612b8e57600080fd5b8235612b9981613232565b91506020830135612aaf81613247565b60008060408385031215612bbc57600080fd5b8235612bc781613232565b946020939093013593505050565b60006020808385031215612be857600080fd5b823567ffffffffffffffff80821115612c0057600080fd5b818501915085601f830112612c1457600080fd5b813581811115612c2657612c2661321c565b8060051b9150612c378483016130b1565b8181528481019084860184860187018a1015612c5257600080fd5b600095505b83861015612c815780359450612c6c85613232565b84835260019590950194918601918601612c57565b5098975050505050505050565b600060208284031215612ca057600080fd5b81516118a981613247565b600060208284031215612cbd57600080fd5b81356118a981613255565b600060208284031215612cda57600080fd5b81516118a981613255565b600060208284031215612cf757600080fd5b813567ffffffffffffffff811115612d0e57600080fd5b8201601f81018413612d1f57600080fd5b611b3f84823560208401612a0c565b600060208284031215612d4057600080fd5b5035919050565b600060208284031215612d5957600080fd5b5051919050565b60008151808452612d78816020860160208601613144565b601f01601f19169290920160200192915050565b60008251612d9e818460208701613144565b9190910192915050565b600084516020612dbb8285838a01613144565b855191840191612dce8184848a01613144565b8554920191600090600181811c9080831680612deb57607f831692505b858310811415612e0957634e487b7160e01b85526022600452602485fd5b808015612e1d5760018114612e2e57612e5b565b60ff19851688528388019550612e5b565b60008b81526020902060005b85811015612e535781548a820152908401908801612e3a565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e9f90830184612d60565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612ee157835183529284019291840191600101612ec5565b50909695505050505050565b6020815260006118a96020830184612d60565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b60208082526028908201527f6d6178206d696e7420616d6f756e7420706572207472616e73616374696f6e20604082015267195e18d95959195960c21b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156130da576130da61321c565b604052919050565b600082198211156130f5576130f56131da565b500190565b600082613109576131096131f0565b500490565b6000816000190483118215151615613128576131286131da565b500290565b60008282101561313f5761313f6131da565b500390565b60005b8381101561315f578181015183820152602001613147565b838111156116c15750506000910152565b600181811c9082168061318457607f821691505b602082108114156131a557634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156131bf576131bf6131da565b5060010190565b6000826131d5576131d56131f0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461192957600080fd5b801515811461192957600080fd5b6001600160e01b03198116811461192957600080fdfea2646970667358221220f133e921e5e03232965d943c66b4e271565b8d6e2793a760be161a0edebda13f64736f6c634300080700334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x6080604052600436106103035760003560e01c8063831e60de11610190578063c6682862116100dc578063d79779b211610095578063e93244441161006f578063e9324444146109f0578063e985e9c514610a11578063f2fde38b14610a5a578063f5dc447214610a7a57600080fd5b8063d79779b214610985578063da3ef23f146109bb578063e33b7de3146109db57600080fd5b8063c6682862146108d4578063c87b56dd146108e9578063cb5d748e14610909578063cc9ff9c61461091e578063ce7c2ac214610934578063d5abeb011461096a57600080fd5b8063a22cb46511610149578063b88d4fde11610123578063b88d4fde1461084c578063ba7d2c761461086c578063bd79caa01461089f578063c27f45db146108bf57600080fd5b8063a22cb465146107c3578063ad74d598146107e3578063b51aed561461081357600080fd5b8063831e60de146107125780638b83209b146107275780638da5cb5b1461074757806395d89b41146107655780639852595c1461077a578063a0712d68146107b057600080fd5b80633af32abf1161024f5780636352211e1161020857806371adc02a116101e257806371adc02a1461069a578063730bc9cf146106bb578063774a8835146106db5780637effc032146106f057600080fd5b80636352211e1461064557806370a0823114610665578063715018a61461068557600080fd5b80633af32abf14610539578063406072a91461057257806342842e0e146105b8578063438b6300146105d857806348b750441461060557806355f804b31461062557600080fd5b806313faede6116102bc578063239c70ae11610296578063239c70ae146104a057806323b872dd146104d757806327e235e3146104f75780633a98ef391461052457600080fd5b806313faede61461044757806318160ddd1461046b578063191655871461048057600080fd5b806301ffc9a71461035157806306c933d81461038657806306fdde03146103b6578063081812fc146103d8578063095ea7b31461041057806311ec618f1461043257600080fd5b3661034c577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561035d57600080fd5b5061037161036c366004612cab565b610a9a565b60405190151581526020015b60405180910390f35b34801561039257600080fd5b506103716103a1366004612a64565b60146020526000908152604090205460ff1681565b3480156103c257600080fd5b506103cb610aec565b60405161037d9190612eed565b3480156103e457600080fd5b506103f86103f3366004612d2e565b610b7e565b6040516001600160a01b03909116815260200161037d565b34801561041c57600080fd5b5061043061042b366004612ba9565b610c18565b005b34801561043e57600080fd5b50610430610d2e565b34801561045357600080fd5b5061045d60125481565b60405190815260200161037d565b34801561047757600080fd5b5061045d610d6e565b34801561048c57600080fd5b5061043061049b366004612a64565b610d7e565b3480156104ac57600080fd5b506013546104c49065010000000000900461ffff1681565b60405161ffff909116815260200161037d565b3480156104e357600080fd5b506104306104f2366004612aba565b610eac565b34801561050357600080fd5b5061045d610512366004612a64565b60166020526000908152604090205481565b34801561053057600080fd5b5060075461045d565b34801561054557600080fd5b50610371610554366004612a64565b6001600160a01b031660009081526014602052604090205460ff1690565b34801561057e57600080fd5b5061045d61058d366004612a81565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b3480156105c457600080fd5b506104306105d3366004612aba565b610edd565b3480156105e457600080fd5b506105f86105f3366004612a64565b610ef8565b60405161037d9190612ea9565b34801561061157600080fd5b50610430610620366004612a81565b610fdc565b34801561063157600080fd5b50610430610640366004612ce5565b6111c4565b34801561065157600080fd5b506103f8610660366004612d2e565b611205565b34801561067157600080fd5b5061045d610680366004612a64565b61127c565b34801561069157600080fd5b50610430611303565b3480156106a657600080fd5b5060135461037190600160481b900460ff1681565b3480156106c757600080fd5b506104306106d6366004612bd5565b611339565b3480156106e757600080fd5b506103cb6113cb565b3480156106fc57600080fd5b506013546104c4906301000000900461ffff1681565b34801561071e57600080fd5b5061045d61144c565b34801561073357600080fd5b506103f8610742366004612d2e565b6114a9565b34801561075357600080fd5b506000546001600160a01b03166103f8565b34801561077157600080fd5b506103cb6114d9565b34801561078657600080fd5b5061045d610795366004612a64565b6001600160a01b03166000908152600a602052604090205490565b6104306107be366004612d2e565b6114e8565b3480156107cf57600080fd5b506104306107de366004612b7b565b6116c7565b3480156107ef57600080fd5b506103716107fe366004612a64565b60156020526000908152604090205460ff1681565b34801561081f57600080fd5b5061037161082e366004612a64565b6001600160a01b031660009081526015602052604090205460ff1690565b34801561085857600080fd5b50610430610867366004612afb565b6116d2565b34801561087857600080fd5b5060135461088d90600160381b900460ff1681565b60405160ff909116815260200161037d565b3480156108ab57600080fd5b5060135461088d9062010000900460ff1681565b3480156108cb57600080fd5b50610430611704565b3480156108e057600080fd5b506103cb611744565b3480156108f557600080fd5b506103cb610904366004612d2e565b6117d2565b34801561091557600080fd5b506104306118b0565b34801561092a57600080fd5b5061045d60115481565b34801561094057600080fd5b5061045d61094f366004612a64565b6001600160a01b031660009081526009602052604090205490565b34801561097657600080fd5b506013546104c49061ffff1681565b34801561099157600080fd5b5061045d6109a0366004612a64565b6001600160a01b03166000908152600c602052604090205490565b3480156109c757600080fd5b506104306109d6366004612ce5565b61192c565b3480156109e757600080fd5b5060085461045d565b3480156109fc57600080fd5b5060135461037190600160401b900460ff1681565b348015610a1d57600080fd5b50610371610a2c366004612a81565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610a6657600080fd5b50610430610a75366004612a64565b611969565b348015610a8657600080fd5b50610430610a95366004612bd5565b611a01565b60006001600160e01b031982166380ac58cd60e01b1480610acb57506001600160e01b03198216635b5e139f60e01b145b80610ae657506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610afb90613170565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2790613170565b8015610b745780601f10610b4957610100808354040283529160200191610b74565b820191906000526020600020905b815481529060010190602001808311610b5757829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610bfc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610c2382611205565b9050806001600160a01b0316836001600160a01b03161415610c915760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610bf3565b336001600160a01b0382161480610cad5750610cad8133610a2c565b610d1f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610bf3565b610d298383611a93565b505050565b6000546001600160a01b03163314610d585760405162461bcd60e51b8152600401610bf39061302b565b6013805461ffff60401b1916600160481b179055565b6000610d79600e5490565b905090565b6001600160a01b038116600090815260096020526040902054610db35760405162461bcd60e51b8152600401610bf390612f52565b6000610dbe60085490565b610dc890476130e2565b90506000610df58383610df0866001600160a01b03166000908152600a602052604090205490565b611b01565b905080610e145760405162461bcd60e51b8152600401610bf390612fe0565b6001600160a01b0383166000908152600a602052604081208054839290610e3c9084906130e2565b925050819055508060086000828254610e5591906130e2565b90915550610e6590508382611b47565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b610eb63382611c60565b610ed25760405162461bcd60e51b8152600401610bf390613060565b610d29838383611d56565b610d29838383604051806020016040528060008152506116d2565b60606000610f058361127c565b905060008167ffffffffffffffff811115610f2257610f2261321c565b604051908082528060200260200182016040528015610f4b578160200160208202803683370190505b5090506000805b8381108015610f67575060135461ffff168211155b15610fd2576000610f7783611205565b9050866001600160a01b0316816001600160a01b03161415610fbf5782848381518110610fa657610fa6613206565b602090810291909101015281610fbb816131ab565b9250505b82610fc9816131ab565b93505050610f52565b5090949350505050565b6001600160a01b0381166000908152600960205260409020546110115760405162461bcd60e51b8152600401610bf390612f52565b6001600160a01b0382166000908152600c60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561106957600080fd5b505afa15801561107d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a19190612d47565b6110ab91906130e2565b905060006110e48383610df087876001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b9050806111035760405162461bcd60e51b8152600401610bf390612fe0565b6001600160a01b038085166000908152600d602090815260408083209387168352929052908120805483929061113a9084906130e2565b90915550506001600160a01b0384166000908152600c6020526040812080548392906111679084906130e2565b909155506111789050848483611ef6565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b6000546001600160a01b031633146111ee5760405162461bcd60e51b8152600401610bf39061302b565b805161120190600f906020840190612973565b5050565b6000818152600360205260408120546001600160a01b031680610ae65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610bf3565b60006001600160a01b0382166112e75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610bf3565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b0316331461132d5760405162461bcd60e51b8152600401610bf39061302b565b6113376000611f48565b565b6000546001600160a01b031633146113635760405162461bcd60e51b8152600401610bf39061302b565b60005b81518110156112015760016014600084848151811061138757611387613206565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806113c3816131ab565b915050611366565b601354606090600160401b900460ff1615611402575060408051808201909152600781526670726553616c6560c81b602082015290565b601354600160481b900460ff1615611439575060408051808201909152600a8152697075626c696353616c6560b01b602082015290565b5060408051602081019091526000815290565b601354600090600160481b900460ff1615156001141561146d575060125490565b601354600160401b900460ff161515600114156114a3573360009081526014602052604090205460ff16156114a3575060115490565b50600090565b6000600b82815481106114be576114be613206565b6000918252602090912001546001600160a01b031692915050565b606060028054610afb90613170565b80600081116115395760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610bf3565b60135461ffff168261154a600e5490565b61155491906130e2565b111561159b5760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610bf3565b601354600160401b900460ff161515600114806115c65750601354600160481b900460ff1615156001145b6116055760405162461bcd60e51b815260206004820152601060248201526f1cd85b19481b9bdd081cdd185c9d195960821b6044820152606401610bf3565b60006116103361127c565b601354909150600160401b900460ff1615611654573360009081526014602052604090205460ff161561164b5761164683611f98565b61165e565b611646836120d5565b61165e81846121a0565b60005b838110156116c1573360009081526016602052604081208054600192906116899084906130e2565b909155506116a190503361169c600e5490565b612286565b6116af600e80546001019055565b806116b9816131ab565b915050611661565b50505050565b6112013383836122a0565b6116dc3383611c60565b6116f85760405162461bcd60e51b8152600401610bf390613060565b6116c18484848461236f565b6000546001600160a01b0316331461172e5760405162461bcd60e51b8152600401610bf39061302b565b6013805461ffff60401b1916600160401b179055565b6010805461175190613170565b80601f016020809104026020016040519081016040528092919081815260200182805461177d90613170565b80156117ca5780601f1061179f576101008083540402835291602001916117ca565b820191906000526020600020905b8154815290600101906020018083116117ad57829003601f168201915b505050505081565b6000818152600360205260409020546060906001600160a01b03166118515760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610bf3565b600061185b6123a2565b9050600081511161187b57604051806020016040528060008152506118a9565b80611885846123b1565b601060405160200161189993929190612da8565b6040516020818303038152906040525b9392505050565b6000546001600160a01b031633146118da5760405162461bcd60e51b8152600401610bf39061302b565b60005b60185481101561192957611917601882815481106118fd576118fd613206565b6000918252602090912001546001600160a01b0316610d7e565b80611921816131ab565b9150506118dd565b50565b6000546001600160a01b031633146119565760405162461bcd60e51b8152600401610bf39061302b565b8051611201906010906020840190612973565b6000546001600160a01b031633146119935760405162461bcd60e51b8152600401610bf39061302b565b6001600160a01b0381166119f85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bf3565b61192981611f48565b6000546001600160a01b03163314611a2b5760405162461bcd60e51b8152600401610bf39061302b565b60005b815181101561120157600160156000848481518110611a4f57611a4f613206565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611a8b816131ab565b915050611a2e565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611ac882611205565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6007546001600160a01b03841660009081526009602052604081205490918391611b2b908661310e565b611b3591906130fa565b611b3f919061312d565b949350505050565b80471015611b975760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bf3565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611be4576040519150601f19603f3d011682016040523d82523d6000602084013e611be9565b606091505b5050905080610d295760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bf3565b6000818152600360205260408120546001600160a01b0316611cd95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bf3565b6000611ce483611205565b9050806001600160a01b0316846001600160a01b03161480611d1f5750836001600160a01b0316611d1484610b7e565b6001600160a01b0316145b80611b3f57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff16949350505050565b826001600160a01b0316611d6982611205565b6001600160a01b031614611dd15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610bf3565b6001600160a01b038216611e335760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610bf3565b611e3e600082611a93565b6001600160a01b0383166000908152600460205260408120805460019290611e6790849061312d565b90915550506001600160a01b0382166000908152600460205260408120805460019290611e959084906130e2565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d299084906124af565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3360009081526014602052604090205460ff16611ff75760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f742077686974656c69737465640000000000000000006044820152606401610bf3565b80601154612005919061310e565b3410156120495760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610bf3565b6013546301000000900461ffff168111156120765760405162461bcd60e51b8152600401610bf390612f98565b336000908152601660205260409020546001116119295760405162461bcd60e51b815260206004820152601760248201527f796f75206861766520616c7265616479206d696e7465640000000000000000006044820152606401610bf3565b3360009081526015602052604090205460ff166121345760405162461bcd60e51b815260206004820152601c60248201527f75736572206973206e6f7420696e20667265656d696e74206c697374000000006044820152606401610bf3565b60135462010000900460ff168111156120765760405162461bcd60e51b815260206004820152602860248201527f6d6178206d696e7420616d6f756e7420707265207472616e73616374696f6e20604482015267195e18d95959195960c21b6064820152608401610bf3565b601354600160381b900460ff166121b782846130e2565b11156122055760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e4654207065722061646472657373206578636565646564000000006044820152606401610bf3565b80601254612213919061310e565b3410156122575760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610bf3565b60135465010000000000900461ffff168111156112015760405162461bcd60e51b8152600401610bf390612f98565b611201828260405180602001604052806000815250612581565b816001600160a01b0316836001600160a01b031614156123025760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610bf3565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61237a848484611d56565b612386848484846125b4565b6116c15760405162461bcd60e51b8152600401610bf390612f00565b6060600f8054610afb90613170565b6060816123d55750506040805180820190915260018152600360fc1b602082015290565b8160005b81156123ff57806123e9816131ab565b91506123f89050600a836130fa565b91506123d9565b60008167ffffffffffffffff81111561241a5761241a61321c565b6040519080825280601f01601f191660200182016040528015612444576020820181803683370190505b5090505b8415611b3f5761245960018361312d565b9150612466600a866131c6565b6124719060306130e2565b60f81b81838151811061248657612486613206565b60200101906001600160f81b031916908160001a9053506124a8600a866130fa565b9450612448565b6000612504826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166126c19092919063ffffffff16565b805190915015610d2957808060200190518101906125229190612c8e565b610d295760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610bf3565b61258b83836126d0565b61259860008484846125b4565b610d295760405162461bcd60e51b8152600401610bf390612f00565b60006001600160a01b0384163b156126b657604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906125f8903390899088908890600401612e6c565b602060405180830381600087803b15801561261257600080fd5b505af1925050508015612642575060408051601f3d908101601f1916820190925261263f91810190612cc8565b60015b61269c573d808015612670576040519150601f19603f3d011682016040523d82523d6000602084013e612675565b606091505b5080516126945760405162461bcd60e51b8152600401610bf390612f00565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b3f565b506001949350505050565b6060611b3f8484600085612812565b6001600160a01b0382166127265760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610bf3565b6000818152600360205260409020546001600160a01b03161561278b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bf3565b6001600160a01b03821660009081526004602052604081208054600192906127b49084906130e2565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060824710156128735760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610bf3565b843b6128c15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bf3565b600080866001600160a01b031685876040516128dd9190612d8c565b60006040518083038185875af1925050503d806000811461291a576040519150601f19603f3d011682016040523d82523d6000602084013e61291f565b606091505b509150915061292f82828661293a565b979650505050505050565b606083156129495750816118a9565b8251156129595782518084602001fd5b8160405162461bcd60e51b8152600401610bf39190612eed565b82805461297f90613170565b90600052602060002090601f0160209004810192826129a157600085556129e7565b82601f106129ba57805160ff19168380011785556129e7565b828001600101855582156129e7579182015b828111156129e75782518255916020019190600101906129cc565b506129f39291506129f7565b5090565b5b808211156129f357600081556001016129f8565b600067ffffffffffffffff831115612a2657612a2661321c565b612a39601f8401601f19166020016130b1565b9050828152838383011115612a4d57600080fd5b828260208301376000602084830101529392505050565b600060208284031215612a7657600080fd5b81356118a981613232565b60008060408385031215612a9457600080fd5b8235612a9f81613232565b91506020830135612aaf81613232565b809150509250929050565b600080600060608486031215612acf57600080fd5b8335612ada81613232565b92506020840135612aea81613232565b929592945050506040919091013590565b60008060008060808587031215612b1157600080fd5b8435612b1c81613232565b93506020850135612b2c81613232565b925060408501359150606085013567ffffffffffffffff811115612b4f57600080fd5b8501601f81018713612b6057600080fd5b612b6f87823560208401612a0c565b91505092959194509250565b60008060408385031215612b8e57600080fd5b8235612b9981613232565b91506020830135612aaf81613247565b60008060408385031215612bbc57600080fd5b8235612bc781613232565b946020939093013593505050565b60006020808385031215612be857600080fd5b823567ffffffffffffffff80821115612c0057600080fd5b818501915085601f830112612c1457600080fd5b813581811115612c2657612c2661321c565b8060051b9150612c378483016130b1565b8181528481019084860184860187018a1015612c5257600080fd5b600095505b83861015612c815780359450612c6c85613232565b84835260019590950194918601918601612c57565b5098975050505050505050565b600060208284031215612ca057600080fd5b81516118a981613247565b600060208284031215612cbd57600080fd5b81356118a981613255565b600060208284031215612cda57600080fd5b81516118a981613255565b600060208284031215612cf757600080fd5b813567ffffffffffffffff811115612d0e57600080fd5b8201601f81018413612d1f57600080fd5b611b3f84823560208401612a0c565b600060208284031215612d4057600080fd5b5035919050565b600060208284031215612d5957600080fd5b5051919050565b60008151808452612d78816020860160208601613144565b601f01601f19169290920160200192915050565b60008251612d9e818460208701613144565b9190910192915050565b600084516020612dbb8285838a01613144565b855191840191612dce8184848a01613144565b8554920191600090600181811c9080831680612deb57607f831692505b858310811415612e0957634e487b7160e01b85526022600452602485fd5b808015612e1d5760018114612e2e57612e5b565b60ff19851688528388019550612e5b565b60008b81526020902060005b85811015612e535781548a820152908401908801612e3a565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e9f90830184612d60565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612ee157835183529284019291840191600101612ec5565b50909695505050505050565b6020815260006118a96020830184612d60565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b60208082526028908201527f6d6178206d696e7420616d6f756e7420706572207472616e73616374696f6e20604082015267195e18d95959195960c21b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156130da576130da61321c565b604052919050565b600082198211156130f5576130f56131da565b500190565b600082613109576131096131f0565b500490565b6000816000190483118215151615613128576131286131da565b500290565b60008282101561313f5761313f6131da565b500390565b60005b8381101561315f578181015183820152602001613147565b838111156116c15750506000910152565b600181811c9082168061318457607f821691505b602082108114156131a557634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156131bf576131bf6131da565b5060010190565b6000826131d5576131d56131f0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461192957600080fd5b801515811461192957600080fd5b6001600160e01b03198116811461192957600080fdfea2646970667358221220f133e921e5e03232965d943c66b4e271565b8d6e2793a760be161a0edebda13f64736f6c63430008070033

Deployed Bytecode Sourcemap

52275:25786:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25329:40;7277:10;25329:40;;;-1:-1:-1;;;;;9279:32:1;;;9261:51;;25359:9:0;9343:2:1;9328:18;;9321:34;9234:18;25329:40:0;;;;;;;52275:25786;;;;;39732:305;;;;;;;;;;-1:-1:-1;39732:305:0;;;;;:::i;:::-;;:::i;:::-;;;10940:14:1;;10933:22;10915:41;;10903:2;10888:18;39732:305:0;;;;;;;;52914:52;;;;;;;;;;-1:-1:-1;52914:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;40677:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;42236:221::-;;;;;;;;;;-1:-1:-1;42236:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9035:32:1;;;9017:51;;9005:2;8990:18;42236:221:0;8871:203:1;41759:411:0;;;;;;;;;;-1:-1:-1;41759:411:0;;;;;:::i;:::-;;:::i;:::-;;77354:120;;;;;;;;;;;;;:::i;52580:32::-;;;;;;;;;;;;;;;;;;;24327:25:1;;;24315:2;24300:18;52580:32:0;24181:177:1;72838:94:0;;;;;;;;;;;;;:::i;27115:566::-;;;;;;;;;;-1:-1:-1;27115:566:0;;;;;:::i;:::-;;:::i;52750:34::-;;;;;;;;;;-1:-1:-1;52750:34:0;;;;;;;;;;;;;;24162:6:1;24150:19;;;24132:38;;24120:2;24105:18;52750:34:0;23988:188:1;42986:339:0;;;;;;;;;;-1:-1:-1;42986:339:0;;;;;:::i;:::-;;:::i;53029:43::-;;;;;;;;;;-1:-1:-1;53029:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;25460:91;;;;;;;;;;-1:-1:-1;25531:12:0;;25460:91;;76027:118;;;;;;;;;;-1:-1:-1;76027:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;76110:27:0;76086:4;76110:27;;;:20;:27;;;;;;;;;76027:118;26589:135;;;;;;;;;;-1:-1:-1;26589:135:0;;;;;:::i;:::-;-1:-1:-1;;;;;26686:21:0;;;26659:7;26686:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;26589:135;43396:185;;;;;;;;;;-1:-1:-1;43396:185:0;;;;;:::i;:::-;;:::i;75332:687::-;;;;;;;;;;-1:-1:-1;75332:687:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27949:641::-;;;;;;;;;;-1:-1:-1;27949:641:0;;;;;:::i;:::-;;:::i;76981:104::-;;;;;;;;;;-1:-1:-1;76981:104:0;;;;;:::i;:::-;;:::i;40371:239::-;;;;;;;;;;-1:-1:-1;40371:239:0;;;;;:::i;:::-;;:::i;40101:208::-;;;;;;;;;;-1:-1:-1;40101:208:0;;;;;:::i;:::-;;:::i;9124:103::-;;;;;;;;;;;;;:::i;52872:35::-;;;;;;;;;;-1:-1:-1;52872:35:0;;;;-1:-1:-1;;;52872:35:0;;;;;;77482:206;;;;;;;;;;-1:-1:-1;77482:206:0;;;;;:::i;:::-;;:::i;76675:272::-;;;;;;;;;;;;;:::i;52703:40::-;;;;;;;;;;-1:-1:-1;52703:40:0;;;;;;;;;;;74920:404;;;;;;;;;;;;;:::i;26815:100::-;;;;;;;;;;-1:-1:-1;26815:100:0;;;;;:::i;:::-;;:::i;8473:87::-;;;;;;;;;;-1:-1:-1;8519:7:0;8546:6;-1:-1:-1;;;;;8546:6:0;8473:87;;40846:104;;;;;;;;;;;;;:::i;26311:109::-;;;;;;;;;;-1:-1:-1;26311:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;26394:18:0;26367:7;26394:18;;;:9;:18;;;;;;;26311:109;74045:847;;;;;;:::i;:::-;;:::i;42529:155::-;;;;;;;;;;-1:-1:-1;42529:155:0;;;;;:::i;:::-;;:::i;52973:49::-;;;;;;;;;;-1:-1:-1;52973:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;76153:112;;;;;;;;;;-1:-1:-1;76153:112:0;;;;;:::i;:::-;-1:-1:-1;;;;;76233:24:0;76209:4;76233:24;;;:17;:24;;;;;;;;;76153:112;43652:328;;;;;;;;;;-1:-1:-1;43652:328:0;;;;;:::i;:::-;;:::i;52791:35::-;;;;;;;;;;-1:-1:-1;52791:35:0;;;;-1:-1:-1;;;52791:35:0;;;;;;;;;24535:4:1;24523:17;;;24505:36;;24493:2;24478:18;52791:35:0;24363:184:1;52656:40:0;;;;;;;;;;-1:-1:-1;52656:40:0;;;;;;;;;;;77229:117;;;;;;;;;;;;;:::i;52490:37::-;;;;;;;;;;;;;:::i;76273:370::-;;;;;;;;;;-1:-1:-1;76273:370:0;;;;;:::i;:::-;;:::i;77903:155::-;;;;;;;;;;;;;:::i;52534:39::-;;;;;;;;;;;;;;;;26107:105;;;;;;;;;;-1:-1:-1;26107:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;26188:16:0;26161:7;26188:16;;;:7;:16;;;;;;;26107:105;52619:30;;;;;;;;;;-1:-1:-1;52619:30:0;;;;;;;;25897:119;;;;;;;;;;-1:-1:-1;25897:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;25982:26:0;25955:7;25982:26;;;:19;:26;;;;;;;25897:119;77093:128;;;;;;;;;;-1:-1:-1;77093:128:0;;;;;:::i;:::-;;:::i;25645:95::-;;;;;;;;;;-1:-1:-1;25718:14:0;;25645:95;;52833:32;;;;;;;;;;-1:-1:-1;52833:32:0;;;;-1:-1:-1;;;52833:32:0;;;;;;42755:164;;;;;;;;;;-1:-1:-1;42755:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;42876:25:0;;;42852:4;42876:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;42755:164;9382:201;;;;;;;;;;-1:-1:-1;9382:201:0;;;;;:::i;:::-;;:::i;77696:199::-;;;;;;;;;;-1:-1:-1;77696:199:0;;;;;:::i;:::-;;:::i;39732:305::-;39834:4;-1:-1:-1;;;;;;39871:40:0;;-1:-1:-1;;;39871:40:0;;:105;;-1:-1:-1;;;;;;;39928:48:0;;-1:-1:-1;;;39928:48:0;39871:105;:158;;;-1:-1:-1;;;;;;;;;;32610:40:0;;;39993:36;39851:178;39732:305;-1:-1:-1;;39732:305:0:o;40677:100::-;40731:13;40764:5;40757:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40677:100;:::o;42236:221::-;42312:7;45579:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45579:16:0;42332:73;;;;-1:-1:-1;;;42332:73:0;;19946:2:1;42332:73:0;;;19928:21:1;19985:2;19965:18;;;19958:30;20024:34;20004:18;;;19997:62;-1:-1:-1;;;20075:18:1;;;20068:42;20127:19;;42332:73:0;;;;;;;;;-1:-1:-1;42425:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;42425:24:0;;42236:221::o;41759:411::-;41840:13;41856:23;41871:7;41856:14;:23::i;:::-;41840:39;;41904:5;-1:-1:-1;;;;;41898:11:0;:2;-1:-1:-1;;;;;41898:11:0;;;41890:57;;;;-1:-1:-1;;;41890:57:0;;21546:2:1;41890:57:0;;;21528:21:1;21585:2;21565:18;;;21558:30;21624:34;21604:18;;;21597:62;-1:-1:-1;;;21675:18:1;;;21668:31;21716:19;;41890:57:0;21344:397:1;41890:57:0;7277:10;-1:-1:-1;;;;;41982:21:0;;;;:62;;-1:-1:-1;42007:37:0;42024:5;7277:10;42755:164;:::i;42007:37::-;41960:168;;;;-1:-1:-1;;;41960:168:0;;17234:2:1;41960:168:0;;;17216:21:1;17273:2;17253:18;;;17246:30;17312:34;17292:18;;;17285:62;17383:26;17363:18;;;17356:54;17427:19;;41960:168:0;17032:420:1;41960:168:0;42141:21;42150:2;42154:7;42141:8;:21::i;:::-;41829:341;41759:411;;:::o;77354:120::-;8519:7;8546:6;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;77413:12:::1;:20:::0;;-1:-1:-1;;;;77444:22:0;-1:-1:-1;;;77444:22:0::1;::::0;;77354:120::o;72838:94::-;72881:7;72908:16;:6;3893:14;;3801:114;72908:16;72901:23;;72838:94;:::o;27115:566::-;-1:-1:-1;;;;;27191:16:0;;27210:1;27191:16;;;:7;:16;;;;;;27183:71;;;;-1:-1:-1;;;27183:71:0;;;;;;;:::i;:::-;27267:21;27315:15;25718:14;;;25645:95;27315:15;27291:39;;:21;:39;:::i;:::-;27267:63;;27341:15;27359:58;27375:7;27384:13;27399:17;27408:7;-1:-1:-1;;;;;26394:18:0;26367:7;26394:18;;;:9;:18;;;;;;;26311:109;27399:17;27359:15;:58::i;:::-;27341:76;-1:-1:-1;27438:12:0;27430:68;;;;-1:-1:-1;;;27430:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27511:18:0;;;;;;:9;:18;;;;;:29;;27533:7;;27511:18;:29;;27533:7;;27511:29;:::i;:::-;;;;;;;;27569:7;27551:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;27589:35:0;;-1:-1:-1;27607:7:0;27616;27589:17;:35::i;:::-;27640:33;;;-1:-1:-1;;;;;9279:32:1;;9261:51;;9343:2;9328:18;;9321:34;;;27640:33:0;;9234:18:1;27640:33:0;;;;;;;27172:509;;27115:566;:::o;42986:339::-;43181:41;7277:10;43214:7;43181:18;:41::i;:::-;43173:103;;;;-1:-1:-1;;;43173:103:0;;;;;;;:::i;:::-;43289:28;43299:4;43305:2;43309:7;43289:9;:28::i;43396:185::-;43534:39;43551:4;43557:2;43561:7;43534:39;;;;;;;;;;;;:16;:39::i;75332:687::-;75392:16;75421:23;75447:17;75457:6;75447:9;:17::i;:::-;75421:43;;75475:30;75522:15;75508:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75508:30:0;;75475:63;;75549:22;75586:23;75626:353;75651:15;75633;:33;:64;;;;-1:-1:-1;75688:9:0;;;;75670:27;;;75633:64;75626:353;;;75714:25;75742:23;75750:14;75742:7;:23::i;:::-;75714:51;;75807:6;-1:-1:-1;;;;;75786:27:0;:17;-1:-1:-1;;;;;75786:27:0;;75782:153;;;75867:14;75834:13;75848:15;75834:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;75902:17;;;;:::i;:::-;;;;75782:153;75951:16;;;;:::i;:::-;;;;75699:280;75626:353;;;-1:-1:-1;75998:13:0;;75332:687;-1:-1:-1;;;;75332:687:0:o;27949:641::-;-1:-1:-1;;;;;28031:16:0;;28050:1;28031:16;;;:7;:16;;;;;;28023:71;;;;-1:-1:-1;;;28023:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25982:26:0;;28107:21;25982:26;;;:19;:26;;;;;;28131:30;;-1:-1:-1;;;28131:30:0;;28155:4;28131:30;;;9017:51:1;-1:-1:-1;;;;;28131:15:0;;;;;8990:18:1;;28131:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;28107:77;;28195:15;28213:65;28229:7;28238:13;28253:24;28262:5;28269:7;-1:-1:-1;;;;;26686:21:0;;;26659:7;26686:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;26589:135;28213:65;28195:83;-1:-1:-1;28299:12:0;28291:68;;;;-1:-1:-1;;;28291:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28372:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;28406:7;;28372:21;:41;;28406:7;;28372:41;:::i;:::-;;;;-1:-1:-1;;;;;;;28424:26:0;;;;;;:19;:26;;;;;:37;;28454:7;;28424:26;:37;;28454:7;;28424:37;:::i;:::-;;;;-1:-1:-1;28474:47:0;;-1:-1:-1;28497:5:0;28504:7;28513;28474:22;:47::i;:::-;28537:45;;;-1:-1:-1;;;;;9279:32:1;;;9261:51;;9343:2;9328:18;;9321:34;;;28537:45:0;;;;;9234:18:1;28537:45:0;;;;;;;28012:578;;27949:641;;:::o;76981:104::-;8519:7;8546:6;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;77056:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;76981:104:::0;:::o;40371:239::-;40443:7;40479:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40479:16:0;40514:19;40506:73;;;;-1:-1:-1;;;40506:73:0;;18070:2:1;40506:73:0;;;18052:21:1;18109:2;18089:18;;;18082:30;18148:34;18128:18;;;18121:62;-1:-1:-1;;;18199:18:1;;;18192:39;18248:19;;40506:73:0;17868:405:1;40101:208:0;40173:7;-1:-1:-1;;;;;40201:19:0;;40193:74;;;;-1:-1:-1;;;40193:74:0;;17659:2:1;40193:74:0;;;17641:21:1;17698:2;17678:18;;;17671:30;17737:34;17717:18;;;17710:62;-1:-1:-1;;;17788:18:1;;;17781:40;17838:19;;40193:74:0;17457:406:1;40193:74:0;-1:-1:-1;;;;;;40285:16:0;;;;;:9;:16;;;;;;;40101:208::o;9124:103::-;8519:7;8546:6;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;9189:30:::1;9216:1;9189:18;:30::i;:::-;9124:103::o:0;77482:206::-;8519:7;8546:6;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;77571:9:::1;77566:115;77590:9;:16;77586:1;:20;77566:115;;;77665:4;77628:20;:34;77649:9;77659:1;77649:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;77628:34:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;77628:34:0;:41;;-1:-1:-1;;77628:41:0::1;::::0;::::1;;::::0;;;::::1;::::0;;77608:3;::::1;::::0;::::1;:::i;:::-;;;;77566:115;;76675:272:::0;76750:12;;76720:13;;-1:-1:-1;;;76750:12:0;;;;76746:194;;;-1:-1:-1;76779:16:0;;;;;;;;;;;;-1:-1:-1;;;76779:16:0;;;;;76675:272::o;76746:194::-;76826:15;;-1:-1:-1;;;76826:15:0;;;;76822:118;;;-1:-1:-1;76858:19:0;;;;;;;;;;;;-1:-1:-1;;;76858:19:0;;;;;76675:272::o;76822:118::-;-1:-1:-1;76919:9:0;;;;;;;;;-1:-1:-1;76919:9:0;;;76675:272::o;74920:404::-;74991:15;;74967:7;;-1:-1:-1;;;74991:15:0;;;;:23;;75010:4;74991:23;74987:330;;;-1:-1:-1;75038:4:0;;;74920:404::o;74987:330::-;75073:12;;-1:-1:-1;;;75073:12:0;;;;:20;;75089:4;75073:20;75069:248;;;75128:10;76086:4;76110:27;;;:20;:27;;;;;;;;75110:146;;;-1:-1:-1;75167:11:0;;;74920:404::o;75110:146::-;-1:-1:-1;75239:1:0;;74920:404::o;26815:100::-;26866:7;26893;26901:5;26893:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;26893:14:0;;26815:100;-1:-1:-1;;26815:100:0:o;40846:104::-;40902:13;40935:7;40928:14;;;;;:::i;74045:847::-;74113:11;72644:1;72630:11;:15;72622:55;;;;-1:-1:-1;;;72622:55:0;;23834:2:1;72622:55:0;;;23816:21:1;23873:2;23853:18;;;23846:30;23912:29;23892:18;;;23885:57;23959:18;;72622:55:0;23632:351:1;72622:55:0;74179:9:::1;::::0;::::1;;74164:11:::0;74145:16:::1;:6;3893:14:::0;;3801:114;74145:16:::1;:30;;;;:::i;:::-;:43;;74137:78;;;::::0;-1:-1:-1;;;74137:78:0;;18480:2:1;74137:78:0::1;::::0;::::1;18462:21:1::0;18519:2;18499:18;;;18492:30;-1:-1:-1;;;18538:18:1;;;18531:52;18600:18;;74137:78:0::1;18278:346:1::0;74137:78:0::1;74234:12;::::0;-1:-1:-1;;;74234:12:0;::::1;;;:20;;74250:4;74234:20;::::0;:47:::1;;-1:-1:-1::0;74258:15:0::1;::::0;-1:-1:-1;;;74258:15:0;::::1;;;:23;;74277:4;74258:23;74234:47;74226:76;;;::::0;-1:-1:-1;;;74226:76:0;;19601:2:1;74226:76:0::1;::::0;::::1;19583:21:1::0;19640:2;19620:18;;;19613:30;-1:-1:-1;;;19659:18:1;;;19652:46;19715:18;;74226:76:0::1;19399:340:1::0;74226:76:0::1;74313:21;74337;74347:10;74337:9;:21::i;:::-;74375:12;::::0;74313:45;;-1:-1:-1;;;;74375:12:0;::::1;;;74371:321;;;74422:10;76086:4:::0;76110:27;;;:20;:27;;;;;;;;74404:183:::1;;;74454:31;74473:11;74454:18;:31::i;:::-;74371:321;;74404:183;74539:32;74559:11;74539:19;:32::i;74371:321::-;74628:52;74650:16;74668:11;74628:21;:52::i;:::-;74709:9;74704:181;74728:11;74724:1;:15;74704:181;;;74770:10;74761:20;::::0;;;:8:::1;:20;::::0;;;;:25;;74785:1:::1;::::0;74761:20;:25:::1;::::0;74785:1;;74761:25:::1;:::i;:::-;::::0;;;-1:-1:-1;74801:39:0::1;::::0;-1:-1:-1;74811:10:0::1;74823:16;:6;3893:14:::0;;3801:114;74823:16:::1;74801:9;:39::i;:::-;74855:18;:6;4012:19:::0;;4030:1;4012:19;;;3923:127;74855:18:::1;74741:3:::0;::::1;::::0;::::1;:::i;:::-;;;;74704:181;;;;74126:766;74045:847:::0;;:::o;42529:155::-;42624:52;7277:10;42657:8;42667;42624:18;:52::i;43652:328::-;43827:41;7277:10;43860:7;43827:18;:41::i;:::-;43819:103;;;;-1:-1:-1;;;43819:103:0;;;;;;;:::i;:::-;43933:39;43947:4;43953:2;43957:7;43966:5;43933:13;:39::i;77229:117::-;8519:7;8546:6;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;77285:12:::1;:19:::0;;-1:-1:-1;;;;77315:23:0;-1:-1:-1;;;77315:23:0;;;77229:117::o;52490:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;76273:370::-;45555:4;45579:16;;;:7;:16;;;;;;76346:13;;-1:-1:-1;;;;;45579:16:0;76372:76;;;;-1:-1:-1;;;76372:76:0;;21130:2:1;76372:76:0;;;21112:21:1;21169:2;21149:18;;;21142:30;21208:34;21188:18;;;21181:62;-1:-1:-1;;;21259:18:1;;;21252:45;21314:19;;76372:76:0;20928:411:1;76372:76:0;76461:28;76492:10;:8;:10::i;:::-;76461:41;;76551:1;76526:14;76520:28;:32;:115;;;;;;;;;;;;;;;;;76579:14;76595:18;:7;:16;:18::i;:::-;76615:13;76562:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;76520:115;76513:122;76273:370;-1:-1:-1;;;76273:370:0:o;77903:155::-;8519:7;8546:6;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;77963:6:::1;77958:93;77979:5;:12:::0;77975:16;::::1;77958:93;;;78013:26;78029:5;78035:1;78029:8;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;78029:8:0::1;78013:7;:26::i;:::-;77993:3:::0;::::1;::::0;::::1;:::i;:::-;;;;77958:93;;;;77903:155::o:0;77093:128::-;8519:7;8546:6;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;77180:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;9382:201::-:0;8519:7;8546:6;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9471:22:0;::::1;9463:73;;;::::0;-1:-1:-1;;;9463:73:0;;12164:2:1;9463:73:0::1;::::0;::::1;12146:21:1::0;12203:2;12183:18;;;12176:30;12242:34;12222:18;;;12215:62;-1:-1:-1;;;12293:18:1;;;12286:36;12339:19;;9463:73:0::1;11962:402:1::0;9463:73:0::1;9547:28;9566:8;9547:18;:28::i;77696:199::-:0;8519:7;8546:6;-1:-1:-1;;;;;8546:6:0;7277:10;8693:23;8685:68;;;;-1:-1:-1;;;8685:68:0;;;;;;;:::i;:::-;77784:6:::1;77779:109;77800:9;:16;77796:1;:20;77779:109;;;77872:4;77838:17;:31;77856:9;77866:1;77856:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;77838:31:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;77838:31:0;:38;;-1:-1:-1;;77838:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;77818:3;::::1;::::0;::::1;:::i;:::-;;;;77779:109;;49472:174:::0;49547:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;49547:29:0;-1:-1:-1;;;;;49547:29:0;;;;;;;;:24;;49601:23;49547:24;49601:14;:23::i;:::-;-1:-1:-1;;;;;49592:46:0;;;;;;;;;;;49472:174;;:::o;28768:248::-;28978:12;;-1:-1:-1;;;;;28958:16:0;;28914:7;28958:16;;;:7;:16;;;;;;28914:7;;28993:15;;28942:32;;:13;:32;:::i;:::-;28941:49;;;;:::i;:::-;:67;;;;:::i;:::-;28934:74;28768:248;-1:-1:-1;;;;28768:248:0:o;12083:317::-;12198:6;12173:21;:31;;12165:73;;;;-1:-1:-1;;;12165:73:0;;15235:2:1;12165:73:0;;;15217:21:1;15274:2;15254:18;;;15247:30;15313:31;15293:18;;;15286:59;15362:18;;12165:73:0;15033:353:1;12165:73:0;12252:12;12270:9;-1:-1:-1;;;;;12270:14:0;12292:6;12270:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12251:52;;;12322:7;12314:78;;;;-1:-1:-1;;;12314:78:0;;14451:2:1;12314:78:0;;;14433:21:1;14490:2;14470:18;;;14463:30;14529:34;14509:18;;;14502:62;14600:28;14580:18;;;14573:56;14646:19;;12314:78:0;14249:422:1;45784:348:0;45877:4;45579:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45579:16:0;45894:73;;;;-1:-1:-1;;;45894:73:0;;16409:2:1;45894:73:0;;;16391:21:1;16448:2;16428:18;;;16421:30;16487:34;16467:18;;;16460:62;-1:-1:-1;;;16538:18:1;;;16531:42;16590:19;;45894:73:0;16207:408:1;45894:73:0;45978:13;45994:23;46009:7;45994:14;:23::i;:::-;45978:39;;46047:5;-1:-1:-1;;;;;46036:16:0;:7;-1:-1:-1;;;;;46036:16:0;;:51;;;;46080:7;-1:-1:-1;;;;;46056:31:0;:20;46068:7;46056:11;:20::i;:::-;-1:-1:-1;;;;;46056:31:0;;46036:51;:87;;;-1:-1:-1;;;;;;42876:25:0;;;42852:4;42876:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;46028:96;45784:348;-1:-1:-1;;;;45784:348:0:o;48776:578::-;48935:4;-1:-1:-1;;;;;48908:31:0;:23;48923:7;48908:14;:23::i;:::-;-1:-1:-1;;;;;48908:31:0;;48900:85;;;;-1:-1:-1;;;48900:85:0;;20720:2:1;48900:85:0;;;20702:21:1;20759:2;20739:18;;;20732:30;20798:34;20778:18;;;20771:62;-1:-1:-1;;;20849:18:1;;;20842:39;20898:19;;48900:85:0;20518:405:1;48900:85:0;-1:-1:-1;;;;;49004:16:0;;48996:65;;;;-1:-1:-1;;;48996:65:0;;13692:2:1;48996:65:0;;;13674:21:1;13731:2;13711:18;;;13704:30;13770:34;13750:18;;;13743:62;-1:-1:-1;;;13821:18:1;;;13814:34;13865:19;;48996:65:0;13490:400:1;48996:65:0;49178:29;49195:1;49199:7;49178:8;:29::i;:::-;-1:-1:-1;;;;;49220:15:0;;;;;;:9;:15;;;;;:20;;49239:1;;49220:15;:20;;49239:1;;49220:20;:::i;:::-;;;;-1:-1:-1;;;;;;;49251:13:0;;;;;;:9;:13;;;;;:18;;49268:1;;49251:13;:18;;49268:1;;49251:18;:::i;:::-;;;;-1:-1:-1;;49280:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;49280:21:0;-1:-1:-1;;;;;49280:21:0;;;;;;;;;49319:27;;49280:16;;49319:27;;;;;;;48776:578;;;:::o;18789:211::-;18933:58;;;-1:-1:-1;;;;;9279:32:1;;18933:58:0;;;9261:51:1;9328:18;;;;9321:34;;;18933:58:0;;;;;;;;;;9234:18:1;;;;18933:58:0;;;;;;;;-1:-1:-1;;;;;18933:58:0;-1:-1:-1;;;18933:58:0;;;18906:86;;18926:5;;18906:19;:86::i;9743:191::-;9817:16;9836:6;;-1:-1:-1;;;;;9853:17:0;;;-1:-1:-1;;;;;;9853:17:0;;;;;;9886:40;;9836:6;;;;;;;9886:40;;9817:16;9886:40;9806:128;9743:191;:::o;73265:388::-;73356:10;76086:4;76110:27;;;:20;:27;;;;;;;;73334:61;;;;-1:-1:-1;;;73334:61:0;;23482:2:1;73334:61:0;;;23464:21:1;23521:2;23501:18;;;23494:30;23560:25;23540:18;;;23533:53;23603:18;;73334:61:0;23280:347:1;73334:61:0;73441:11;73427;;:25;;;;:::i;:::-;73414:9;:38;;73406:69;;;;-1:-1:-1;;;73406:69:0;;21948:2:1;73406:69:0;;;21930:21:1;21987:2;21967:18;;;21960:30;-1:-1:-1;;;22006:18:1;;;21999:48;22064:18;;73406:69:0;21746:342:1;73406:69:0;73509:20;;;;;;;73494:35;;;73486:88;;;;-1:-1:-1;;;73486:88:0;;;;;;;:::i;:::-;73602:10;73593:20;;;;:8;:20;;;;;;73616:1;-1:-1:-1;73585:60:0;;;;-1:-1:-1;;;73585:60:0;;11393:2:1;73585:60:0;;;11375:21:1;11432:2;11412:18;;;11405:30;11471:25;11451:18;;;11444:53;11514:18;;73585:60:0;11191:347:1;72940:317:0;73034:10;76209:4;76233:24;;;:17;:24;;;;;;;;73015:63;;;;-1:-1:-1;;;73015:63:0;;14878:2:1;73015:63:0;;;14860:21:1;14917:2;14897:18;;;14890:30;14956;14936:18;;;14929:58;15004:18;;73015:63:0;14676:352:1;73015:63:0;73112:21;;;;;;;73097:36;;;73089:89;;;;-1:-1:-1;;;73089:89:0;;18831:2:1;73089:89:0;;;18813:21:1;18870:2;18850:18;;;18843:30;18909:34;18889:18;;;18882:62;-1:-1:-1;;;18960:18:1;;;18953:38;19008:19;;73089:89:0;18629:404:1;73661:364:0;73803:18;;-1:-1:-1;;;73803:18:0;;;;73768:31;73788:11;73768:17;:31;:::i;:::-;:53;;73760:93;;;;-1:-1:-1;;;73760:93:0;;12928:2:1;73760:93:0;;;12910:21:1;12967:2;12947:18;;;12940:30;13006;12986:18;;;12979:58;13054:18;;73760:93:0;12726:352:1;73760:93:0;73892:11;73885:4;;:18;;;;:::i;:::-;73872:9;:31;;73864:62;;;;-1:-1:-1;;;73864:62:0;;21948:2:1;73864:62:0;;;21930:21:1;21987:2;21967:18;;;21960:30;-1:-1:-1;;;22006:18:1;;;21999:48;22064:18;;73864:62:0;21746:342:1;73864:62:0;73960:13;;;;;;;73945:28;;;73937:80;;;;-1:-1:-1;;;73937:80:0;;;;;;;:::i;46474:110::-;46550:26;46560:2;46564:7;46550:26;;;;;;;;;;;;:9;:26::i;49788:315::-;49943:8;-1:-1:-1;;;;;49934:17:0;:5;-1:-1:-1;;;;;49934:17:0;;;49926:55;;;;-1:-1:-1;;;49926:55:0;;14097:2:1;49926:55:0;;;14079:21:1;14136:2;14116:18;;;14109:30;14175:27;14155:18;;;14148:55;14220:18;;49926:55:0;13895:349:1;49926:55:0;-1:-1:-1;;;;;49992:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;49992:46:0;;;;;;;;;;50054:41;;10915::1;;;50054::0;;10888:18:1;50054:41:0;;;;;;;49788:315;;;:::o;44862:::-;45019:28;45029:4;45035:2;45039:7;45019:9;:28::i;:::-;45066:48;45089:4;45095:2;45099:7;45108:5;45066:22;:48::i;:::-;45058:111;;;;-1:-1:-1;;;45058:111:0;;;;;;;:::i;72722:108::-;72782:13;72815:7;72808:14;;;;;:::i;4759:723::-;4815:13;5036:10;5032:53;;-1:-1:-1;;5063:10:0;;;;;;;;;;;;-1:-1:-1;;;5063:10:0;;;;;4759:723::o;5032:53::-;5110:5;5095:12;5151:78;5158:9;;5151:78;;5184:8;;;;:::i;:::-;;-1:-1:-1;5207:10:0;;-1:-1:-1;5215:2:0;5207:10;;:::i;:::-;;;5151:78;;;5239:19;5271:6;5261:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5261:17:0;;5239:39;;5289:154;5296:10;;5289:154;;5323:11;5333:1;5323:11;;:::i;:::-;;-1:-1:-1;5392:10:0;5400:2;5392:5;:10;:::i;:::-;5379:24;;:2;:24;:::i;:::-;5366:39;;5349:6;5356;5349:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;5349:56:0;;;;;;;;-1:-1:-1;5420:11:0;5429:2;5420:11;;:::i;:::-;;;5289:154;;21362:716;21786:23;21812:69;21840:4;21812:69;;;;;;;;;;;;;;;;;21820:5;-1:-1:-1;;;;;21812:27:0;;;:69;;;;;:::i;:::-;21896:17;;21786:95;;-1:-1:-1;21896:21:0;21892:179;;21993:10;21982:30;;;;;;;;;;;;:::i;:::-;21974:85;;;;-1:-1:-1;;;21974:85:0;;23071:2:1;21974:85:0;;;23053:21:1;23110:2;23090:18;;;23083:30;23149:34;23129:18;;;23122:62;-1:-1:-1;;;23200:18:1;;;23193:40;23250:19;;21974:85:0;22869:406:1;46811:321:0;46941:18;46947:2;46951:7;46941:5;:18::i;:::-;46992:54;47023:1;47027:2;47031:7;47040:5;46992:22;:54::i;:::-;46970:154;;;;-1:-1:-1;;;46970:154:0;;;;;;;:::i;50668:799::-;50823:4;-1:-1:-1;;;;;50844:13:0;;11084:20;11132:8;50840:620;;50880:72;;-1:-1:-1;;;50880:72:0;;-1:-1:-1;;;;;50880:36:0;;;;;:72;;7277:10;;50931:4;;50937:7;;50946:5;;50880:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50880:72:0;;;;;;;;-1:-1:-1;;50880:72:0;;;;;;;;;;;;:::i;:::-;;;50876:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51122:13:0;;51118:272;;51165:60;;-1:-1:-1;;;51165:60:0;;;;;;;:::i;51118:272::-;51340:6;51334:13;51325:6;51321:2;51317:15;51310:38;50876:529;-1:-1:-1;;;;;;51003:51:0;-1:-1:-1;;;51003:51:0;;-1:-1:-1;50996:58:0;;50840:620;-1:-1:-1;51444:4:0;50668:799;;;;;;:::o;13567:229::-;13704:12;13736:52;13758:6;13766:4;13772:1;13775:12;13736:21;:52::i;47468:382::-;-1:-1:-1;;;;;47548:16:0;;47540:61;;;;-1:-1:-1;;;47540:61:0;;19240:2:1;47540:61:0;;;19222:21:1;;;19259:18;;;19252:30;19318:34;19298:18;;;19291:62;19370:18;;47540:61:0;19038:356:1;47540:61:0;45555:4;45579:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45579:16:0;:30;47612:58;;;;-1:-1:-1;;;47612:58:0;;12571:2:1;47612:58:0;;;12553:21:1;12610:2;12590:18;;;12583:30;12649;12629:18;;;12622:58;12697:18;;47612:58:0;12369:352:1;47612:58:0;-1:-1:-1;;;;;47741:13:0;;;;;;:9;:13;;;;;:18;;47758:1;;47741:13;:18;;47758:1;;47741:18;:::i;:::-;;;;-1:-1:-1;;47770:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;47770:21:0;-1:-1:-1;;;;;47770:21:0;;;;;;;;47809:33;;47770:16;;;47809:33;;47770:16;;47809:33;47468:382;;:::o;14687:510::-;14857:12;14915:5;14890:21;:30;;14882:81;;;;-1:-1:-1;;;14882:81:0;;16002:2:1;14882:81:0;;;15984:21:1;16041:2;16021:18;;;16014:30;16080:34;16060:18;;;16053:62;-1:-1:-1;;;16131:18:1;;;16124:36;16177:19;;14882:81:0;15800:402:1;14882:81:0;11084:20;;14974:60;;;;-1:-1:-1;;;14974:60:0;;22713:2:1;14974:60:0;;;22695:21:1;22752:2;22732:18;;;22725:30;22791:31;22771:18;;;22764:59;22840:18;;14974:60:0;22511:353:1;14974:60:0;15048:12;15062:23;15089:6;-1:-1:-1;;;;;15089:11:0;15108:5;15115:4;15089:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15047:73;;;;15138:51;15155:7;15164:10;15176:12;15138:16;:51::i;:::-;15131:58;14687:510;-1:-1:-1;;;;;;;14687:510:0:o;17373:712::-;17523:12;17552:7;17548:530;;;-1:-1:-1;17583:10:0;17576:17;;17548:530;17697:17;;:21;17693:374;;17895:10;17889:17;17956:15;17943:10;17939:2;17935:19;17928:44;17693:374;18038:12;18031:20;;-1:-1:-1;;;18031:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:247::-;484:6;537:2;525:9;516:7;512:23;508:32;505:52;;;553:1;550;543:12;505:52;592:9;579:23;611:31;636:5;611:31;:::i;937:388::-;1005:6;1013;1066:2;1054:9;1045:7;1041:23;1037:32;1034:52;;;1082:1;1079;1072:12;1034:52;1121:9;1108:23;1140:31;1165:5;1140:31;:::i;:::-;1190:5;-1:-1:-1;1247:2:1;1232:18;;1219:32;1260:33;1219:32;1260:33;:::i;:::-;1312:7;1302:17;;;937:388;;;;;:::o;1330:456::-;1407:6;1415;1423;1476:2;1464:9;1455:7;1451:23;1447:32;1444:52;;;1492:1;1489;1482:12;1444:52;1531:9;1518:23;1550:31;1575:5;1550:31;:::i;:::-;1600:5;-1:-1:-1;1657:2:1;1642:18;;1629:32;1670:33;1629:32;1670:33;:::i;:::-;1330:456;;1722:7;;-1:-1:-1;;;1776:2:1;1761:18;;;;1748:32;;1330:456::o;1791:794::-;1886:6;1894;1902;1910;1963:3;1951:9;1942:7;1938:23;1934:33;1931:53;;;1980:1;1977;1970:12;1931:53;2019:9;2006:23;2038:31;2063:5;2038:31;:::i;:::-;2088:5;-1:-1:-1;2145:2:1;2130:18;;2117:32;2158:33;2117:32;2158:33;:::i;:::-;2210:7;-1:-1:-1;2264:2:1;2249:18;;2236:32;;-1:-1:-1;2319:2:1;2304:18;;2291:32;2346:18;2335:30;;2332:50;;;2378:1;2375;2368:12;2332:50;2401:22;;2454:4;2446:13;;2442:27;-1:-1:-1;2432:55:1;;2483:1;2480;2473:12;2432:55;2506:73;2571:7;2566:2;2553:16;2548:2;2544;2540:11;2506:73;:::i;:::-;2496:83;;;1791:794;;;;;;;:::o;2590:382::-;2655:6;2663;2716:2;2704:9;2695:7;2691:23;2687:32;2684:52;;;2732:1;2729;2722:12;2684:52;2771:9;2758:23;2790:31;2815:5;2790:31;:::i;:::-;2840:5;-1:-1:-1;2897:2:1;2882:18;;2869:32;2910:30;2869:32;2910:30;:::i;2977:315::-;3045:6;3053;3106:2;3094:9;3085:7;3081:23;3077:32;3074:52;;;3122:1;3119;3112:12;3074:52;3161:9;3148:23;3180:31;3205:5;3180:31;:::i;:::-;3230:5;3282:2;3267:18;;;;3254:32;;-1:-1:-1;;;2977:315:1:o;3297:1032::-;3381:6;3412:2;3455;3443:9;3434:7;3430:23;3426:32;3423:52;;;3471:1;3468;3461:12;3423:52;3511:9;3498:23;3540:18;3581:2;3573:6;3570:14;3567:34;;;3597:1;3594;3587:12;3567:34;3635:6;3624:9;3620:22;3610:32;;3680:7;3673:4;3669:2;3665:13;3661:27;3651:55;;3702:1;3699;3692:12;3651:55;3738:2;3725:16;3760:2;3756;3753:10;3750:36;;;3766:18;;:::i;:::-;3812:2;3809:1;3805:10;3795:20;;3835:28;3859:2;3855;3851:11;3835:28;:::i;:::-;3897:15;;;3928:12;;;;3960:11;;;3990;;;3986:20;;3983:33;-1:-1:-1;3980:53:1;;;4029:1;4026;4019:12;3980:53;4051:1;4042:10;;4061:238;4075:2;4072:1;4069:9;4061:238;;;4146:3;4133:17;4120:30;;4163:31;4188:5;4163:31;:::i;:::-;4207:18;;;4093:1;4086:9;;;;;4245:12;;;;4277;;4061:238;;;-1:-1:-1;4318:5:1;3297:1032;-1:-1:-1;;;;;;;;3297:1032:1:o;4334:245::-;4401:6;4454:2;4442:9;4433:7;4429:23;4425:32;4422:52;;;4470:1;4467;4460:12;4422:52;4502:9;4496:16;4521:28;4543:5;4521:28;:::i;4584:245::-;4642:6;4695:2;4683:9;4674:7;4670:23;4666:32;4663:52;;;4711:1;4708;4701:12;4663:52;4750:9;4737:23;4769:30;4793:5;4769:30;:::i;4834:249::-;4903:6;4956:2;4944:9;4935:7;4931:23;4927:32;4924:52;;;4972:1;4969;4962:12;4924:52;5004:9;4998:16;5023:30;5047:5;5023:30;:::i;5759:450::-;5828:6;5881:2;5869:9;5860:7;5856:23;5852:32;5849:52;;;5897:1;5894;5887:12;5849:52;5937:9;5924:23;5970:18;5962:6;5959:30;5956:50;;;6002:1;5999;5992:12;5956:50;6025:22;;6078:4;6070:13;;6066:27;-1:-1:-1;6056:55:1;;6107:1;6104;6097:12;6056:55;6130:73;6195:7;6190:2;6177:16;6172:2;6168;6164:11;6130:73;:::i;6214:180::-;6273:6;6326:2;6314:9;6305:7;6301:23;6297:32;6294:52;;;6342:1;6339;6332:12;6294:52;-1:-1:-1;6365:23:1;;6214:180;-1:-1:-1;6214:180:1:o;6399:184::-;6469:6;6522:2;6510:9;6501:7;6497:23;6493:32;6490:52;;;6538:1;6535;6528:12;6490:52;-1:-1:-1;6561:16:1;;6399:184;-1:-1:-1;6399:184:1:o;6588:257::-;6629:3;6667:5;6661:12;6694:6;6689:3;6682:19;6710:63;6766:6;6759:4;6754:3;6750:14;6743:4;6736:5;6732:16;6710:63;:::i;:::-;6827:2;6806:15;-1:-1:-1;;6802:29:1;6793:39;;;;6834:4;6789:50;;6588:257;-1:-1:-1;;6588:257:1:o;6850:274::-;6979:3;7017:6;7011:13;7033:53;7079:6;7074:3;7067:4;7059:6;7055:17;7033:53;:::i;:::-;7102:16;;;;;6850:274;-1:-1:-1;;6850:274:1:o;7129:1527::-;7353:3;7391:6;7385:13;7417:4;7430:51;7474:6;7469:3;7464:2;7456:6;7452:15;7430:51;:::i;:::-;7544:13;;7503:16;;;;7566:55;7544:13;7503:16;7588:15;;;7566:55;:::i;:::-;7710:13;;7643:20;;;7683:1;;7770;7792:18;;;;7845;;;;7872:93;;7950:4;7940:8;7936:19;7924:31;;7872:93;8013:2;8003:8;8000:16;7980:18;7977:40;7974:167;;;-1:-1:-1;;;8040:33:1;;8096:4;8093:1;8086:15;8126:4;8047:3;8114:17;7974:167;8157:18;8184:110;;;;8308:1;8303:328;;;;8150:481;;8184:110;-1:-1:-1;;8219:24:1;;8205:39;;8264:20;;;;-1:-1:-1;8184:110:1;;8303:328;24905:1;24898:14;;;24942:4;24929:18;;8398:1;8412:169;8426:8;8423:1;8420:15;8412:169;;;8508:14;;8493:13;;;8486:37;8551:16;;;;8443:10;;8412:169;;;8416:3;;8612:8;8605:5;8601:20;8594:27;;8150:481;-1:-1:-1;8647:3:1;;7129:1527;-1:-1:-1;;;;;;;;;;;7129:1527:1:o;9366:488::-;-1:-1:-1;;;;;9635:15:1;;;9617:34;;9687:15;;9682:2;9667:18;;9660:43;9734:2;9719:18;;9712:34;;;9782:3;9777:2;9762:18;;9755:31;;;9560:4;;9803:45;;9828:19;;9820:6;9803:45;:::i;:::-;9795:53;9366:488;-1:-1:-1;;;;;;9366:488:1:o;10138:632::-;10309:2;10361:21;;;10431:13;;10334:18;;;10453:22;;;10280:4;;10309:2;10532:15;;;;10506:2;10491:18;;;10280:4;10575:169;10589:6;10586:1;10583:13;10575:169;;;10650:13;;10638:26;;10719:15;;;;10684:12;;;;10611:1;10604:9;10575:169;;;-1:-1:-1;10761:3:1;;10138:632;-1:-1:-1;;;;;;10138:632:1:o;10967:219::-;11116:2;11105:9;11098:21;11079:4;11136:44;11176:2;11165:9;11161:18;11153:6;11136:44;:::i;11543:414::-;11745:2;11727:21;;;11784:2;11764:18;;;11757:30;11823:34;11818:2;11803:18;;11796:62;-1:-1:-1;;;11889:2:1;11874:18;;11867:48;11947:3;11932:19;;11543:414::o;13083:402::-;13285:2;13267:21;;;13324:2;13304:18;;;13297:30;13363:34;13358:2;13343:18;;13336:62;-1:-1:-1;;;13429:2:1;13414:18;;13407:36;13475:3;13460:19;;13083:402::o;15391:404::-;15593:2;15575:21;;;15632:2;15612:18;;;15605:30;15671:34;15666:2;15651:18;;15644:62;-1:-1:-1;;;15737:2:1;15722:18;;15715:38;15785:3;15770:19;;15391:404::o;16620:407::-;16822:2;16804:21;;;16861:2;16841:18;;;16834:30;16900:34;16895:2;16880:18;;16873:62;-1:-1:-1;;;16966:2:1;16951:18;;16944:41;17017:3;17002:19;;16620:407::o;20157:356::-;20359:2;20341:21;;;20378:18;;;20371:30;20437:34;20432:2;20417:18;;20410:62;20504:2;20489:18;;20157:356::o;22093:413::-;22295:2;22277:21;;;22334:2;22314:18;;;22307:30;22373:34;22368:2;22353:18;;22346:62;-1:-1:-1;;;22439:2:1;22424:18;;22417:47;22496:3;22481:19;;22093:413::o;24552:275::-;24623:2;24617:9;24688:2;24669:13;;-1:-1:-1;;24665:27:1;24653:40;;24723:18;24708:34;;24744:22;;;24705:62;24702:88;;;24770:18;;:::i;:::-;24806:2;24799:22;24552:275;;-1:-1:-1;24552:275:1:o;24958:128::-;24998:3;25029:1;25025:6;25022:1;25019:13;25016:39;;;25035:18;;:::i;:::-;-1:-1:-1;25071:9:1;;24958:128::o;25091:120::-;25131:1;25157;25147:35;;25162:18;;:::i;:::-;-1:-1:-1;25196:9:1;;25091:120::o;25216:168::-;25256:7;25322:1;25318;25314:6;25310:14;25307:1;25304:21;25299:1;25292:9;25285:17;25281:45;25278:71;;;25329:18;;:::i;:::-;-1:-1:-1;25369:9:1;;25216:168::o;25389:125::-;25429:4;25457:1;25454;25451:8;25448:34;;;25462:18;;:::i;:::-;-1:-1:-1;25499:9:1;;25389:125::o;25519:258::-;25591:1;25601:113;25615:6;25612:1;25609:13;25601:113;;;25691:11;;;25685:18;25672:11;;;25665:39;25637:2;25630:10;25601:113;;;25732:6;25729:1;25726:13;25723:48;;;-1:-1:-1;;25767:1:1;25749:16;;25742:27;25519:258::o;25782:380::-;25861:1;25857:12;;;;25904;;;25925:61;;25979:4;25971:6;25967:17;25957:27;;25925:61;26032:2;26024:6;26021:14;26001:18;25998:38;25995:161;;;26078:10;26073:3;26069:20;26066:1;26059:31;26113:4;26110:1;26103:15;26141:4;26138:1;26131:15;25995:161;;25782:380;;;:::o;26167:135::-;26206:3;-1:-1:-1;;26227:17:1;;26224:43;;;26247:18;;:::i;:::-;-1:-1:-1;26294:1:1;26283:13;;26167:135::o;26307:112::-;26339:1;26365;26355:35;;26370:18;;:::i;:::-;-1:-1:-1;26404:9:1;;26307:112::o;26424:127::-;26485:10;26480:3;26476:20;26473:1;26466:31;26516:4;26513:1;26506:15;26540:4;26537:1;26530:15;26556:127;26617:10;26612:3;26608:20;26605:1;26598:31;26648:4;26645:1;26638:15;26672:4;26669:1;26662:15;26688:127;26749:10;26744:3;26740:20;26737:1;26730:31;26780:4;26777:1;26770:15;26804:4;26801:1;26794:15;26820:127;26881:10;26876:3;26872:20;26869:1;26862:31;26912:4;26909:1;26902:15;26936:4;26933:1;26926:15;26952:131;-1:-1:-1;;;;;27027:31:1;;27017:42;;27007:70;;27073:1;27070;27063:12;27088:118;27174:5;27167:13;27160:21;27153:5;27150:32;27140:60;;27196:1;27193;27186:12;27211:131;-1:-1:-1;;;;;;27285:32:1;;27275:43;;27265:71;;27332:1;27329;27322:12

Swarm Source

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