ETH Price: $3,099.98 (+1.06%)
Gas: 17 Gwei

Token

Shruglife (SL4L)
 

Overview

Max Total Supply

168 SL4L

Holders

117

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
highsamurai.eth
Balance
1 SL4L
0xb827aa3bf868ab566703f87e0c45988d92472bbf
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:
Shruglife

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-03
*/

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;


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

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

    bool private _paused;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: @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: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol


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

pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

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


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

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/Shruglife.sol


pragma solidity ^0.8.10;









contract Shruglife is
    ERC721,
    ERC721Enumerable,
    Pausable,
    Ownable,
    ERC721Burnable,
    PaymentSplitter,
    ReentrancyGuard
{
    using Counters for Counters.Counter;

    // Sale Settings
    uint256 public loosiePrice = 0.04444 ether;
    uint256 public packPrice =  0.16 ether;
    uint256 public saleTotalMint = 4444;
    uint256 public saleMintMax = 44;
    uint256 public freeMintStopID = 53;
    uint256 public rewardMintCount = 400;

    // Share settings
    address[] private addressList = [
        0x9BBe7C1dc257edAd5bACe934B38DC8b2845F656D,
        0x0916574F19FFb02a0C7089b3D1E0CB49b92a64fd
    ];
    uint256[] private shareList = [65, 35];

    Counters.Counter private _tokenIdCounter;

    constructor()
        ERC721("Shruglife", "SL4L")
        PaymentSplitter(addressList, shareList)
    {
        for (uint256 i = 0; i < 10; ++i) {
            _safeMint(addressList[0], _tokenIdCounter.current());
            _tokenIdCounter.increment();
        }
    }

    function _baseURI() internal pure override returns (string memory) {
        return "https://metadata.shruglife.xyz/";
    }

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

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

    function mint(uint256 _loosies, uint256 _packs) public payable nonReentrant {
        uint256 _totalMints = _loosies + (_packs * 4);

        require(_totalMints >= 1, "Mint amount must be at least 1");
        require(_totalMints <= saleMintMax, "Mint amount is greater than max mint for this sale");
        require(_tokenIdCounter.current() + _totalMints < saleTotalMint, "Not enough Shrugs remaining");
        require(balanceOf(msg.sender) + _totalMints <= saleMintMax, "Too many Shrugs in wallet to mint");

        if (_tokenIdCounter.current() <= freeMintStopID){
            require(_loosies == 1, "You can only mint 1 right now");
            require(_packs == 0, "Packs are not available yet");
            require(balanceOf(msg.sender) < 1, "You must not currently own a shrug to mint");
        }
        if ((_tokenIdCounter.current() > freeMintStopID) && (_tokenIdCounter.current() <= saleTotalMint - rewardMintCount)){
            require(msg.value >= ((_loosies * loosiePrice) + (_packs * packPrice)), "Sent value needs to be greater than or equal to the price");
        }
        if (_tokenIdCounter.current() >  saleTotalMint - rewardMintCount){
            require(balanceOf(msg.sender) >= 1, "You must currently own a shrug to mint");
            require(_totalMints == 1, "You can only mint 1 reward shrug");
        }

        for (uint256 i = 0; i < _totalMints; ++i) {
            _safeMint(msg.sender, _tokenIdCounter.current());
            _tokenIdCounter.increment();
        }
    }

    function mintCount() public 
        view
        virtual
        returns (uint256) {
        return _tokenIdCounter.current();
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) whenNotPaused {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        return string(abi.encodePacked(super.tokenURI(tokenId), ".json"));
    }

    // The following functions are overrides required by Solidity.

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

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"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMintStopID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"loosiePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_loosies","type":"uint256"},{"internalType":"uint256","name":"_packs","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"packPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":[],"name":"rewardMintCount","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":"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":[],"name":"saleMintMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleTotalMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052669de1f1cdd180006013556702386f26fc10000060145561115c601555602c60165560356017556101906018556040518060400160405280739bbe7c1dc257edad5bace934b38dc8b2845f656d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001730916574f19ffb02a0c7089b3d1e0cb49b92a64fd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506019906002620000d89291906200120a565b506040518060400160405280604160ff168152602001602360ff16815250601a9060026200010892919062001299565b503480156200011657600080fd5b5060198054806020026020016040519081016040528092919081815260200182805480156200019b57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831162000150575b5050505050601a805480602002602001604051908101604052809291908181526020018280548015620001ee57602002820191906000526020600020905b815481526020019060010190808311620001d9575b50505050506040518060400160405280600981526020017f53687275676c69666500000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f534c344c00000000000000000000000000000000000000000000000000000000815250816000908051906020019062000277929190620012f0565b50806001908051906020019062000290929190620012f0565b5050506000600a60006101000a81548160ff021916908315150217905550620002ce620002c26200047f60201b60201c565b6200048760201b60201c565b805182511462000315576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200030c9062001427565b60405180910390fd5b60008251116200035c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003539062001499565b60405180910390fd5b60005b8251811015620003cb57620003b5838281518110620003835762000382620014bb565b5b6020026020010151838381518110620003a157620003a0620014bb565b5b60200260200101516200054d60201b60201c565b8080620003c29062001523565b9150506200035f565b505050600160128190555060005b600a81101562000478576200044d6019600081548110620003ff57620003fe620014bb565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1662000441601b6200078760201b62001e921760201c565b6200079560201b60201c565b62000464601b620007bb60201b62001ea01760201c565b80620004709062001523565b9050620003d9565b5062001cd4565b600033905090565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620005c0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005b790620015e7565b60405180910390fd5b6000811162000606576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005fd9062001659565b60405180910390fd5b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146200068b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200068290620016f1565b60405180910390fd5b600f829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600b5462000742919062001713565b600b819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac82826040516200077b929190620017c6565b60405180910390a15050565b600081600001549050919050565b620007b7828260405180602001604052806000815250620007d160201b60201c565b5050565b6001816000016000828254019250508190555050565b620007e383836200083f60201b60201c565b620007f8600084848462000a2560201b60201c565b6200083a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008319062001869565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620008b2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008a990620018db565b60405180910390fd5b620008c38162000bcf60201b60201c565b1562000906576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008fd906200194d565b60405180910390fd5b6200091a6000838362000c3b60201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200096c919062001713565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600062000a538473ffffffffffffffffffffffffffffffffffffffff1662000cab60201b62001eb61760201c565b1562000bc2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262000a856200047f60201b60201c565b8786866040518563ffffffff1660e01b815260040162000aa9949392919062001a13565b6020604051808303816000875af192505050801562000ae857506040513d601f19601f8201168201806040525081019062000ae5919062001ac9565b60015b62000b71573d806000811462000b1b576040519150601f19603f3d011682016040523d82523d6000602084013e62000b20565b606091505b5060008151141562000b69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b609062001869565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000bc7565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b62000c4b62000cbe60201b60201c565b1562000c8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c859062001b4b565b60405180910390fd5b62000ca683838362000cd560201b62001ec91760201c565b505050565b600080823b905060008111915050919050565b6000600a60009054906101000a900460ff16905090565b62000ced83838362000e1c60201b62001fdd1760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000d3a5762000d348162000e2160201b60201c565b62000d82565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000d815762000d80838262000e6a60201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000dcf5762000dc98162000fe760201b60201c565b62000e17565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000e165762000e158282620010c360201b60201c565b5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000e84846200114f60201b620018911760201c565b62000e90919062001b6d565b905060006007600084815260200190815260200160002054905081811462000f76576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000ffd919062001b6d565b905060006009600084815260200190815260200160002054905060006008838154811062001030576200102f620014bb565b5b906000526020600020015490508060088381548110620010555762001054620014bb565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480620010a757620010a662001ba8565b5b6001900381819060005260206000200160009055905550505050565b6000620010db836200114f60201b620018911760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620011c3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620011ba9062001c4d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805482825590600052602060002090810192821562001286579160200282015b82811115620012855782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906200122b565b5b50905062001295919062001381565b5090565b828054828255906000526020600020908101928215620012dd579160200282015b82811115620012dc578251829060ff16905591602001919060010190620012ba565b5b509050620012ec919062001381565b5090565b828054620012fe9062001c9e565b90600052602060002090601f0160209004810192826200132257600085556200136e565b82601f106200133d57805160ff19168380011785556200136e565b828001600101855582156200136e579182015b828111156200136d57825182559160200191906001019062001350565b5b5090506200137d919062001381565b5090565b5b808211156200139c57600081600090555060010162001382565b5090565b600082825260208201905092915050565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b60006200140f603283620013a0565b91506200141c82620013b1565b604082019050919050565b60006020820190508181036000830152620014428162001400565b9050919050565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b600062001481601a83620013a0565b91506200148e8262001449565b602082019050919050565b60006020820190508181036000830152620014b48162001472565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b6000620015308262001519565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620015665762001565620014ea565b5b600182019050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b6000620015cf602c83620013a0565b9150620015dc8262001571565b604082019050919050565b600060208201905081810360008301526200160281620015c0565b9050919050565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b600062001641601d83620013a0565b91506200164e8262001609565b602082019050919050565b60006020820190508181036000830152620016748162001632565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b6000620016d9602b83620013a0565b9150620016e6826200167b565b604082019050919050565b600060208201905081810360008301526200170c81620016ca565b9050919050565b6000620017208262001519565b91506200172d8362001519565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620017655762001764620014ea565b5b828201905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200179d8262001770565b9050919050565b620017af8162001790565b82525050565b620017c08162001519565b82525050565b6000604082019050620017dd6000830185620017a4565b620017ec6020830184620017b5565b9392505050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600062001851603283620013a0565b91506200185e82620017f3565b604082019050919050565b60006020820190508181036000830152620018848162001842565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000620018c3602083620013a0565b9150620018d0826200188b565b602082019050919050565b60006020820190508181036000830152620018f681620018b4565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600062001935601c83620013a0565b91506200194282620018fd565b602082019050919050565b60006020820190508181036000830152620019688162001926565b9050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015620019ab5780820151818401526020810190506200198e565b83811115620019bb576000848401525b50505050565b6000601f19601f8301169050919050565b6000620019df826200196f565b620019eb81856200197a565b9350620019fd8185602086016200198b565b62001a0881620019c1565b840191505092915050565b600060808201905062001a2a6000830187620017a4565b62001a396020830186620017a4565b62001a486040830185620017b5565b818103606083015262001a5c8184620019d2565b905095945050505050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62001aa38162001a6c565b811462001aaf57600080fd5b50565b60008151905062001ac38162001a98565b92915050565b60006020828403121562001ae25762001ae162001a67565b5b600062001af28482850162001ab2565b91505092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600062001b33601083620013a0565b915062001b408262001afb565b602082019050919050565b6000602082019050818103600083015262001b668162001b24565b9050919050565b600062001b7a8262001519565b915062001b878362001519565b92508282101562001b9d5762001b9c620014ea565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600062001c35602a83620013a0565b915062001c428262001bd7565b604082019050919050565b6000602082019050818103600083015262001c688162001c26565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062001cb757607f821691505b6020821081141562001cce5762001ccd62001c6f565b5b50919050565b615a398062001ce46000396000f3fe60806040526004361061023e5760003560e01c80636352211e1161012e5780639659867e116100ab578063ce7c2ac21161006f578063ce7c2ac2146108c4578063d79779b214610901578063e33b7de31461093e578063e985e9c514610969578063f2fde38b146109a657610285565b80639659867e146107cd5780639852595c146107f8578063a22cb46514610835578063b88d4fde1461085e578063c87b56dd1461088757610285565b806377e1b372116100f257806377e1b372146106f85780638456cb59146107235780638b83209b1461073a5780638da5cb5b1461077757806395d89b41146107a257610285565b80636352211e1461061157806366d6ae1a1461064e57806370a0823114610679578063715018a6146106b65780637151664e146106cd57610285565b80632f745c59116101bc57806342842e0e1161018057806342842e0e1461052e57806342966c681461055757806348b75044146105805780634f6ccce7146105a95780635c975abb146105e657610285565b80632f745c5914610447578063335c8b63146104845780633a98ef39146104af5780633f4ba83a146104da578063406072a9146104f157610285565b8063145bd42e11610203578063145bd42e1461038357806318160ddd146103ae57806319165587146103d95780631b2ef1ca1461040257806323b872dd1461041e57610285565b806265e2081461028a57806301ffc9a7146102b557806306fdde03146102f2578063081812fc1461031d578063095ea7b31461035a57610285565b36610285577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061026c6109cf565b3460405161027b9291906138fa565b60405180910390a1005b600080fd5b34801561029657600080fd5b5061029f6109d7565b6040516102ac9190613923565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d791906139aa565b6109dd565b6040516102e991906139f2565b60405180910390f35b3480156102fe57600080fd5b506103076109ef565b6040516103149190613aa6565b60405180910390f35b34801561032957600080fd5b50610344600480360381019061033f9190613af4565b610a81565b6040516103519190613b21565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c9190613b68565b610b06565b005b34801561038f57600080fd5b50610398610c1e565b6040516103a59190613923565b60405180910390f35b3480156103ba57600080fd5b506103c3610c24565b6040516103d09190613923565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb9190613be6565b610c31565b005b61041c60048036038101906104179190613c13565b610ddc565b005b34801561042a57600080fd5b5061044560048036038101906104409190613c53565b6111fa565b005b34801561045357600080fd5b5061046e60048036038101906104699190613b68565b61125a565b60405161047b9190613923565b60405180910390f35b34801561049057600080fd5b506104996112ff565b6040516104a69190613923565b60405180910390f35b3480156104bb57600080fd5b506104c4611305565b6040516104d19190613923565b60405180910390f35b3480156104e657600080fd5b506104ef61130f565b005b3480156104fd57600080fd5b5061051860048036038101906105139190613ce4565b611395565b6040516105259190613923565b60405180910390f35b34801561053a57600080fd5b5061055560048036038101906105509190613c53565b61141c565b005b34801561056357600080fd5b5061057e60048036038101906105799190613af4565b61143c565b005b34801561058c57600080fd5b506105a760048036038101906105a29190613ce4565b611498565b005b3480156105b557600080fd5b506105d060048036038101906105cb9190613af4565b611751565b6040516105dd9190613923565b60405180910390f35b3480156105f257600080fd5b506105fb6117c2565b60405161060891906139f2565b60405180910390f35b34801561061d57600080fd5b5061063860048036038101906106339190613af4565b6117d9565b6040516106459190613b21565b60405180910390f35b34801561065a57600080fd5b5061066361188b565b6040516106709190613923565b60405180910390f35b34801561068557600080fd5b506106a0600480360381019061069b9190613d24565b611891565b6040516106ad9190613923565b60405180910390f35b3480156106c257600080fd5b506106cb611949565b005b3480156106d957600080fd5b506106e26119d1565b6040516106ef9190613923565b60405180910390f35b34801561070457600080fd5b5061070d6119d7565b60405161071a9190613923565b60405180910390f35b34801561072f57600080fd5b506107386119dd565b005b34801561074657600080fd5b50610761600480360381019061075c9190613af4565b611a63565b60405161076e9190613b21565b60405180910390f35b34801561078357600080fd5b5061078c611aab565b6040516107999190613b21565b60405180910390f35b3480156107ae57600080fd5b506107b7611ad5565b6040516107c49190613aa6565b60405180910390f35b3480156107d957600080fd5b506107e2611b67565b6040516107ef9190613923565b60405180910390f35b34801561080457600080fd5b5061081f600480360381019061081a9190613d24565b611b78565b60405161082c9190613923565b60405180910390f35b34801561084157600080fd5b5061085c60048036038101906108579190613d7d565b611bc1565b005b34801561086a57600080fd5b5061088560048036038101906108809190613ef2565b611bd7565b005b34801561089357600080fd5b506108ae60048036038101906108a99190613af4565b611c39565b6040516108bb9190613aa6565b60405180910390f35b3480156108d057600080fd5b506108eb60048036038101906108e69190613d24565b611c6a565b6040516108f89190613923565b60405180910390f35b34801561090d57600080fd5b5061092860048036038101906109239190613f75565b611cb3565b6040516109359190613923565b60405180910390f35b34801561094a57600080fd5b50610953611cfc565b6040516109609190613923565b60405180910390f35b34801561097557600080fd5b50610990600480360381019061098b9190613fa2565b611d06565b60405161099d91906139f2565b60405180910390f35b3480156109b257600080fd5b506109cd60048036038101906109c89190613d24565b611d9a565b005b600033905090565b60155481565b60006109e882611fe2565b9050919050565b6060600080546109fe90614011565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2a90614011565b8015610a775780601f10610a4c57610100808354040283529160200191610a77565b820191906000526020600020905b815481529060010190602001808311610a5a57829003601f168201915b5050505050905090565b6000610a8c8261205c565b610acb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac2906140b5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b11826117d9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7990614147565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ba16109cf565b73ffffffffffffffffffffffffffffffffffffffff161480610bd05750610bcf81610bca6109cf565b611d06565b5b610c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c06906141d9565b60405180910390fd5b610c1983836120c8565b505050565b60175481565b6000600880549050905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caa9061426b565b60405180910390fd5b6000610cbd611cfc565b47610cc891906142ba565b90506000610cdf8383610cda86611b78565b612181565b90506000811415610d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1c90614382565b60405180910390fd5b80600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d7491906142ba565b9250508190555080600c6000828254610d8d91906142ba565b92505081905550610d9e83826121ef565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610dcf929190614401565b60405180910390a1505050565b60026012541415610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1990614476565b60405180910390fd5b60026012819055506000600482610e399190614496565b83610e4491906142ba565b90506001811015610e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e819061453c565b60405180910390fd5b601654811115610ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec6906145ce565b60405180910390fd5b60155481610edd601b611e92565b610ee791906142ba565b10610f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1e9061463a565b60405180910390fd5b60165481610f3433611891565b610f3e91906142ba565b1115610f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f76906146cc565b60405180910390fd5b601754610f8c601b611e92565b116110635760018314610fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcb90614738565b60405180910390fd5b60008214611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e906147a4565b60405180910390fd5b600161102233611891565b10611062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105990614836565b60405180910390fd5b5b601754611070601b611e92565b11801561109557506018546015546110889190614856565b611092601b611e92565b11155b1561110357601454826110a89190614496565b601354846110b69190614496565b6110c091906142ba565b341015611102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f9906148fc565b60405180910390fd5b5b6018546015546111139190614856565b61111d601b611e92565b11156111b357600161112e33611891565b101561116f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111669061498e565b60405180910390fd5b600181146111b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a9906149fa565b60405180910390fd5b5b60005b818110156111ec576111d1336111cc601b611e92565b6122e3565b6111db601b611ea0565b806111e590614a1a565b90506111b6565b505060016012819055505050565b61120b6112056109cf565b82612301565b61124a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124190614ad5565b60405180910390fd5b6112558383836123df565b505050565b600061126583611891565b82106112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d90614b67565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60145481565b6000600b54905090565b6113176109cf565b73ffffffffffffffffffffffffffffffffffffffff16611335611aab565b73ffffffffffffffffffffffffffffffffffffffff161461138b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138290614bd3565b60405180910390fd5b61139361263b565b565b6000601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61143783838360405180602001604052806000815250611bd7565b505050565b61144d6114476109cf565b82612301565b61148c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148390614c65565b60405180910390fd5b611495816126dd565b50565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161151a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115119061426b565b60405180910390fd5b600061152583611cb3565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161155e9190613b21565b602060405180830381865afa15801561157b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159f9190614c9a565b6115a991906142ba565b905060006115c183836115bc8787611395565b612181565b90506000811415611607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fe90614382565b60405180910390fd5b80601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461169391906142ba565b9250508190555080601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116e991906142ba565b925050819055506116fb8484836127ee565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a84836040516117439291906138fa565b60405180910390a250505050565b600061175b610c24565b821061179c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179390614d39565b60405180910390fd5b600882815481106117b0576117af614d59565b5b90600052602060002001549050919050565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187990614dfa565b60405180910390fd5b80915050919050565b60165481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f990614e8c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6119516109cf565b73ffffffffffffffffffffffffffffffffffffffff1661196f611aab565b73ffffffffffffffffffffffffffffffffffffffff16146119c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bc90614bd3565b60405180910390fd5b6119cf6000612874565b565b60185481565b60135481565b6119e56109cf565b73ffffffffffffffffffffffffffffffffffffffff16611a03611aab565b73ffffffffffffffffffffffffffffffffffffffff1614611a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5090614bd3565b60405180910390fd5b611a6161293a565b565b6000600f8281548110611a7957611a78614d59565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611ae490614011565b80601f0160208091040260200160405190810160405280929190818152602001828054611b1090614011565b8015611b5d5780601f10611b3257610100808354040283529160200191611b5d565b820191906000526020600020905b815481529060010190602001808311611b4057829003601f168201915b5050505050905090565b6000611b73601b611e92565b905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611bd3611bcc6109cf565b83836129dd565b5050565b611be8611be26109cf565b83612301565b611c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1e90614ad5565b60405180910390fd5b611c3384848484612b4a565b50505050565b6060611c4482612ba6565b604051602001611c549190614f34565b6040516020818303038152906040529050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600c54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611da26109cf565b73ffffffffffffffffffffffffffffffffffffffff16611dc0611aab565b73ffffffffffffffffffffffffffffffffffffffff1614611e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0d90614bd3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7d90614fc8565b60405180910390fd5b611e8f81612874565b50565b600081600001549050919050565b6001816000016000828254019250508190555050565b600080823b905060008111915050919050565b611ed4838383611fdd565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f1757611f1281612c4d565b611f56565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611f5557611f548382612c96565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f9957611f9481612e03565b611fd8565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611fd757611fd68282612ed4565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612055575061205482612f53565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661213b836117d9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600b54600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856121d29190614496565b6121dc9190615017565b6121e69190614856565b90509392505050565b80471015612232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222990615094565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612258906150e5565b60006040518083038185875af1925050503d8060008114612295576040519150601f19603f3d011682016040523d82523d6000602084013e61229a565b606091505b50509050806122de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d59061516c565b60405180910390fd5b505050565b6122fd828260405180602001604052806000815250613035565b5050565b600061230c8261205c565b61234b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612342906151fe565b60405180910390fd5b6000612356836117d9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123c557508373ffffffffffffffffffffffffffffffffffffffff166123ad84610a81565b73ffffffffffffffffffffffffffffffffffffffff16145b806123d657506123d58185611d06565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123ff826117d9565b73ffffffffffffffffffffffffffffffffffffffff1614612455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244c90615290565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bc90615322565b60405180910390fd5b6124d0838383613090565b6124db6000826120c8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461252b9190614856565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461258291906142ba565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6126436117c2565b612682576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126799061538e565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6126c66109cf565b6040516126d39190613b21565b60405180910390a1565b60006126e8826117d9565b90506126f681600084613090565b6127016000836120c8565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127519190614856565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61286f8363a9059cbb60e01b848460405160240161280d9291906138fa565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130e8565b505050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6129426117c2565b15612982576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612979906153fa565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586129c66109cf565b6040516129d39190613b21565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4390615466565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612b3d91906139f2565b60405180910390a3505050565b612b558484846123df565b612b61848484846131af565b612ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b97906154f8565b60405180910390fd5b50505050565b6060612bb18261205c565b612bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be79061558a565b60405180910390fd5b6000612bfa613337565b90506000815111612c1a5760405180602001604052806000815250612c45565b80612c2484613374565b604051602001612c359291906155aa565b6040516020818303038152906040525b915050919050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612ca384611891565b612cad9190614856565b9050600060076000848152602001908152602001600020549050818114612d92576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e179190614856565b9050600060096000848152602001908152602001600020549050600060088381548110612e4757612e46614d59565b5b906000526020600020015490508060088381548110612e6957612e68614d59565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612eb857612eb76155ce565b5b6001900381819060005260206000200160009055905550505050565b6000612edf83611891565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061301e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061302e575061302d826134d5565b5b9050919050565b61303f838361353f565b61304c60008484846131af565b61308b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613082906154f8565b60405180910390fd5b505050565b6130986117c2565b156130d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130cf906153fa565b60405180910390fd5b6130e3838383611ec9565b505050565b600061314a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661370d9092919063ffffffff16565b90506000815111156131aa578080602001905181019061316a9190615612565b6131a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a0906156b1565b60405180910390fd5b5b505050565b60006131d08473ffffffffffffffffffffffffffffffffffffffff16611eb6565b1561332a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131f96109cf565b8786866040518563ffffffff1660e01b815260040161321b9493929190615726565b6020604051808303816000875af192505050801561325757506040513d601f19601f820116820180604052508101906132549190615787565b60015b6132da573d8060008114613287576040519150601f19603f3d011682016040523d82523d6000602084013e61328c565b606091505b506000815114156132d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c9906154f8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061332f565b600190505b949350505050565b60606040518060400160405280601f81526020017f68747470733a2f2f6d657461646174612e73687275676c6966652e78797a2f00815250905090565b606060008214156133bc576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134d0565b600082905060005b600082146133ee5780806133d790614a1a565b915050600a826133e79190615017565b91506133c4565b60008167ffffffffffffffff81111561340a57613409613dc7565b5b6040519080825280601f01601f19166020018201604052801561343c5781602001600182028036833780820191505090505b5090505b600085146134c9576001826134559190614856565b9150600a8561346491906157b4565b603061347091906142ba565b60f81b81838151811061348657613485614d59565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134c29190615017565b9450613440565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135a690615831565b60405180910390fd5b6135b88161205c565b156135f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ef9061589d565b60405180910390fd5b61360460008383613090565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461365491906142ba565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b606061371c8484600085613725565b90509392505050565b60608247101561376a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137619061592f565b60405180910390fd5b61377385611eb6565b6137b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a99061599b565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516137db91906159ec565b60006040518083038185875af1925050503d8060008114613818576040519150601f19603f3d011682016040523d82523d6000602084013e61381d565b606091505b509150915061382d828286613839565b92505050949350505050565b6060831561384957829050613899565b60008351111561385c5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138909190613aa6565b60405180910390fd5b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006138cb826138a0565b9050919050565b6138db816138c0565b82525050565b6000819050919050565b6138f4816138e1565b82525050565b600060408201905061390f60008301856138d2565b61391c60208301846138eb565b9392505050565b600060208201905061393860008301846138eb565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61398781613952565b811461399257600080fd5b50565b6000813590506139a48161397e565b92915050565b6000602082840312156139c0576139bf613948565b5b60006139ce84828501613995565b91505092915050565b60008115159050919050565b6139ec816139d7565b82525050565b6000602082019050613a0760008301846139e3565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a47578082015181840152602081019050613a2c565b83811115613a56576000848401525b50505050565b6000601f19601f8301169050919050565b6000613a7882613a0d565b613a828185613a18565b9350613a92818560208601613a29565b613a9b81613a5c565b840191505092915050565b60006020820190508181036000830152613ac08184613a6d565b905092915050565b613ad1816138e1565b8114613adc57600080fd5b50565b600081359050613aee81613ac8565b92915050565b600060208284031215613b0a57613b09613948565b5b6000613b1884828501613adf565b91505092915050565b6000602082019050613b3660008301846138d2565b92915050565b613b45816138c0565b8114613b5057600080fd5b50565b600081359050613b6281613b3c565b92915050565b60008060408385031215613b7f57613b7e613948565b5b6000613b8d85828601613b53565b9250506020613b9e85828601613adf565b9150509250929050565b6000613bb3826138a0565b9050919050565b613bc381613ba8565b8114613bce57600080fd5b50565b600081359050613be081613bba565b92915050565b600060208284031215613bfc57613bfb613948565b5b6000613c0a84828501613bd1565b91505092915050565b60008060408385031215613c2a57613c29613948565b5b6000613c3885828601613adf565b9250506020613c4985828601613adf565b9150509250929050565b600080600060608486031215613c6c57613c6b613948565b5b6000613c7a86828701613b53565b9350506020613c8b86828701613b53565b9250506040613c9c86828701613adf565b9150509250925092565b6000613cb1826138c0565b9050919050565b613cc181613ca6565b8114613ccc57600080fd5b50565b600081359050613cde81613cb8565b92915050565b60008060408385031215613cfb57613cfa613948565b5b6000613d0985828601613ccf565b9250506020613d1a85828601613b53565b9150509250929050565b600060208284031215613d3a57613d39613948565b5b6000613d4884828501613b53565b91505092915050565b613d5a816139d7565b8114613d6557600080fd5b50565b600081359050613d7781613d51565b92915050565b60008060408385031215613d9457613d93613948565b5b6000613da285828601613b53565b9250506020613db385828601613d68565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613dff82613a5c565b810181811067ffffffffffffffff82111715613e1e57613e1d613dc7565b5b80604052505050565b6000613e3161393e565b9050613e3d8282613df6565b919050565b600067ffffffffffffffff821115613e5d57613e5c613dc7565b5b613e6682613a5c565b9050602081019050919050565b82818337600083830152505050565b6000613e95613e9084613e42565b613e27565b905082815260208101848484011115613eb157613eb0613dc2565b5b613ebc848285613e73565b509392505050565b600082601f830112613ed957613ed8613dbd565b5b8135613ee9848260208601613e82565b91505092915050565b60008060008060808587031215613f0c57613f0b613948565b5b6000613f1a87828801613b53565b9450506020613f2b87828801613b53565b9350506040613f3c87828801613adf565b925050606085013567ffffffffffffffff811115613f5d57613f5c61394d565b5b613f6987828801613ec4565b91505092959194509250565b600060208284031215613f8b57613f8a613948565b5b6000613f9984828501613ccf565b91505092915050565b60008060408385031215613fb957613fb8613948565b5b6000613fc785828601613b53565b9250506020613fd885828601613b53565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061402957607f821691505b6020821081141561403d5761403c613fe2565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061409f602c83613a18565b91506140aa82614043565b604082019050919050565b600060208201905081810360008301526140ce81614092565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614131602183613a18565b915061413c826140d5565b604082019050919050565b6000602082019050818103600083015261416081614124565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006141c3603883613a18565b91506141ce82614167565b604082019050919050565b600060208201905081810360008301526141f2816141b6565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b6000614255602683613a18565b9150614260826141f9565b604082019050919050565b6000602082019050818103600083015261428481614248565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006142c5826138e1565b91506142d0836138e1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143055761430461428b565b5b828201905092915050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b600061436c602b83613a18565b915061437782614310565b604082019050919050565b6000602082019050818103600083015261439b8161435f565b9050919050565b6000819050919050565b60006143c76143c26143bd846138a0565b6143a2565b6138a0565b9050919050565b60006143d9826143ac565b9050919050565b60006143eb826143ce565b9050919050565b6143fb816143e0565b82525050565b600060408201905061441660008301856143f2565b61442360208301846138eb565b9392505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614460601f83613a18565b915061446b8261442a565b602082019050919050565b6000602082019050818103600083015261448f81614453565b9050919050565b60006144a1826138e1565b91506144ac836138e1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144e5576144e461428b565b5b828202905092915050565b7f4d696e7420616d6f756e74206d757374206265206174206c6561737420310000600082015250565b6000614526601e83613a18565b9150614531826144f0565b602082019050919050565b6000602082019050818103600083015261455581614519565b9050919050565b7f4d696e7420616d6f756e742069732067726561746572207468616e206d61782060008201527f6d696e7420666f7220746869732073616c650000000000000000000000000000602082015250565b60006145b8603283613a18565b91506145c38261455c565b604082019050919050565b600060208201905081810360008301526145e7816145ab565b9050919050565b7f4e6f7420656e6f756768205368727567732072656d61696e696e670000000000600082015250565b6000614624601b83613a18565b915061462f826145ee565b602082019050919050565b6000602082019050818103600083015261465381614617565b9050919050565b7f546f6f206d616e792053687275677320696e2077616c6c657420746f206d696e60008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b60006146b6602183613a18565b91506146c18261465a565b604082019050919050565b600060208201905081810360008301526146e5816146a9565b9050919050565b7f596f752063616e206f6e6c79206d696e742031207269676874206e6f77000000600082015250565b6000614722601d83613a18565b915061472d826146ec565b602082019050919050565b6000602082019050818103600083015261475181614715565b9050919050565b7f5061636b7320617265206e6f7420617661696c61626c65207965740000000000600082015250565b600061478e601b83613a18565b915061479982614758565b602082019050919050565b600060208201905081810360008301526147bd81614781565b9050919050565b7f596f75206d757374206e6f742063757272656e746c79206f776e20612073687260008201527f756720746f206d696e7400000000000000000000000000000000000000000000602082015250565b6000614820602a83613a18565b915061482b826147c4565b604082019050919050565b6000602082019050818103600083015261484f81614813565b9050919050565b6000614861826138e1565b915061486c836138e1565b92508282101561487f5761487e61428b565b5b828203905092915050565b7f53656e742076616c7565206e6565647320746f2062652067726561746572207460008201527f68616e206f7220657175616c20746f2074686520707269636500000000000000602082015250565b60006148e6603983613a18565b91506148f18261488a565b604082019050919050565b60006020820190508181036000830152614915816148d9565b9050919050565b7f596f75206d7573742063757272656e746c79206f776e2061207368727567207460008201527f6f206d696e740000000000000000000000000000000000000000000000000000602082015250565b6000614978602683613a18565b91506149838261491c565b604082019050919050565b600060208201905081810360008301526149a78161496b565b9050919050565b7f596f752063616e206f6e6c79206d696e74203120726577617264207368727567600082015250565b60006149e4602083613a18565b91506149ef826149ae565b602082019050919050565b60006020820190508181036000830152614a13816149d7565b9050919050565b6000614a25826138e1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a5857614a5761428b565b5b600182019050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614abf603183613a18565b9150614aca82614a63565b604082019050919050565b60006020820190508181036000830152614aee81614ab2565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614b51602b83613a18565b9150614b5c82614af5565b604082019050919050565b60006020820190508181036000830152614b8081614b44565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614bbd602083613a18565b9150614bc882614b87565b602082019050919050565b60006020820190508181036000830152614bec81614bb0565b9050919050565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b6000614c4f603083613a18565b9150614c5a82614bf3565b604082019050919050565b60006020820190508181036000830152614c7e81614c42565b9050919050565b600081519050614c9481613ac8565b92915050565b600060208284031215614cb057614caf613948565b5b6000614cbe84828501614c85565b91505092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614d23602c83613a18565b9150614d2e82614cc7565b604082019050919050565b60006020820190508181036000830152614d5281614d16565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614de4602983613a18565b9150614def82614d88565b604082019050919050565b60006020820190508181036000830152614e1381614dd7565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614e76602a83613a18565b9150614e8182614e1a565b604082019050919050565b60006020820190508181036000830152614ea581614e69565b9050919050565b600081905092915050565b6000614ec282613a0d565b614ecc8185614eac565b9350614edc818560208601613a29565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614f1e600583614eac565b9150614f2982614ee8565b600582019050919050565b6000614f408284614eb7565b9150614f4b82614f11565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614fb2602683613a18565b9150614fbd82614f56565b604082019050919050565b60006020820190508181036000830152614fe181614fa5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615022826138e1565b915061502d836138e1565b92508261503d5761503c614fe8565b5b828204905092915050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b600061507e601d83613a18565b915061508982615048565b602082019050919050565b600060208201905081810360008301526150ad81615071565b9050919050565b600081905092915050565b50565b60006150cf6000836150b4565b91506150da826150bf565b600082019050919050565b60006150f0826150c2565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000615156603a83613a18565b9150615161826150fa565b604082019050919050565b6000602082019050818103600083015261518581615149565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006151e8602c83613a18565b91506151f38261518c565b604082019050919050565b60006020820190508181036000830152615217816151db565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061527a602983613a18565b91506152858261521e565b604082019050919050565b600060208201905081810360008301526152a98161526d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061530c602483613a18565b9150615317826152b0565b604082019050919050565b6000602082019050818103600083015261533b816152ff565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000615378601483613a18565b915061538382615342565b602082019050919050565b600060208201905081810360008301526153a78161536b565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006153e4601083613a18565b91506153ef826153ae565b602082019050919050565b60006020820190508181036000830152615413816153d7565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615450601983613a18565b915061545b8261541a565b602082019050919050565b6000602082019050818103600083015261547f81615443565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006154e2603283613a18565b91506154ed82615486565b604082019050919050565b60006020820190508181036000830152615511816154d5565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615574602f83613a18565b915061557f82615518565b604082019050919050565b600060208201905081810360008301526155a381615567565b9050919050565b60006155b68285614eb7565b91506155c28284614eb7565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008151905061560c81613d51565b92915050565b60006020828403121561562857615627613948565b5b6000615636848285016155fd565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061569b602a83613a18565b91506156a68261563f565b604082019050919050565b600060208201905081810360008301526156ca8161568e565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006156f8826156d1565b61570281856156dc565b9350615712818560208601613a29565b61571b81613a5c565b840191505092915050565b600060808201905061573b60008301876138d2565b61574860208301866138d2565b61575560408301856138eb565b818103606083015261576781846156ed565b905095945050505050565b6000815190506157818161397e565b92915050565b60006020828403121561579d5761579c613948565b5b60006157ab84828501615772565b91505092915050565b60006157bf826138e1565b91506157ca836138e1565b9250826157da576157d9614fe8565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061581b602083613a18565b9150615826826157e5565b602082019050919050565b6000602082019050818103600083015261584a8161580e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615887601c83613a18565b915061589282615851565b602082019050919050565b600060208201905081810360008301526158b68161587a565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615919602683613a18565b9150615924826158bd565b604082019050919050565b600060208201905081810360008301526159488161590c565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615985601d83613a18565b91506159908261594f565b602082019050919050565b600060208201905081810360008301526159b481615978565b9050919050565b60006159c6826156d1565b6159d081856150b4565b93506159e0818560208601613a29565b80840191505092915050565b60006159f882846159bb565b91508190509291505056fea26469706673582212204ea76faed153eb019c51d6ccefa6ce43c9786382fa993359f2a21f31931b933064736f6c634300080a0033

Deployed Bytecode

0x60806040526004361061023e5760003560e01c80636352211e1161012e5780639659867e116100ab578063ce7c2ac21161006f578063ce7c2ac2146108c4578063d79779b214610901578063e33b7de31461093e578063e985e9c514610969578063f2fde38b146109a657610285565b80639659867e146107cd5780639852595c146107f8578063a22cb46514610835578063b88d4fde1461085e578063c87b56dd1461088757610285565b806377e1b372116100f257806377e1b372146106f85780638456cb59146107235780638b83209b1461073a5780638da5cb5b1461077757806395d89b41146107a257610285565b80636352211e1461061157806366d6ae1a1461064e57806370a0823114610679578063715018a6146106b65780637151664e146106cd57610285565b80632f745c59116101bc57806342842e0e1161018057806342842e0e1461052e57806342966c681461055757806348b75044146105805780634f6ccce7146105a95780635c975abb146105e657610285565b80632f745c5914610447578063335c8b63146104845780633a98ef39146104af5780633f4ba83a146104da578063406072a9146104f157610285565b8063145bd42e11610203578063145bd42e1461038357806318160ddd146103ae57806319165587146103d95780631b2ef1ca1461040257806323b872dd1461041e57610285565b806265e2081461028a57806301ffc9a7146102b557806306fdde03146102f2578063081812fc1461031d578063095ea7b31461035a57610285565b36610285577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061026c6109cf565b3460405161027b9291906138fa565b60405180910390a1005b600080fd5b34801561029657600080fd5b5061029f6109d7565b6040516102ac9190613923565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d791906139aa565b6109dd565b6040516102e991906139f2565b60405180910390f35b3480156102fe57600080fd5b506103076109ef565b6040516103149190613aa6565b60405180910390f35b34801561032957600080fd5b50610344600480360381019061033f9190613af4565b610a81565b6040516103519190613b21565b60405180910390f35b34801561036657600080fd5b50610381600480360381019061037c9190613b68565b610b06565b005b34801561038f57600080fd5b50610398610c1e565b6040516103a59190613923565b60405180910390f35b3480156103ba57600080fd5b506103c3610c24565b6040516103d09190613923565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb9190613be6565b610c31565b005b61041c60048036038101906104179190613c13565b610ddc565b005b34801561042a57600080fd5b5061044560048036038101906104409190613c53565b6111fa565b005b34801561045357600080fd5b5061046e60048036038101906104699190613b68565b61125a565b60405161047b9190613923565b60405180910390f35b34801561049057600080fd5b506104996112ff565b6040516104a69190613923565b60405180910390f35b3480156104bb57600080fd5b506104c4611305565b6040516104d19190613923565b60405180910390f35b3480156104e657600080fd5b506104ef61130f565b005b3480156104fd57600080fd5b5061051860048036038101906105139190613ce4565b611395565b6040516105259190613923565b60405180910390f35b34801561053a57600080fd5b5061055560048036038101906105509190613c53565b61141c565b005b34801561056357600080fd5b5061057e60048036038101906105799190613af4565b61143c565b005b34801561058c57600080fd5b506105a760048036038101906105a29190613ce4565b611498565b005b3480156105b557600080fd5b506105d060048036038101906105cb9190613af4565b611751565b6040516105dd9190613923565b60405180910390f35b3480156105f257600080fd5b506105fb6117c2565b60405161060891906139f2565b60405180910390f35b34801561061d57600080fd5b5061063860048036038101906106339190613af4565b6117d9565b6040516106459190613b21565b60405180910390f35b34801561065a57600080fd5b5061066361188b565b6040516106709190613923565b60405180910390f35b34801561068557600080fd5b506106a0600480360381019061069b9190613d24565b611891565b6040516106ad9190613923565b60405180910390f35b3480156106c257600080fd5b506106cb611949565b005b3480156106d957600080fd5b506106e26119d1565b6040516106ef9190613923565b60405180910390f35b34801561070457600080fd5b5061070d6119d7565b60405161071a9190613923565b60405180910390f35b34801561072f57600080fd5b506107386119dd565b005b34801561074657600080fd5b50610761600480360381019061075c9190613af4565b611a63565b60405161076e9190613b21565b60405180910390f35b34801561078357600080fd5b5061078c611aab565b6040516107999190613b21565b60405180910390f35b3480156107ae57600080fd5b506107b7611ad5565b6040516107c49190613aa6565b60405180910390f35b3480156107d957600080fd5b506107e2611b67565b6040516107ef9190613923565b60405180910390f35b34801561080457600080fd5b5061081f600480360381019061081a9190613d24565b611b78565b60405161082c9190613923565b60405180910390f35b34801561084157600080fd5b5061085c60048036038101906108579190613d7d565b611bc1565b005b34801561086a57600080fd5b5061088560048036038101906108809190613ef2565b611bd7565b005b34801561089357600080fd5b506108ae60048036038101906108a99190613af4565b611c39565b6040516108bb9190613aa6565b60405180910390f35b3480156108d057600080fd5b506108eb60048036038101906108e69190613d24565b611c6a565b6040516108f89190613923565b60405180910390f35b34801561090d57600080fd5b5061092860048036038101906109239190613f75565b611cb3565b6040516109359190613923565b60405180910390f35b34801561094a57600080fd5b50610953611cfc565b6040516109609190613923565b60405180910390f35b34801561097557600080fd5b50610990600480360381019061098b9190613fa2565b611d06565b60405161099d91906139f2565b60405180910390f35b3480156109b257600080fd5b506109cd60048036038101906109c89190613d24565b611d9a565b005b600033905090565b60155481565b60006109e882611fe2565b9050919050565b6060600080546109fe90614011565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2a90614011565b8015610a775780601f10610a4c57610100808354040283529160200191610a77565b820191906000526020600020905b815481529060010190602001808311610a5a57829003601f168201915b5050505050905090565b6000610a8c8261205c565b610acb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac2906140b5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b11826117d9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7990614147565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ba16109cf565b73ffffffffffffffffffffffffffffffffffffffff161480610bd05750610bcf81610bca6109cf565b611d06565b5b610c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c06906141d9565b60405180910390fd5b610c1983836120c8565b505050565b60175481565b6000600880549050905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caa9061426b565b60405180910390fd5b6000610cbd611cfc565b47610cc891906142ba565b90506000610cdf8383610cda86611b78565b612181565b90506000811415610d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1c90614382565b60405180910390fd5b80600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d7491906142ba565b9250508190555080600c6000828254610d8d91906142ba565b92505081905550610d9e83826121ef565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610dcf929190614401565b60405180910390a1505050565b60026012541415610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1990614476565b60405180910390fd5b60026012819055506000600482610e399190614496565b83610e4491906142ba565b90506001811015610e8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e819061453c565b60405180910390fd5b601654811115610ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec6906145ce565b60405180910390fd5b60155481610edd601b611e92565b610ee791906142ba565b10610f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1e9061463a565b60405180910390fd5b60165481610f3433611891565b610f3e91906142ba565b1115610f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f76906146cc565b60405180910390fd5b601754610f8c601b611e92565b116110635760018314610fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcb90614738565b60405180910390fd5b60008214611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e906147a4565b60405180910390fd5b600161102233611891565b10611062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105990614836565b60405180910390fd5b5b601754611070601b611e92565b11801561109557506018546015546110889190614856565b611092601b611e92565b11155b1561110357601454826110a89190614496565b601354846110b69190614496565b6110c091906142ba565b341015611102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f9906148fc565b60405180910390fd5b5b6018546015546111139190614856565b61111d601b611e92565b11156111b357600161112e33611891565b101561116f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111669061498e565b60405180910390fd5b600181146111b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a9906149fa565b60405180910390fd5b5b60005b818110156111ec576111d1336111cc601b611e92565b6122e3565b6111db601b611ea0565b806111e590614a1a565b90506111b6565b505060016012819055505050565b61120b6112056109cf565b82612301565b61124a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124190614ad5565b60405180910390fd5b6112558383836123df565b505050565b600061126583611891565b82106112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d90614b67565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60145481565b6000600b54905090565b6113176109cf565b73ffffffffffffffffffffffffffffffffffffffff16611335611aab565b73ffffffffffffffffffffffffffffffffffffffff161461138b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138290614bd3565b60405180910390fd5b61139361263b565b565b6000601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61143783838360405180602001604052806000815250611bd7565b505050565b61144d6114476109cf565b82612301565b61148c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148390614c65565b60405180910390fd5b611495816126dd565b50565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161151a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115119061426b565b60405180910390fd5b600061152583611cb3565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161155e9190613b21565b602060405180830381865afa15801561157b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159f9190614c9a565b6115a991906142ba565b905060006115c183836115bc8787611395565b612181565b90506000811415611607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fe90614382565b60405180910390fd5b80601160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461169391906142ba565b9250508190555080601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116e991906142ba565b925050819055506116fb8484836127ee565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a84836040516117439291906138fa565b60405180910390a250505050565b600061175b610c24565b821061179c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179390614d39565b60405180910390fd5b600882815481106117b0576117af614d59565b5b90600052602060002001549050919050565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187990614dfa565b60405180910390fd5b80915050919050565b60165481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f990614e8c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6119516109cf565b73ffffffffffffffffffffffffffffffffffffffff1661196f611aab565b73ffffffffffffffffffffffffffffffffffffffff16146119c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bc90614bd3565b60405180910390fd5b6119cf6000612874565b565b60185481565b60135481565b6119e56109cf565b73ffffffffffffffffffffffffffffffffffffffff16611a03611aab565b73ffffffffffffffffffffffffffffffffffffffff1614611a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5090614bd3565b60405180910390fd5b611a6161293a565b565b6000600f8281548110611a7957611a78614d59565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611ae490614011565b80601f0160208091040260200160405190810160405280929190818152602001828054611b1090614011565b8015611b5d5780601f10611b3257610100808354040283529160200191611b5d565b820191906000526020600020905b815481529060010190602001808311611b4057829003601f168201915b5050505050905090565b6000611b73601b611e92565b905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611bd3611bcc6109cf565b83836129dd565b5050565b611be8611be26109cf565b83612301565b611c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1e90614ad5565b60405180910390fd5b611c3384848484612b4a565b50505050565b6060611c4482612ba6565b604051602001611c549190614f34565b6040516020818303038152906040529050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600c54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611da26109cf565b73ffffffffffffffffffffffffffffffffffffffff16611dc0611aab565b73ffffffffffffffffffffffffffffffffffffffff1614611e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0d90614bd3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7d90614fc8565b60405180910390fd5b611e8f81612874565b50565b600081600001549050919050565b6001816000016000828254019250508190555050565b600080823b905060008111915050919050565b611ed4838383611fdd565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f1757611f1281612c4d565b611f56565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611f5557611f548382612c96565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f9957611f9481612e03565b611fd8565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611fd757611fd68282612ed4565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612055575061205482612f53565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661213b836117d9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600b54600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856121d29190614496565b6121dc9190615017565b6121e69190614856565b90509392505050565b80471015612232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222990615094565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612258906150e5565b60006040518083038185875af1925050503d8060008114612295576040519150601f19603f3d011682016040523d82523d6000602084013e61229a565b606091505b50509050806122de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d59061516c565b60405180910390fd5b505050565b6122fd828260405180602001604052806000815250613035565b5050565b600061230c8261205c565b61234b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612342906151fe565b60405180910390fd5b6000612356836117d9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123c557508373ffffffffffffffffffffffffffffffffffffffff166123ad84610a81565b73ffffffffffffffffffffffffffffffffffffffff16145b806123d657506123d58185611d06565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123ff826117d9565b73ffffffffffffffffffffffffffffffffffffffff1614612455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244c90615290565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bc90615322565b60405180910390fd5b6124d0838383613090565b6124db6000826120c8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461252b9190614856565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461258291906142ba565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6126436117c2565b612682576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126799061538e565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6126c66109cf565b6040516126d39190613b21565b60405180910390a1565b60006126e8826117d9565b90506126f681600084613090565b6127016000836120c8565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127519190614856565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61286f8363a9059cbb60e01b848460405160240161280d9291906138fa565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130e8565b505050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6129426117c2565b15612982576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612979906153fa565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586129c66109cf565b6040516129d39190613b21565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4390615466565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612b3d91906139f2565b60405180910390a3505050565b612b558484846123df565b612b61848484846131af565b612ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b97906154f8565b60405180910390fd5b50505050565b6060612bb18261205c565b612bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be79061558a565b60405180910390fd5b6000612bfa613337565b90506000815111612c1a5760405180602001604052806000815250612c45565b80612c2484613374565b604051602001612c359291906155aa565b6040516020818303038152906040525b915050919050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612ca384611891565b612cad9190614856565b9050600060076000848152602001908152602001600020549050818114612d92576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e179190614856565b9050600060096000848152602001908152602001600020549050600060088381548110612e4757612e46614d59565b5b906000526020600020015490508060088381548110612e6957612e68614d59565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612eb857612eb76155ce565b5b6001900381819060005260206000200160009055905550505050565b6000612edf83611891565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061301e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061302e575061302d826134d5565b5b9050919050565b61303f838361353f565b61304c60008484846131af565b61308b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613082906154f8565b60405180910390fd5b505050565b6130986117c2565b156130d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130cf906153fa565b60405180910390fd5b6130e3838383611ec9565b505050565b600061314a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661370d9092919063ffffffff16565b90506000815111156131aa578080602001905181019061316a9190615612565b6131a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a0906156b1565b60405180910390fd5b5b505050565b60006131d08473ffffffffffffffffffffffffffffffffffffffff16611eb6565b1561332a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026131f96109cf565b8786866040518563ffffffff1660e01b815260040161321b9493929190615726565b6020604051808303816000875af192505050801561325757506040513d601f19601f820116820180604052508101906132549190615787565b60015b6132da573d8060008114613287576040519150601f19603f3d011682016040523d82523d6000602084013e61328c565b606091505b506000815114156132d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c9906154f8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061332f565b600190505b949350505050565b60606040518060400160405280601f81526020017f68747470733a2f2f6d657461646174612e73687275676c6966652e78797a2f00815250905090565b606060008214156133bc576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134d0565b600082905060005b600082146133ee5780806133d790614a1a565b915050600a826133e79190615017565b91506133c4565b60008167ffffffffffffffff81111561340a57613409613dc7565b5b6040519080825280601f01601f19166020018201604052801561343c5781602001600182028036833780820191505090505b5090505b600085146134c9576001826134559190614856565b9150600a8561346491906157b4565b603061347091906142ba565b60f81b81838151811061348657613485614d59565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134c29190615017565b9450613440565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135a690615831565b60405180910390fd5b6135b88161205c565b156135f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ef9061589d565b60405180910390fd5b61360460008383613090565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461365491906142ba565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b606061371c8484600085613725565b90509392505050565b60608247101561376a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137619061592f565b60405180910390fd5b61377385611eb6565b6137b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a99061599b565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516137db91906159ec565b60006040518083038185875af1925050503d8060008114613818576040519150601f19603f3d011682016040523d82523d6000602084013e61381d565b606091505b509150915061382d828286613839565b92505050949350505050565b6060831561384957829050613899565b60008351111561385c5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138909190613aa6565b60405180910390fd5b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006138cb826138a0565b9050919050565b6138db816138c0565b82525050565b6000819050919050565b6138f4816138e1565b82525050565b600060408201905061390f60008301856138d2565b61391c60208301846138eb565b9392505050565b600060208201905061393860008301846138eb565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61398781613952565b811461399257600080fd5b50565b6000813590506139a48161397e565b92915050565b6000602082840312156139c0576139bf613948565b5b60006139ce84828501613995565b91505092915050565b60008115159050919050565b6139ec816139d7565b82525050565b6000602082019050613a0760008301846139e3565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a47578082015181840152602081019050613a2c565b83811115613a56576000848401525b50505050565b6000601f19601f8301169050919050565b6000613a7882613a0d565b613a828185613a18565b9350613a92818560208601613a29565b613a9b81613a5c565b840191505092915050565b60006020820190508181036000830152613ac08184613a6d565b905092915050565b613ad1816138e1565b8114613adc57600080fd5b50565b600081359050613aee81613ac8565b92915050565b600060208284031215613b0a57613b09613948565b5b6000613b1884828501613adf565b91505092915050565b6000602082019050613b3660008301846138d2565b92915050565b613b45816138c0565b8114613b5057600080fd5b50565b600081359050613b6281613b3c565b92915050565b60008060408385031215613b7f57613b7e613948565b5b6000613b8d85828601613b53565b9250506020613b9e85828601613adf565b9150509250929050565b6000613bb3826138a0565b9050919050565b613bc381613ba8565b8114613bce57600080fd5b50565b600081359050613be081613bba565b92915050565b600060208284031215613bfc57613bfb613948565b5b6000613c0a84828501613bd1565b91505092915050565b60008060408385031215613c2a57613c29613948565b5b6000613c3885828601613adf565b9250506020613c4985828601613adf565b9150509250929050565b600080600060608486031215613c6c57613c6b613948565b5b6000613c7a86828701613b53565b9350506020613c8b86828701613b53565b9250506040613c9c86828701613adf565b9150509250925092565b6000613cb1826138c0565b9050919050565b613cc181613ca6565b8114613ccc57600080fd5b50565b600081359050613cde81613cb8565b92915050565b60008060408385031215613cfb57613cfa613948565b5b6000613d0985828601613ccf565b9250506020613d1a85828601613b53565b9150509250929050565b600060208284031215613d3a57613d39613948565b5b6000613d4884828501613b53565b91505092915050565b613d5a816139d7565b8114613d6557600080fd5b50565b600081359050613d7781613d51565b92915050565b60008060408385031215613d9457613d93613948565b5b6000613da285828601613b53565b9250506020613db385828601613d68565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613dff82613a5c565b810181811067ffffffffffffffff82111715613e1e57613e1d613dc7565b5b80604052505050565b6000613e3161393e565b9050613e3d8282613df6565b919050565b600067ffffffffffffffff821115613e5d57613e5c613dc7565b5b613e6682613a5c565b9050602081019050919050565b82818337600083830152505050565b6000613e95613e9084613e42565b613e27565b905082815260208101848484011115613eb157613eb0613dc2565b5b613ebc848285613e73565b509392505050565b600082601f830112613ed957613ed8613dbd565b5b8135613ee9848260208601613e82565b91505092915050565b60008060008060808587031215613f0c57613f0b613948565b5b6000613f1a87828801613b53565b9450506020613f2b87828801613b53565b9350506040613f3c87828801613adf565b925050606085013567ffffffffffffffff811115613f5d57613f5c61394d565b5b613f6987828801613ec4565b91505092959194509250565b600060208284031215613f8b57613f8a613948565b5b6000613f9984828501613ccf565b91505092915050565b60008060408385031215613fb957613fb8613948565b5b6000613fc785828601613b53565b9250506020613fd885828601613b53565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061402957607f821691505b6020821081141561403d5761403c613fe2565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061409f602c83613a18565b91506140aa82614043565b604082019050919050565b600060208201905081810360008301526140ce81614092565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614131602183613a18565b915061413c826140d5565b604082019050919050565b6000602082019050818103600083015261416081614124565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006141c3603883613a18565b91506141ce82614167565b604082019050919050565b600060208201905081810360008301526141f2816141b6565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b6000614255602683613a18565b9150614260826141f9565b604082019050919050565b6000602082019050818103600083015261428481614248565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006142c5826138e1565b91506142d0836138e1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143055761430461428b565b5b828201905092915050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b600061436c602b83613a18565b915061437782614310565b604082019050919050565b6000602082019050818103600083015261439b8161435f565b9050919050565b6000819050919050565b60006143c76143c26143bd846138a0565b6143a2565b6138a0565b9050919050565b60006143d9826143ac565b9050919050565b60006143eb826143ce565b9050919050565b6143fb816143e0565b82525050565b600060408201905061441660008301856143f2565b61442360208301846138eb565b9392505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614460601f83613a18565b915061446b8261442a565b602082019050919050565b6000602082019050818103600083015261448f81614453565b9050919050565b60006144a1826138e1565b91506144ac836138e1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144e5576144e461428b565b5b828202905092915050565b7f4d696e7420616d6f756e74206d757374206265206174206c6561737420310000600082015250565b6000614526601e83613a18565b9150614531826144f0565b602082019050919050565b6000602082019050818103600083015261455581614519565b9050919050565b7f4d696e7420616d6f756e742069732067726561746572207468616e206d61782060008201527f6d696e7420666f7220746869732073616c650000000000000000000000000000602082015250565b60006145b8603283613a18565b91506145c38261455c565b604082019050919050565b600060208201905081810360008301526145e7816145ab565b9050919050565b7f4e6f7420656e6f756768205368727567732072656d61696e696e670000000000600082015250565b6000614624601b83613a18565b915061462f826145ee565b602082019050919050565b6000602082019050818103600083015261465381614617565b9050919050565b7f546f6f206d616e792053687275677320696e2077616c6c657420746f206d696e60008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b60006146b6602183613a18565b91506146c18261465a565b604082019050919050565b600060208201905081810360008301526146e5816146a9565b9050919050565b7f596f752063616e206f6e6c79206d696e742031207269676874206e6f77000000600082015250565b6000614722601d83613a18565b915061472d826146ec565b602082019050919050565b6000602082019050818103600083015261475181614715565b9050919050565b7f5061636b7320617265206e6f7420617661696c61626c65207965740000000000600082015250565b600061478e601b83613a18565b915061479982614758565b602082019050919050565b600060208201905081810360008301526147bd81614781565b9050919050565b7f596f75206d757374206e6f742063757272656e746c79206f776e20612073687260008201527f756720746f206d696e7400000000000000000000000000000000000000000000602082015250565b6000614820602a83613a18565b915061482b826147c4565b604082019050919050565b6000602082019050818103600083015261484f81614813565b9050919050565b6000614861826138e1565b915061486c836138e1565b92508282101561487f5761487e61428b565b5b828203905092915050565b7f53656e742076616c7565206e6565647320746f2062652067726561746572207460008201527f68616e206f7220657175616c20746f2074686520707269636500000000000000602082015250565b60006148e6603983613a18565b91506148f18261488a565b604082019050919050565b60006020820190508181036000830152614915816148d9565b9050919050565b7f596f75206d7573742063757272656e746c79206f776e2061207368727567207460008201527f6f206d696e740000000000000000000000000000000000000000000000000000602082015250565b6000614978602683613a18565b91506149838261491c565b604082019050919050565b600060208201905081810360008301526149a78161496b565b9050919050565b7f596f752063616e206f6e6c79206d696e74203120726577617264207368727567600082015250565b60006149e4602083613a18565b91506149ef826149ae565b602082019050919050565b60006020820190508181036000830152614a13816149d7565b9050919050565b6000614a25826138e1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a5857614a5761428b565b5b600182019050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614abf603183613a18565b9150614aca82614a63565b604082019050919050565b60006020820190508181036000830152614aee81614ab2565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614b51602b83613a18565b9150614b5c82614af5565b604082019050919050565b60006020820190508181036000830152614b8081614b44565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614bbd602083613a18565b9150614bc882614b87565b602082019050919050565b60006020820190508181036000830152614bec81614bb0565b9050919050565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b6000614c4f603083613a18565b9150614c5a82614bf3565b604082019050919050565b60006020820190508181036000830152614c7e81614c42565b9050919050565b600081519050614c9481613ac8565b92915050565b600060208284031215614cb057614caf613948565b5b6000614cbe84828501614c85565b91505092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614d23602c83613a18565b9150614d2e82614cc7565b604082019050919050565b60006020820190508181036000830152614d5281614d16565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614de4602983613a18565b9150614def82614d88565b604082019050919050565b60006020820190508181036000830152614e1381614dd7565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614e76602a83613a18565b9150614e8182614e1a565b604082019050919050565b60006020820190508181036000830152614ea581614e69565b9050919050565b600081905092915050565b6000614ec282613a0d565b614ecc8185614eac565b9350614edc818560208601613a29565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614f1e600583614eac565b9150614f2982614ee8565b600582019050919050565b6000614f408284614eb7565b9150614f4b82614f11565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614fb2602683613a18565b9150614fbd82614f56565b604082019050919050565b60006020820190508181036000830152614fe181614fa5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615022826138e1565b915061502d836138e1565b92508261503d5761503c614fe8565b5b828204905092915050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b600061507e601d83613a18565b915061508982615048565b602082019050919050565b600060208201905081810360008301526150ad81615071565b9050919050565b600081905092915050565b50565b60006150cf6000836150b4565b91506150da826150bf565b600082019050919050565b60006150f0826150c2565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000615156603a83613a18565b9150615161826150fa565b604082019050919050565b6000602082019050818103600083015261518581615149565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006151e8602c83613a18565b91506151f38261518c565b604082019050919050565b60006020820190508181036000830152615217816151db565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061527a602983613a18565b91506152858261521e565b604082019050919050565b600060208201905081810360008301526152a98161526d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061530c602483613a18565b9150615317826152b0565b604082019050919050565b6000602082019050818103600083015261533b816152ff565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000615378601483613a18565b915061538382615342565b602082019050919050565b600060208201905081810360008301526153a78161536b565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006153e4601083613a18565b91506153ef826153ae565b602082019050919050565b60006020820190508181036000830152615413816153d7565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615450601983613a18565b915061545b8261541a565b602082019050919050565b6000602082019050818103600083015261547f81615443565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006154e2603283613a18565b91506154ed82615486565b604082019050919050565b60006020820190508181036000830152615511816154d5565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615574602f83613a18565b915061557f82615518565b604082019050919050565b600060208201905081810360008301526155a381615567565b9050919050565b60006155b68285614eb7565b91506155c28284614eb7565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008151905061560c81613d51565b92915050565b60006020828403121561562857615627613948565b5b6000615636848285016155fd565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061569b602a83613a18565b91506156a68261563f565b604082019050919050565b600060208201905081810360008301526156ca8161568e565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006156f8826156d1565b61570281856156dc565b9350615712818560208601613a29565b61571b81613a5c565b840191505092915050565b600060808201905061573b60008301876138d2565b61574860208301866138d2565b61575560408301856138eb565b818103606083015261576781846156ed565b905095945050505050565b6000815190506157818161397e565b92915050565b60006020828403121561579d5761579c613948565b5b60006157ab84828501615772565b91505092915050565b60006157bf826138e1565b91506157ca836138e1565b9250826157da576157d9614fe8565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061581b602083613a18565b9150615826826157e5565b602082019050919050565b6000602082019050818103600083015261584a8161580e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615887601c83613a18565b915061589282615851565b602082019050919050565b600060208201905081810360008301526158b68161587a565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615919602683613a18565b9150615924826158bd565b604082019050919050565b600060208201905081810360008301526159488161590c565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615985601d83613a18565b91506159908261594f565b602082019050919050565b600060208201905081810360008301526159b481615978565b9050919050565b60006159c6826156d1565b6159d081856150b4565b93506159e0818560208601613a29565b80840191505092915050565b60006159f882846159bb565b91508190509291505056fea26469706673582212204ea76faed153eb019c51d6ccefa6ce43c9786382fa993359f2a21f31931b933064736f6c634300080a0033

Deployed Bytecode Sourcemap

66318:3761:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30373:40;30389:12;:10;:12::i;:::-;30403:9;30373:40;;;;;;;:::i;:::-;;;;;;;;66318:3761;;;;;66637:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69864:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46794:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48353:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47876:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66717:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60728:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32159:566;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67635:1538;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49103:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60396:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66592:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30504:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67562:65;;;;;;;;;;;;;:::i;:::-;;31633:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49513:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58825:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32993:641;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60918:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13799:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46488:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66679:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46218:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11850:103;;;;;;;;;;;;;:::i;:::-;;66758:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66543:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67493:61;;;;;;;;;;;;;:::i;:::-;;31859:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11199:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46963:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69181:138;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31355:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48646:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49769:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69564:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31151:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30941:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30689:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48872:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12108:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9923:98;9976:7;10003:10;9996:17;;9923:98;:::o;66637:35::-;;;;:::o;69864:212::-;70003:4;70032:36;70056:11;70032:23;:36::i;:::-;70025:43;;69864:212;;;:::o;46794:100::-;46848:13;46881:5;46874:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46794:100;:::o;48353:221::-;48429:7;48457:16;48465:7;48457;:16::i;:::-;48449:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48542:15;:24;48558:7;48542:24;;;;;;;;;;;;;;;;;;;;;48535:31;;48353:221;;;:::o;47876:411::-;47957:13;47973:23;47988:7;47973:14;:23::i;:::-;47957:39;;48021:5;48015:11;;:2;:11;;;;48007:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;48115:5;48099:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;48124:37;48141:5;48148:12;:10;:12::i;:::-;48124:16;:37::i;:::-;48099:62;48077:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;48258:21;48267:2;48271:7;48258:8;:21::i;:::-;47946:341;47876:411;;:::o;66717:34::-;;;;:::o;60728:113::-;60789:7;60816:10;:17;;;;60809:24;;60728:113;:::o;32159:566::-;32254:1;32235:7;:16;32243:7;32235:16;;;;;;;;;;;;;;;;:20;32227:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;32311:21;32359:15;:13;:15::i;:::-;32335:21;:39;;;;:::i;:::-;32311:63;;32385:15;32403:58;32419:7;32428:13;32443:17;32452:7;32443:8;:17::i;:::-;32403:15;:58::i;:::-;32385:76;;32493:1;32482:7;:12;;32474:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32577:7;32555:9;:18;32565:7;32555:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;32613:7;32595:14;;:25;;;;;;;:::i;:::-;;;;;;;;32633:35;32651:7;32660;32633:17;:35::i;:::-;32684:33;32700:7;32709;32684:33;;;;;;;:::i;:::-;;;;;;;;32216:509;;32159:566;:::o;67635:1538::-;1812:1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;67722:19:::1;67765:1;67756:6;:10;;;;:::i;:::-;67744:8;:23;;;;:::i;:::-;67722:45;;67803:1;67788:11;:16;;67780:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;67873:11;;67858;:26;;67850:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;68000:13;;67986:11;67958:25;:15;:23;:25::i;:::-;:39;;;;:::i;:::-;:55;67950:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;68103:11;;68088;68064:21;68074:10;68064:9;:21::i;:::-;:35;;;;:::i;:::-;:50;;68056:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;68198:14;;68169:25;:15;:23;:25::i;:::-;:43;68165:291;;68248:1;68236:8;:13;68228:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;68316:1;68306:6;:11;68298:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;68396:1;68372:21;68382:10;68372:9;:21::i;:::-;:25;68364:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;68165:291;68499:14;;68471:25;:15;:23;:25::i;:::-;:42;68470:110;;;;;68564:15;;68548:13;;:31;;;;:::i;:::-;68519:25;:15;:23;:25::i;:::-;:60;;68470:110;68466:274;;;68655:9;;68646:6;:18;;;;:::i;:::-;68630:11;;68619:8;:22;;;;:::i;:::-;68618:47;;;;:::i;:::-;68604:9;:62;;68596:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;68466:274;68799:15;;68783:13;;:31;;;;:::i;:::-;68754:25;:15;:23;:25::i;:::-;:60;68750:245;;;68863:1;68838:21;68848:10;68838:9;:21::i;:::-;:26;;68830:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;68945:1;68930:11;:16;68922:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;68750:245;69012:9;69007:159;69031:11;69027:1;:15;69007:159;;;69064:48;69074:10;69086:25;:15;:23;:25::i;:::-;69064:9;:48::i;:::-;69127:27;:15;:25;:27::i;:::-;69044:3;;;;:::i;:::-;;;69007:159;;;;67711:1462;1768:1:::0;2722:7;:22;;;;67635:1538;;:::o;49103:339::-;49298:41;49317:12;:10;:12::i;:::-;49331:7;49298:18;:41::i;:::-;49290:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;49406:28;49416:4;49422:2;49426:7;49406:9;:28::i;:::-;49103:339;;;:::o;60396:256::-;60493:7;60529:23;60546:5;60529:16;:23::i;:::-;60521:5;:31;60513:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;60618:12;:19;60631:5;60618:19;;;;;;;;;;;;;;;:26;60638:5;60618:26;;;;;;;;;;;;60611:33;;60396:256;;;;:::o;66592:38::-;;;;:::o;30504:91::-;30548:7;30575:12;;30568:19;;30504:91;:::o;67562:65::-;11430:12;:10;:12::i;:::-;11419:23;;:7;:5;:7::i;:::-;:23;;;11411:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67609:10:::1;:8;:10::i;:::-;67562:65::o:0;31633:135::-;31703:7;31730:14;:21;31745:5;31730:21;;;;;;;;;;;;;;;:30;31752:7;31730:30;;;;;;;;;;;;;;;;31723:37;;31633:135;;;;:::o;49513:185::-;49651:39;49668:4;49674:2;49678:7;49651:39;;;;;;;;;;;;:16;:39::i;:::-;49513:185;;;:::o;58825:245::-;58943:41;58962:12;:10;:12::i;:::-;58976:7;58943:18;:41::i;:::-;58935:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;59048:14;59054:7;59048:5;:14::i;:::-;58825:245;:::o;32993:641::-;33094:1;33075:7;:16;33083:7;33075:16;;;;;;;;;;;;;;;;:20;33067:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;33151:21;33208:20;33222:5;33208:13;:20::i;:::-;33175:5;:15;;;33199:4;33175:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;33151:77;;33239:15;33257:65;33273:7;33282:13;33297:24;33306:5;33313:7;33297:8;:24::i;:::-;33257:15;:65::i;:::-;33239:83;;33354:1;33343:7;:12;;33335:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33450:7;33416:14;:21;33431:5;33416:21;;;;;;;;;;;;;;;:30;33438:7;33416:30;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;33498:7;33468:19;:26;33488:5;33468:26;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;33518:47;33541:5;33548:7;33557;33518:22;:47::i;:::-;33602:5;33581:45;;;33609:7;33618;33581:45;;;;;;;:::i;:::-;;;;;;;;33056:578;;32993:641;;:::o;60918:233::-;60993:7;61029:30;:28;:30::i;:::-;61021:5;:38;61013:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;61126:10;61137:5;61126:17;;;;;;;;:::i;:::-;;;;;;;;;;61119:24;;60918:233;;;:::o;13799:86::-;13846:4;13870:7;;;;;;;;;;;13863:14;;13799:86;:::o;46488:239::-;46560:7;46580:13;46596:7;:16;46604:7;46596:16;;;;;;;;;;;;;;;;;;;;;46580:32;;46648:1;46631:19;;:5;:19;;;;46623:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46714:5;46707:12;;;46488:239;;;:::o;66679:31::-;;;;:::o;46218:208::-;46290:7;46335:1;46318:19;;:5;:19;;;;46310:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46402:9;:16;46412:5;46402:16;;;;;;;;;;;;;;;;46395:23;;46218:208;;;:::o;11850:103::-;11430:12;:10;:12::i;:::-;11419:23;;:7;:5;:7::i;:::-;:23;;;11411:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11915:30:::1;11942:1;11915:18;:30::i;:::-;11850:103::o:0;66758:36::-;;;;:::o;66543:42::-;;;;:::o;67493:61::-;11430:12;:10;:12::i;:::-;11419:23;;:7;:5;:7::i;:::-;:23;;;11411:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67538:8:::1;:6;:8::i;:::-;67493:61::o:0;31859:100::-;31910:7;31937;31945:5;31937:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31930:21;;31859:100;;;:::o;11199:87::-;11245:7;11272:6;;;;;;;;;;;11265:13;;11199:87;:::o;46963:104::-;47019:13;47052:7;47045:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46963:104;:::o;69181:138::-;69259:7;69286:25;:15;:23;:25::i;:::-;69279:32;;69181:138;:::o;31355:109::-;31411:7;31438:9;:18;31448:7;31438:18;;;;;;;;;;;;;;;;31431:25;;31355:109;;;:::o;48646:155::-;48741:52;48760:12;:10;:12::i;:::-;48774:8;48784;48741:18;:52::i;:::-;48646:155;;:::o;49769:328::-;49944:41;49963:12;:10;:12::i;:::-;49977:7;49944:18;:41::i;:::-;49936:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;50050:39;50064:4;50070:2;50074:7;50083:5;50050:13;:39::i;:::-;49769:328;;;;:::o;69564:222::-;69682:13;69744:23;69759:7;69744:14;:23::i;:::-;69727:50;;;;;;;;:::i;:::-;;;;;;;;;;;;;69713:65;;69564:222;;;:::o;31151:105::-;31205:7;31232;:16;31240:7;31232:16;;;;;;;;;;;;;;;;31225:23;;31151:105;;;:::o;30941:119::-;30999:7;31026:19;:26;31046:5;31026:26;;;;;;;;;;;;;;;;31019:33;;30941:119;;;:::o;30689:95::-;30735:7;30762:14;;30755:21;;30689:95;:::o;48872:164::-;48969:4;48993:18;:25;49012:5;48993:25;;;;;;;;;;;;;;;:35;49019:8;48993:35;;;;;;;;;;;;;;;;;;;;;;;;;48986:42;;48872:164;;;;:::o;12108:201::-;11430:12;:10;:12::i;:::-;11419:23;;:7;:5;:7::i;:::-;:23;;;11411:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12217:1:::1;12197:22;;:8;:22;;;;12189:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12273:28;12292:8;12273:18;:28::i;:::-;12108:201:::0;:::o;6527:114::-;6592:7;6619;:14;;;6612:21;;6527:114;;;:::o;6649:127::-;6756:1;6738:7;:14;;;:19;;;;;;;;;;;6649:127;:::o;15805:387::-;15865:4;16073:12;16140:7;16128:20;16120:28;;16183:1;16176:4;:8;16169:15;;;15805:387;;;:::o;61764:589::-;61908:45;61935:4;61941:2;61945:7;61908:26;:45::i;:::-;61986:1;61970:18;;:4;:18;;;61966:187;;;62005:40;62037:7;62005:31;:40::i;:::-;61966:187;;;62075:2;62067:10;;:4;:10;;;62063:90;;62094:47;62127:4;62133:7;62094:32;:47::i;:::-;62063:90;61966:187;62181:1;62167:16;;:2;:16;;;62163:183;;;62200:45;62237:7;62200:36;:45::i;:::-;62163:183;;;62273:4;62267:10;;:2;:10;;;62263:83;;62294:40;62322:2;62326:7;62294:27;:40::i;:::-;62263:83;62163:183;61764:589;;;:::o;58156:126::-;;;;:::o;60088:224::-;60190:4;60229:35;60214:50;;;:11;:50;;;;:90;;;;60268:36;60292:11;60268:23;:36::i;:::-;60214:90;60207:97;;60088:224;;;:::o;51607:127::-;51672:4;51724:1;51696:30;;:7;:16;51704:7;51696:16;;;;;;;;;;;;;;;;;;;;;:30;;;;51689:37;;51607:127;;;:::o;55589:174::-;55691:2;55664:15;:24;55680:7;55664:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;55747:7;55743:2;55709:46;;55718:23;55733:7;55718:14;:23::i;:::-;55709:46;;;;;;;;;;;;55589:174;;:::o;33812:248::-;33958:7;34037:15;34022:12;;34002:7;:16;34010:7;34002:16;;;;;;;;;;;;;;;;33986:13;:32;;;;:::i;:::-;33985:49;;;;:::i;:::-;:67;;;;:::i;:::-;33978:74;;33812:248;;;;;:::o;17127:317::-;17242:6;17217:21;:31;;17209:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;17296:12;17314:9;:14;;17336:6;17314:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17295:52;;;17366:7;17358:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;17198:246;17127:317;;:::o;52591:110::-;52667:26;52677:2;52681:7;52667:26;;;;;;;;;;;;:9;:26::i;:::-;52591:110;;:::o;51901:348::-;51994:4;52019:16;52027:7;52019;:16::i;:::-;52011:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52095:13;52111:23;52126:7;52111:14;:23::i;:::-;52095:39;;52164:5;52153:16;;:7;:16;;;:51;;;;52197:7;52173:31;;:20;52185:7;52173:11;:20::i;:::-;:31;;;52153:51;:87;;;;52208:32;52225:5;52232:7;52208:16;:32::i;:::-;52153:87;52145:96;;;51901:348;;;;:::o;54893:578::-;55052:4;55025:31;;:23;55040:7;55025:14;:23::i;:::-;:31;;;55017:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;55135:1;55121:16;;:2;:16;;;;55113:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;55191:39;55212:4;55218:2;55222:7;55191:20;:39::i;:::-;55295:29;55312:1;55316:7;55295:8;:29::i;:::-;55356:1;55337:9;:15;55347:4;55337:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;55385:1;55368:9;:13;55378:2;55368:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;55416:2;55397:7;:16;55405:7;55397:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;55455:7;55451:2;55436:27;;55445:4;55436:27;;;;;;;;;;;;54893:578;;;:::o;14858:120::-;14402:8;:6;:8::i;:::-;14394:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;14927:5:::1;14917:7;;:15;;;;;;;;;;;;;;;;;;14948:22;14957:12;:10;:12::i;:::-;14948:22;;;;;;:::i;:::-;;;;;;;;14858:120::o:0;54196:360::-;54256:13;54272:23;54287:7;54272:14;:23::i;:::-;54256:39;;54308:48;54329:5;54344:1;54348:7;54308:20;:48::i;:::-;54397:29;54414:1;54418:7;54397:8;:29::i;:::-;54459:1;54439:9;:16;54449:5;54439:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;54478:7;:16;54486:7;54478:16;;;;;;;;;;;;54471:23;;;;;;;;;;;54540:7;54536:1;54512:36;;54521:5;54512:36;;;;;;;;;;;;54245:311;54196:360;:::o;23833:211::-;23950:86;23970:5;24000:23;;;24025:2;24029:5;23977:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23950:19;:86::i;:::-;23833:211;;;:::o;12469:191::-;12543:16;12562:6;;;;;;;;;;;12543:25;;12588:8;12579:6;;:17;;;;;;;;;;;;;;;;;;12643:8;12612:40;;12633:8;12612:40;;;;;;;;;;;;12532:128;12469:191;:::o;14599:118::-;14125:8;:6;:8::i;:::-;14124:9;14116:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;14669:4:::1;14659:7;;:14;;;;;;;;;;;;;;;;;;14689:20;14696:12;:10;:12::i;:::-;14689:20;;;;;;:::i;:::-;;;;;;;;14599:118::o:0;55905:315::-;56060:8;56051:17;;:5;:17;;;;56043:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;56147:8;56109:18;:25;56128:5;56109:25;;;;;;;;;;;;;;;:35;56135:8;56109:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;56193:8;56171:41;;56186:5;56171:41;;;56203:8;56171:41;;;;;;:::i;:::-;;;;;;;;55905:315;;;:::o;50979:::-;51136:28;51146:4;51152:2;51156:7;51136:9;:28::i;:::-;51183:48;51206:4;51212:2;51216:7;51225:5;51183:22;:48::i;:::-;51175:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;50979:315;;;;:::o;47138:334::-;47211:13;47245:16;47253:7;47245;:16::i;:::-;47237:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;47326:21;47350:10;:8;:10::i;:::-;47326:34;;47402:1;47384:7;47378:21;:25;:86;;;;;;;;;;;;;;;;;47430:7;47439:18;:7;:16;:18::i;:::-;47413:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47378:86;47371:93;;;47138:334;;;:::o;63076:164::-;63180:10;:17;;;;63153:15;:24;63169:7;63153:24;;;;;;;;;;;:44;;;;63208:10;63224:7;63208:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63076:164;:::o;63867:988::-;64133:22;64183:1;64158:22;64175:4;64158:16;:22::i;:::-;:26;;;;:::i;:::-;64133:51;;64195:18;64216:17;:26;64234:7;64216:26;;;;;;;;;;;;64195:47;;64363:14;64349:10;:28;64345:328;;64394:19;64416:12;:18;64429:4;64416:18;;;;;;;;;;;;;;;:34;64435:14;64416:34;;;;;;;;;;;;64394:56;;64500:11;64467:12;:18;64480:4;64467:18;;;;;;;;;;;;;;;:30;64486:10;64467:30;;;;;;;;;;;:44;;;;64617:10;64584:17;:30;64602:11;64584:30;;;;;;;;;;;:43;;;;64379:294;64345:328;64769:17;:26;64787:7;64769:26;;;;;;;;;;;64762:33;;;64813:12;:18;64826:4;64813:18;;;;;;;;;;;;;;;:34;64832:14;64813:34;;;;;;;;;;;64806:41;;;63948:907;;63867:988;;:::o;65150:1079::-;65403:22;65448:1;65428:10;:17;;;;:21;;;;:::i;:::-;65403:46;;65460:18;65481:15;:24;65497:7;65481:24;;;;;;;;;;;;65460:45;;65832:19;65854:10;65865:14;65854:26;;;;;;;;:::i;:::-;;;;;;;;;;65832:48;;65918:11;65893:10;65904;65893:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;66029:10;65998:15;:28;66014:11;65998:28;;;;;;;;;;;:41;;;;66170:15;:24;66186:7;66170:24;;;;;;;;;;;66163:31;;;66205:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;65221:1008;;;65150:1079;:::o;62654:221::-;62739:14;62756:20;62773:2;62756:16;:20::i;:::-;62739:37;;62814:7;62787:12;:16;62800:2;62787:16;;;;;;;;;;;;;;;:24;62804:6;62787:24;;;;;;;;;;;:34;;;;62861:6;62832:17;:26;62850:7;62832:26;;;;;;;;;;;:35;;;;62728:147;62654:221;;:::o;45849:305::-;45951:4;46003:25;45988:40;;;:11;:40;;;;:105;;;;46060:33;46045:48;;;:11;:48;;;;45988:105;:158;;;;46110:36;46134:11;46110:23;:36::i;:::-;45988:158;45968:178;;45849:305;;;:::o;52928:321::-;53058:18;53064:2;53068:7;53058:5;:18::i;:::-;53109:54;53140:1;53144:2;53148:7;53157:5;53109:22;:54::i;:::-;53087:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;52928:321;;;:::o;69327:229::-;14125:8;:6;:8::i;:::-;14124:9;14116:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;69503:45:::1;69530:4;69536:2;69540:7;69503:26;:45::i;:::-;69327:229:::0;;;:::o;26406:716::-;26830:23;26856:69;26884:4;26856:69;;;;;;;;;;;;;;;;;26864:5;26856:27;;;;:69;;;;;:::i;:::-;26830:95;;26960:1;26940:10;:17;:21;26936:179;;;27037:10;27026:30;;;;;;;;;;;;:::i;:::-;27018:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;26936:179;26476:646;26406:716;;:::o;56785:799::-;56940:4;56961:15;:2;:13;;;:15::i;:::-;56957:620;;;57013:2;56997:36;;;57034:12;:10;:12::i;:::-;57048:4;57054:7;57063:5;56997:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;56993:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57256:1;57239:6;:13;:18;57235:272;;;57282:60;;;;;;;;;;:::i;:::-;;;;;;;;57235:272;57457:6;57451:13;57442:6;57438:2;57434:15;57427:38;56993:529;57130:41;;;57120:51;;;:6;:51;;;;57113:58;;;;;56957:620;57561:4;57554:11;;56785:799;;;;;;;:::o;67359:126::-;67411:13;67437:40;;;;;;;;;;;;;;;;;;;67359:126;:::o;7485:723::-;7541:13;7771:1;7762:5;:10;7758:53;;;7789:10;;;;;;;;;;;;;;;;;;;;;7758:53;7821:12;7836:5;7821:20;;7852:14;7877:78;7892:1;7884:4;:9;7877:78;;7910:8;;;;;:::i;:::-;;;;7941:2;7933:10;;;;;:::i;:::-;;;7877:78;;;7965:19;7997:6;7987:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7965:39;;8015:154;8031:1;8022:5;:10;8015:154;;8059:1;8049:11;;;;;:::i;:::-;;;8126:2;8118:5;:10;;;;:::i;:::-;8105:2;:24;;;;:::i;:::-;8092:39;;8075:6;8082;8075:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8155:2;8146:11;;;;;:::i;:::-;;;8015:154;;;8193:6;8179:21;;;;;7485:723;;;;:::o;37545:157::-;37630:4;37669:25;37654:40;;;:11;:40;;;;37647:47;;37545:157;;;:::o;53585:382::-;53679:1;53665:16;;:2;:16;;;;53657:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;53738:16;53746:7;53738;:16::i;:::-;53737:17;53729:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;53800:45;53829:1;53833:2;53837:7;53800:20;:45::i;:::-;53875:1;53858:9;:13;53868:2;53858:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;53906:2;53887:7;:16;53895:7;53887:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;53951:7;53947:2;53926:33;;53943:1;53926:33;;;;;;;;;;;;53585:382;;:::o;18611:229::-;18748:12;18780:52;18802:6;18810:4;18816:1;18819:12;18780:21;:52::i;:::-;18773:59;;18611:229;;;;;:::o;19731:510::-;19901:12;19959:5;19934:21;:30;;19926:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;20026:18;20037:6;20026:10;:18::i;:::-;20018:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;20092:12;20106:23;20133:6;:11;;20152:5;20159:4;20133:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20091:73;;;;20182:51;20199:7;20208:10;20220:12;20182:16;:51::i;:::-;20175:58;;;;19731:510;;;;;;:::o;22417:712::-;22567:12;22596:7;22592:530;;;22627:10;22620:17;;;;22592:530;22761:1;22741:10;:17;:21;22737:374;;;22939:10;22933:17;23000:15;22987:10;22983:2;22979:19;22972:44;22737:374;23082:12;23075:20;;;;;;;;;;;:::i;:::-;;;;;;;;22417:712;;;;;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:77::-;402:7;431:5;420:16;;365:77;;;:::o;448:118::-;535:24;553:5;535:24;:::i;:::-;530:3;523:37;448:118;;:::o;572:332::-;693:4;731:2;720:9;716:18;708:26;;744:71;812:1;801:9;797:17;788:6;744:71;:::i;:::-;825:72;893:2;882:9;878:18;869:6;825:72;:::i;:::-;572:332;;;;;:::o;910:222::-;1003:4;1041:2;1030:9;1026:18;1018:26;;1054:71;1122:1;1111:9;1107:17;1098:6;1054:71;:::i;:::-;910:222;;;;:::o;1138:75::-;1171:6;1204:2;1198:9;1188:19;;1138:75;:::o;1219:117::-;1328:1;1325;1318:12;1342:117;1451:1;1448;1441:12;1465:149;1501:7;1541:66;1534:5;1530:78;1519:89;;1465:149;;;:::o;1620:120::-;1692:23;1709:5;1692:23;:::i;:::-;1685:5;1682:34;1672:62;;1730:1;1727;1720:12;1672:62;1620:120;:::o;1746:137::-;1791:5;1829:6;1816:20;1807:29;;1845:32;1871:5;1845:32;:::i;:::-;1746:137;;;;:::o;1889:327::-;1947:6;1996:2;1984:9;1975:7;1971:23;1967:32;1964:119;;;2002:79;;:::i;:::-;1964:119;2122:1;2147:52;2191:7;2182:6;2171:9;2167:22;2147:52;:::i;:::-;2137:62;;2093:116;1889:327;;;;:::o;2222:90::-;2256:7;2299:5;2292:13;2285:21;2274:32;;2222:90;;;:::o;2318:109::-;2399:21;2414:5;2399:21;:::i;:::-;2394:3;2387:34;2318:109;;:::o;2433:210::-;2520:4;2558:2;2547:9;2543:18;2535:26;;2571:65;2633:1;2622:9;2618:17;2609:6;2571:65;:::i;:::-;2433:210;;;;:::o;2649:99::-;2701:6;2735:5;2729:12;2719:22;;2649:99;;;:::o;2754:169::-;2838:11;2872:6;2867:3;2860:19;2912:4;2907:3;2903:14;2888:29;;2754:169;;;;:::o;2929:307::-;2997:1;3007:113;3021:6;3018:1;3015:13;3007:113;;;3106:1;3101:3;3097:11;3091:18;3087:1;3082:3;3078:11;3071:39;3043:2;3040:1;3036:10;3031:15;;3007:113;;;3138:6;3135:1;3132:13;3129:101;;;3218:1;3209:6;3204:3;3200:16;3193:27;3129:101;2978:258;2929:307;;;:::o;3242:102::-;3283:6;3334:2;3330:7;3325:2;3318:5;3314:14;3310:28;3300:38;;3242:102;;;:::o;3350:364::-;3438:3;3466:39;3499:5;3466:39;:::i;:::-;3521:71;3585:6;3580:3;3521:71;:::i;:::-;3514:78;;3601:52;3646:6;3641:3;3634:4;3627:5;3623:16;3601:52;:::i;:::-;3678:29;3700:6;3678:29;:::i;:::-;3673:3;3669:39;3662:46;;3442:272;3350:364;;;;:::o;3720:313::-;3833:4;3871:2;3860:9;3856:18;3848:26;;3920:9;3914:4;3910:20;3906:1;3895:9;3891:17;3884:47;3948:78;4021:4;4012:6;3948:78;:::i;:::-;3940:86;;3720:313;;;;:::o;4039:122::-;4112:24;4130:5;4112:24;:::i;:::-;4105:5;4102:35;4092:63;;4151:1;4148;4141:12;4092:63;4039:122;:::o;4167:139::-;4213:5;4251:6;4238:20;4229:29;;4267:33;4294:5;4267:33;:::i;:::-;4167:139;;;;:::o;4312:329::-;4371:6;4420:2;4408:9;4399:7;4395:23;4391:32;4388:119;;;4426:79;;:::i;:::-;4388:119;4546:1;4571:53;4616:7;4607:6;4596:9;4592:22;4571:53;:::i;:::-;4561:63;;4517:117;4312:329;;;;:::o;4647:222::-;4740:4;4778:2;4767:9;4763:18;4755:26;;4791:71;4859:1;4848:9;4844:17;4835:6;4791:71;:::i;:::-;4647:222;;;;:::o;4875:122::-;4948:24;4966:5;4948:24;:::i;:::-;4941:5;4938:35;4928:63;;4987:1;4984;4977:12;4928:63;4875:122;:::o;5003:139::-;5049:5;5087:6;5074:20;5065:29;;5103:33;5130:5;5103:33;:::i;:::-;5003:139;;;;:::o;5148:474::-;5216:6;5224;5273:2;5261:9;5252:7;5248:23;5244:32;5241:119;;;5279:79;;:::i;:::-;5241:119;5399:1;5424:53;5469:7;5460:6;5449:9;5445:22;5424:53;:::i;:::-;5414:63;;5370:117;5526:2;5552:53;5597:7;5588:6;5577:9;5573:22;5552:53;:::i;:::-;5542:63;;5497:118;5148:474;;;;;:::o;5628:104::-;5673:7;5702:24;5720:5;5702:24;:::i;:::-;5691:35;;5628:104;;;:::o;5738:138::-;5819:32;5845:5;5819:32;:::i;:::-;5812:5;5809:43;5799:71;;5866:1;5863;5856:12;5799:71;5738:138;:::o;5882:155::-;5936:5;5974:6;5961:20;5952:29;;5990:41;6025:5;5990:41;:::i;:::-;5882:155;;;;:::o;6043:345::-;6110:6;6159:2;6147:9;6138:7;6134:23;6130:32;6127:119;;;6165:79;;:::i;:::-;6127:119;6285:1;6310:61;6363:7;6354:6;6343:9;6339:22;6310:61;:::i;:::-;6300:71;;6256:125;6043:345;;;;:::o;6394:474::-;6462:6;6470;6519:2;6507:9;6498:7;6494:23;6490:32;6487:119;;;6525:79;;:::i;:::-;6487:119;6645:1;6670:53;6715:7;6706:6;6695:9;6691:22;6670:53;:::i;:::-;6660:63;;6616:117;6772:2;6798:53;6843:7;6834:6;6823:9;6819:22;6798:53;:::i;:::-;6788:63;;6743:118;6394:474;;;;;:::o;6874:619::-;6951:6;6959;6967;7016:2;7004:9;6995:7;6991:23;6987:32;6984:119;;;7022:79;;:::i;:::-;6984:119;7142:1;7167:53;7212:7;7203:6;7192:9;7188:22;7167:53;:::i;:::-;7157:63;;7113:117;7269:2;7295:53;7340:7;7331:6;7320:9;7316:22;7295:53;:::i;:::-;7285:63;;7240:118;7397:2;7423:53;7468:7;7459:6;7448:9;7444:22;7423:53;:::i;:::-;7413:63;;7368:118;6874:619;;;;;:::o;7499:110::-;7550:7;7579:24;7597:5;7579:24;:::i;:::-;7568:35;;7499:110;;;:::o;7615:150::-;7702:38;7734:5;7702:38;:::i;:::-;7695:5;7692:49;7682:77;;7755:1;7752;7745:12;7682:77;7615:150;:::o;7771:167::-;7831:5;7869:6;7856:20;7847:29;;7885:47;7926:5;7885:47;:::i;:::-;7771:167;;;;:::o;7944:502::-;8026:6;8034;8083:2;8071:9;8062:7;8058:23;8054:32;8051:119;;;8089:79;;:::i;:::-;8051:119;8209:1;8234:67;8293:7;8284:6;8273:9;8269:22;8234:67;:::i;:::-;8224:77;;8180:131;8350:2;8376:53;8421:7;8412:6;8401:9;8397:22;8376:53;:::i;:::-;8366:63;;8321:118;7944:502;;;;;:::o;8452:329::-;8511:6;8560:2;8548:9;8539:7;8535:23;8531:32;8528:119;;;8566:79;;:::i;:::-;8528:119;8686:1;8711:53;8756:7;8747:6;8736:9;8732:22;8711:53;:::i;:::-;8701:63;;8657:117;8452:329;;;;:::o;8787:116::-;8857:21;8872:5;8857:21;:::i;:::-;8850:5;8847:32;8837:60;;8893:1;8890;8883:12;8837:60;8787:116;:::o;8909:133::-;8952:5;8990:6;8977:20;8968:29;;9006:30;9030:5;9006:30;:::i;:::-;8909:133;;;;:::o;9048:468::-;9113:6;9121;9170:2;9158:9;9149:7;9145:23;9141:32;9138:119;;;9176:79;;:::i;:::-;9138:119;9296:1;9321:53;9366:7;9357:6;9346:9;9342:22;9321:53;:::i;:::-;9311:63;;9267:117;9423:2;9449:50;9491:7;9482:6;9471:9;9467:22;9449:50;:::i;:::-;9439:60;;9394:115;9048:468;;;;;:::o;9522:117::-;9631:1;9628;9621:12;9645:117;9754:1;9751;9744:12;9768:180;9816:77;9813:1;9806:88;9913:4;9910:1;9903:15;9937:4;9934:1;9927:15;9954:281;10037:27;10059:4;10037:27;:::i;:::-;10029:6;10025:40;10167:6;10155:10;10152:22;10131:18;10119:10;10116:34;10113:62;10110:88;;;10178:18;;:::i;:::-;10110:88;10218:10;10214:2;10207:22;9997:238;9954:281;;:::o;10241:129::-;10275:6;10302:20;;:::i;:::-;10292:30;;10331:33;10359:4;10351:6;10331:33;:::i;:::-;10241:129;;;:::o;10376:307::-;10437:4;10527:18;10519:6;10516:30;10513:56;;;10549:18;;:::i;:::-;10513:56;10587:29;10609:6;10587:29;:::i;:::-;10579:37;;10671:4;10665;10661:15;10653:23;;10376:307;;;:::o;10689:154::-;10773:6;10768:3;10763;10750:30;10835:1;10826:6;10821:3;10817:16;10810:27;10689:154;;;:::o;10849:410::-;10926:5;10951:65;10967:48;11008:6;10967:48;:::i;:::-;10951:65;:::i;:::-;10942:74;;11039:6;11032:5;11025:21;11077:4;11070:5;11066:16;11115:3;11106:6;11101:3;11097:16;11094:25;11091:112;;;11122:79;;:::i;:::-;11091:112;11212:41;11246:6;11241:3;11236;11212:41;:::i;:::-;10932:327;10849:410;;;;;:::o;11278:338::-;11333:5;11382:3;11375:4;11367:6;11363:17;11359:27;11349:122;;11390:79;;:::i;:::-;11349:122;11507:6;11494:20;11532:78;11606:3;11598:6;11591:4;11583:6;11579:17;11532:78;:::i;:::-;11523:87;;11339:277;11278:338;;;;:::o;11622:943::-;11717:6;11725;11733;11741;11790:3;11778:9;11769:7;11765:23;11761:33;11758:120;;;11797:79;;:::i;:::-;11758:120;11917:1;11942:53;11987:7;11978:6;11967:9;11963:22;11942:53;:::i;:::-;11932:63;;11888:117;12044:2;12070:53;12115:7;12106:6;12095:9;12091:22;12070:53;:::i;:::-;12060:63;;12015:118;12172:2;12198:53;12243:7;12234:6;12223:9;12219:22;12198:53;:::i;:::-;12188:63;;12143:118;12328:2;12317:9;12313:18;12300:32;12359:18;12351:6;12348:30;12345:117;;;12381:79;;:::i;:::-;12345:117;12486:62;12540:7;12531:6;12520:9;12516:22;12486:62;:::i;:::-;12476:72;;12271:287;11622:943;;;;;;;:::o;12571:357::-;12644:6;12693:2;12681:9;12672:7;12668:23;12664:32;12661:119;;;12699:79;;:::i;:::-;12661:119;12819:1;12844:67;12903:7;12894:6;12883:9;12879:22;12844:67;:::i;:::-;12834:77;;12790:131;12571:357;;;;:::o;12934:474::-;13002:6;13010;13059:2;13047:9;13038:7;13034:23;13030:32;13027:119;;;13065:79;;:::i;:::-;13027:119;13185:1;13210:53;13255:7;13246:6;13235:9;13231:22;13210:53;:::i;:::-;13200:63;;13156:117;13312:2;13338:53;13383:7;13374:6;13363:9;13359:22;13338:53;:::i;:::-;13328:63;;13283:118;12934:474;;;;;:::o;13414:180::-;13462:77;13459:1;13452:88;13559:4;13556:1;13549:15;13583:4;13580:1;13573:15;13600:320;13644:6;13681:1;13675:4;13671:12;13661:22;;13728:1;13722:4;13718:12;13749:18;13739:81;;13805:4;13797:6;13793:17;13783:27;;13739:81;13867:2;13859:6;13856:14;13836:18;13833:38;13830:84;;;13886:18;;:::i;:::-;13830:84;13651:269;13600:320;;;:::o;13926:231::-;14066:34;14062:1;14054:6;14050:14;14043:58;14135:14;14130:2;14122:6;14118:15;14111:39;13926:231;:::o;14163:366::-;14305:3;14326:67;14390:2;14385:3;14326:67;:::i;:::-;14319:74;;14402:93;14491:3;14402:93;:::i;:::-;14520:2;14515:3;14511:12;14504:19;;14163:366;;;:::o;14535:419::-;14701:4;14739:2;14728:9;14724:18;14716:26;;14788:9;14782:4;14778:20;14774:1;14763:9;14759:17;14752:47;14816:131;14942:4;14816:131;:::i;:::-;14808:139;;14535:419;;;:::o;14960:220::-;15100:34;15096:1;15088:6;15084:14;15077:58;15169:3;15164:2;15156:6;15152:15;15145:28;14960:220;:::o;15186:366::-;15328:3;15349:67;15413:2;15408:3;15349:67;:::i;:::-;15342:74;;15425:93;15514:3;15425:93;:::i;:::-;15543:2;15538:3;15534:12;15527:19;;15186:366;;;:::o;15558:419::-;15724:4;15762:2;15751:9;15747:18;15739:26;;15811:9;15805:4;15801:20;15797:1;15786:9;15782:17;15775:47;15839:131;15965:4;15839:131;:::i;:::-;15831:139;;15558:419;;;:::o;15983:243::-;16123:34;16119:1;16111:6;16107:14;16100:58;16192:26;16187:2;16179:6;16175:15;16168:51;15983:243;:::o;16232:366::-;16374:3;16395:67;16459:2;16454:3;16395:67;:::i;:::-;16388:74;;16471:93;16560:3;16471:93;:::i;:::-;16589:2;16584:3;16580:12;16573:19;;16232:366;;;:::o;16604:419::-;16770:4;16808:2;16797:9;16793:18;16785:26;;16857:9;16851:4;16847:20;16843:1;16832:9;16828:17;16821:47;16885:131;17011:4;16885:131;:::i;:::-;16877:139;;16604:419;;;:::o;17029:225::-;17169:34;17165:1;17157:6;17153:14;17146:58;17238:8;17233:2;17225:6;17221:15;17214:33;17029:225;:::o;17260:366::-;17402:3;17423:67;17487:2;17482:3;17423:67;:::i;:::-;17416:74;;17499:93;17588:3;17499:93;:::i;:::-;17617:2;17612:3;17608:12;17601:19;;17260:366;;;:::o;17632:419::-;17798:4;17836:2;17825:9;17821:18;17813:26;;17885:9;17879:4;17875:20;17871:1;17860:9;17856:17;17849:47;17913:131;18039:4;17913:131;:::i;:::-;17905:139;;17632:419;;;:::o;18057:180::-;18105:77;18102:1;18095:88;18202:4;18199:1;18192:15;18226:4;18223:1;18216:15;18243:305;18283:3;18302:20;18320:1;18302:20;:::i;:::-;18297:25;;18336:20;18354:1;18336:20;:::i;:::-;18331:25;;18490:1;18422:66;18418:74;18415:1;18412:81;18409:107;;;18496:18;;:::i;:::-;18409:107;18540:1;18537;18533:9;18526:16;;18243:305;;;;:::o;18554:230::-;18694:34;18690:1;18682:6;18678:14;18671:58;18763:13;18758:2;18750:6;18746:15;18739:38;18554:230;:::o;18790:366::-;18932:3;18953:67;19017:2;19012:3;18953:67;:::i;:::-;18946:74;;19029:93;19118:3;19029:93;:::i;:::-;19147:2;19142:3;19138:12;19131:19;;18790:366;;;:::o;19162:419::-;19328:4;19366:2;19355:9;19351:18;19343:26;;19415:9;19409:4;19405:20;19401:1;19390:9;19386:17;19379:47;19443:131;19569:4;19443:131;:::i;:::-;19435:139;;19162:419;;;:::o;19587:60::-;19615:3;19636:5;19629:12;;19587:60;;;:::o;19653:142::-;19703:9;19736:53;19754:34;19763:24;19781:5;19763:24;:::i;:::-;19754:34;:::i;:::-;19736:53;:::i;:::-;19723:66;;19653:142;;;:::o;19801:126::-;19851:9;19884:37;19915:5;19884:37;:::i;:::-;19871:50;;19801:126;;;:::o;19933:134::-;19991:9;20024:37;20055:5;20024:37;:::i;:::-;20011:50;;19933:134;;;:::o;20073:147::-;20168:45;20207:5;20168:45;:::i;:::-;20163:3;20156:58;20073:147;;:::o;20226:348::-;20355:4;20393:2;20382:9;20378:18;20370:26;;20406:79;20482:1;20471:9;20467:17;20458:6;20406:79;:::i;:::-;20495:72;20563:2;20552:9;20548:18;20539:6;20495:72;:::i;:::-;20226:348;;;;;:::o;20580:181::-;20720:33;20716:1;20708:6;20704:14;20697:57;20580:181;:::o;20767:366::-;20909:3;20930:67;20994:2;20989:3;20930:67;:::i;:::-;20923:74;;21006:93;21095:3;21006:93;:::i;:::-;21124:2;21119:3;21115:12;21108:19;;20767:366;;;:::o;21139:419::-;21305:4;21343:2;21332:9;21328:18;21320:26;;21392:9;21386:4;21382:20;21378:1;21367:9;21363:17;21356:47;21420:131;21546:4;21420:131;:::i;:::-;21412:139;;21139:419;;;:::o;21564:348::-;21604:7;21627:20;21645:1;21627:20;:::i;:::-;21622:25;;21661:20;21679:1;21661:20;:::i;:::-;21656:25;;21849:1;21781:66;21777:74;21774:1;21771:81;21766:1;21759:9;21752:17;21748:105;21745:131;;;21856:18;;:::i;:::-;21745:131;21904:1;21901;21897:9;21886:20;;21564:348;;;;:::o;21918:180::-;22058:32;22054:1;22046:6;22042:14;22035:56;21918:180;:::o;22104:366::-;22246:3;22267:67;22331:2;22326:3;22267:67;:::i;:::-;22260:74;;22343:93;22432:3;22343:93;:::i;:::-;22461:2;22456:3;22452:12;22445:19;;22104:366;;;:::o;22476:419::-;22642:4;22680:2;22669:9;22665:18;22657:26;;22729:9;22723:4;22719:20;22715:1;22704:9;22700:17;22693:47;22757:131;22883:4;22757:131;:::i;:::-;22749:139;;22476:419;;;:::o;22901:237::-;23041:34;23037:1;23029:6;23025:14;23018:58;23110:20;23105:2;23097:6;23093:15;23086:45;22901:237;:::o;23144:366::-;23286:3;23307:67;23371:2;23366:3;23307:67;:::i;:::-;23300:74;;23383:93;23472:3;23383:93;:::i;:::-;23501:2;23496:3;23492:12;23485:19;;23144:366;;;:::o;23516:419::-;23682:4;23720:2;23709:9;23705:18;23697:26;;23769:9;23763:4;23759:20;23755:1;23744:9;23740:17;23733:47;23797:131;23923:4;23797:131;:::i;:::-;23789:139;;23516:419;;;:::o;23941:177::-;24081:29;24077:1;24069:6;24065:14;24058:53;23941:177;:::o;24124:366::-;24266:3;24287:67;24351:2;24346:3;24287:67;:::i;:::-;24280:74;;24363:93;24452:3;24363:93;:::i;:::-;24481:2;24476:3;24472:12;24465:19;;24124:366;;;:::o;24496:419::-;24662:4;24700:2;24689:9;24685:18;24677:26;;24749:9;24743:4;24739:20;24735:1;24724:9;24720:17;24713:47;24777:131;24903:4;24777:131;:::i;:::-;24769:139;;24496:419;;;:::o;24921:220::-;25061:34;25057:1;25049:6;25045:14;25038:58;25130:3;25125:2;25117:6;25113:15;25106:28;24921:220;:::o;25147:366::-;25289:3;25310:67;25374:2;25369:3;25310:67;:::i;:::-;25303:74;;25386:93;25475:3;25386:93;:::i;:::-;25504:2;25499:3;25495:12;25488:19;;25147:366;;;:::o;25519:419::-;25685:4;25723:2;25712:9;25708:18;25700:26;;25772:9;25766:4;25762:20;25758:1;25747:9;25743:17;25736:47;25800:131;25926:4;25800:131;:::i;:::-;25792:139;;25519:419;;;:::o;25944:179::-;26084:31;26080:1;26072:6;26068:14;26061:55;25944:179;:::o;26129:366::-;26271:3;26292:67;26356:2;26351:3;26292:67;:::i;:::-;26285:74;;26368:93;26457:3;26368:93;:::i;:::-;26486:2;26481:3;26477:12;26470:19;;26129:366;;;:::o;26501:419::-;26667:4;26705:2;26694:9;26690:18;26682:26;;26754:9;26748:4;26744:20;26740:1;26729:9;26725:17;26718:47;26782:131;26908:4;26782:131;:::i;:::-;26774:139;;26501:419;;;:::o;26926:177::-;27066:29;27062:1;27054:6;27050:14;27043:53;26926:177;:::o;27109:366::-;27251:3;27272:67;27336:2;27331:3;27272:67;:::i;:::-;27265:74;;27348:93;27437:3;27348:93;:::i;:::-;27466:2;27461:3;27457:12;27450:19;;27109:366;;;:::o;27481:419::-;27647:4;27685:2;27674:9;27670:18;27662:26;;27734:9;27728:4;27724:20;27720:1;27709:9;27705:17;27698:47;27762:131;27888:4;27762:131;:::i;:::-;27754:139;;27481:419;;;:::o;27906:229::-;28046:34;28042:1;28034:6;28030:14;28023:58;28115:12;28110:2;28102:6;28098:15;28091:37;27906:229;:::o;28141:366::-;28283:3;28304:67;28368:2;28363:3;28304:67;:::i;:::-;28297:74;;28380:93;28469:3;28380:93;:::i;:::-;28498:2;28493:3;28489:12;28482:19;;28141:366;;;:::o;28513:419::-;28679:4;28717:2;28706:9;28702:18;28694:26;;28766:9;28760:4;28756:20;28752:1;28741:9;28737:17;28730:47;28794:131;28920:4;28794:131;:::i;:::-;28786:139;;28513:419;;;:::o;28938:191::-;28978:4;28998:20;29016:1;28998:20;:::i;:::-;28993:25;;29032:20;29050:1;29032:20;:::i;:::-;29027:25;;29071:1;29068;29065:8;29062:34;;;29076:18;;:::i;:::-;29062:34;29121:1;29118;29114:9;29106:17;;28938:191;;;;:::o;29135:244::-;29275:34;29271:1;29263:6;29259:14;29252:58;29344:27;29339:2;29331:6;29327:15;29320:52;29135:244;:::o;29385:366::-;29527:3;29548:67;29612:2;29607:3;29548:67;:::i;:::-;29541:74;;29624:93;29713:3;29624:93;:::i;:::-;29742:2;29737:3;29733:12;29726:19;;29385:366;;;:::o;29757:419::-;29923:4;29961:2;29950:9;29946:18;29938:26;;30010:9;30004:4;30000:20;29996:1;29985:9;29981:17;29974:47;30038:131;30164:4;30038:131;:::i;:::-;30030:139;;29757:419;;;:::o;30182:225::-;30322:34;30318:1;30310:6;30306:14;30299:58;30391:8;30386:2;30378:6;30374:15;30367:33;30182:225;:::o;30413:366::-;30555:3;30576:67;30640:2;30635:3;30576:67;:::i;:::-;30569:74;;30652:93;30741:3;30652:93;:::i;:::-;30770:2;30765:3;30761:12;30754:19;;30413:366;;;:::o;30785:419::-;30951:4;30989:2;30978:9;30974:18;30966:26;;31038:9;31032:4;31028:20;31024:1;31013:9;31009:17;31002:47;31066:131;31192:4;31066:131;:::i;:::-;31058:139;;30785:419;;;:::o;31210:182::-;31350:34;31346:1;31338:6;31334:14;31327:58;31210:182;:::o;31398:366::-;31540:3;31561:67;31625:2;31620:3;31561:67;:::i;:::-;31554:74;;31637:93;31726:3;31637:93;:::i;:::-;31755:2;31750:3;31746:12;31739:19;;31398:366;;;:::o;31770:419::-;31936:4;31974:2;31963:9;31959:18;31951:26;;32023:9;32017:4;32013:20;32009:1;31998:9;31994:17;31987:47;32051:131;32177:4;32051:131;:::i;:::-;32043:139;;31770:419;;;:::o;32195:233::-;32234:3;32257:24;32275:5;32257:24;:::i;:::-;32248:33;;32303:66;32296:5;32293:77;32290:103;;;32373:18;;:::i;:::-;32290:103;32420:1;32413:5;32409:13;32402:20;;32195:233;;;:::o;32434:236::-;32574:34;32570:1;32562:6;32558:14;32551:58;32643:19;32638:2;32630:6;32626:15;32619:44;32434:236;:::o;32676:366::-;32818:3;32839:67;32903:2;32898:3;32839:67;:::i;:::-;32832:74;;32915:93;33004:3;32915:93;:::i;:::-;33033:2;33028:3;33024:12;33017:19;;32676:366;;;:::o;33048:419::-;33214:4;33252:2;33241:9;33237:18;33229:26;;33301:9;33295:4;33291:20;33287:1;33276:9;33272:17;33265:47;33329:131;33455:4;33329:131;:::i;:::-;33321:139;;33048:419;;;:::o;33473:230::-;33613:34;33609:1;33601:6;33597:14;33590:58;33682:13;33677:2;33669:6;33665:15;33658:38;33473:230;:::o;33709:366::-;33851:3;33872:67;33936:2;33931:3;33872:67;:::i;:::-;33865:74;;33948:93;34037:3;33948:93;:::i;:::-;34066:2;34061:3;34057:12;34050:19;;33709:366;;;:::o;34081:419::-;34247:4;34285:2;34274:9;34270:18;34262:26;;34334:9;34328:4;34324:20;34320:1;34309:9;34305:17;34298:47;34362:131;34488:4;34362:131;:::i;:::-;34354:139;;34081:419;;;:::o;34506:182::-;34646:34;34642:1;34634:6;34630:14;34623:58;34506:182;:::o;34694:366::-;34836:3;34857:67;34921:2;34916:3;34857:67;:::i;:::-;34850:74;;34933:93;35022:3;34933:93;:::i;:::-;35051:2;35046:3;35042:12;35035:19;;34694:366;;;:::o;35066:419::-;35232:4;35270:2;35259:9;35255:18;35247:26;;35319:9;35313:4;35309:20;35305:1;35294:9;35290:17;35283:47;35347:131;35473:4;35347:131;:::i;:::-;35339:139;;35066:419;;;:::o;35491:235::-;35631:34;35627:1;35619:6;35615:14;35608:58;35700:18;35695:2;35687:6;35683:15;35676:43;35491:235;:::o;35732:366::-;35874:3;35895:67;35959:2;35954:3;35895:67;:::i;:::-;35888:74;;35971:93;36060:3;35971:93;:::i;:::-;36089:2;36084:3;36080:12;36073:19;;35732:366;;;:::o;36104:419::-;36270:4;36308:2;36297:9;36293:18;36285:26;;36357:9;36351:4;36347:20;36343:1;36332:9;36328:17;36321:47;36385:131;36511:4;36385:131;:::i;:::-;36377:139;;36104:419;;;:::o;36529:143::-;36586:5;36617:6;36611:13;36602:22;;36633:33;36660:5;36633:33;:::i;:::-;36529:143;;;;:::o;36678:351::-;36748:6;36797:2;36785:9;36776:7;36772:23;36768:32;36765:119;;;36803:79;;:::i;:::-;36765:119;36923:1;36948:64;37004:7;36995:6;36984:9;36980:22;36948:64;:::i;:::-;36938:74;;36894:128;36678:351;;;;:::o;37035:231::-;37175:34;37171:1;37163:6;37159:14;37152:58;37244:14;37239:2;37231:6;37227:15;37220:39;37035:231;:::o;37272:366::-;37414:3;37435:67;37499:2;37494:3;37435:67;:::i;:::-;37428:74;;37511:93;37600:3;37511:93;:::i;:::-;37629:2;37624:3;37620:12;37613:19;;37272:366;;;:::o;37644:419::-;37810:4;37848:2;37837:9;37833:18;37825:26;;37897:9;37891:4;37887:20;37883:1;37872:9;37868:17;37861:47;37925:131;38051:4;37925:131;:::i;:::-;37917:139;;37644:419;;;:::o;38069:180::-;38117:77;38114:1;38107:88;38214:4;38211:1;38204:15;38238:4;38235:1;38228:15;38255:228;38395:34;38391:1;38383:6;38379:14;38372:58;38464:11;38459:2;38451:6;38447:15;38440:36;38255:228;:::o;38489:366::-;38631:3;38652:67;38716:2;38711:3;38652:67;:::i;:::-;38645:74;;38728:93;38817:3;38728:93;:::i;:::-;38846:2;38841:3;38837:12;38830:19;;38489:366;;;:::o;38861:419::-;39027:4;39065:2;39054:9;39050:18;39042:26;;39114:9;39108:4;39104:20;39100:1;39089:9;39085:17;39078:47;39142:131;39268:4;39142:131;:::i;:::-;39134:139;;38861:419;;;:::o;39286:229::-;39426:34;39422:1;39414:6;39410:14;39403:58;39495:12;39490:2;39482:6;39478:15;39471:37;39286:229;:::o;39521:366::-;39663:3;39684:67;39748:2;39743:3;39684:67;:::i;:::-;39677:74;;39760:93;39849:3;39760:93;:::i;:::-;39878:2;39873:3;39869:12;39862:19;;39521:366;;;:::o;39893:419::-;40059:4;40097:2;40086:9;40082:18;40074:26;;40146:9;40140:4;40136:20;40132:1;40121:9;40117:17;40110:47;40174:131;40300:4;40174:131;:::i;:::-;40166:139;;39893:419;;;:::o;40318:148::-;40420:11;40457:3;40442:18;;40318:148;;;;:::o;40472:377::-;40578:3;40606:39;40639:5;40606:39;:::i;:::-;40661:89;40743:6;40738:3;40661:89;:::i;:::-;40654:96;;40759:52;40804:6;40799:3;40792:4;40785:5;40781:16;40759:52;:::i;:::-;40836:6;40831:3;40827:16;40820:23;;40582:267;40472:377;;;;:::o;40855:155::-;40995:7;40991:1;40983:6;40979:14;40972:31;40855:155;:::o;41016:400::-;41176:3;41197:84;41279:1;41274:3;41197:84;:::i;:::-;41190:91;;41290:93;41379:3;41290:93;:::i;:::-;41408:1;41403:3;41399:11;41392:18;;41016:400;;;:::o;41422:541::-;41655:3;41677:95;41768:3;41759:6;41677:95;:::i;:::-;41670:102;;41789:148;41933:3;41789:148;:::i;:::-;41782:155;;41954:3;41947:10;;41422:541;;;;:::o;41969:225::-;42109:34;42105:1;42097:6;42093:14;42086:58;42178:8;42173:2;42165:6;42161:15;42154:33;41969:225;:::o;42200:366::-;42342:3;42363:67;42427:2;42422:3;42363:67;:::i;:::-;42356:74;;42439:93;42528:3;42439:93;:::i;:::-;42557:2;42552:3;42548:12;42541:19;;42200:366;;;:::o;42572:419::-;42738:4;42776:2;42765:9;42761:18;42753:26;;42825:9;42819:4;42815:20;42811:1;42800:9;42796:17;42789:47;42853:131;42979:4;42853:131;:::i;:::-;42845:139;;42572:419;;;:::o;42997:180::-;43045:77;43042:1;43035:88;43142:4;43139:1;43132:15;43166:4;43163:1;43156:15;43183:185;43223:1;43240:20;43258:1;43240:20;:::i;:::-;43235:25;;43274:20;43292:1;43274:20;:::i;:::-;43269:25;;43313:1;43303:35;;43318:18;;:::i;:::-;43303:35;43360:1;43357;43353:9;43348:14;;43183:185;;;;:::o;43374:179::-;43514:31;43510:1;43502:6;43498:14;43491:55;43374:179;:::o;43559:366::-;43701:3;43722:67;43786:2;43781:3;43722:67;:::i;:::-;43715:74;;43798:93;43887:3;43798:93;:::i;:::-;43916:2;43911:3;43907:12;43900:19;;43559:366;;;:::o;43931:419::-;44097:4;44135:2;44124:9;44120:18;44112:26;;44184:9;44178:4;44174:20;44170:1;44159:9;44155:17;44148:47;44212:131;44338:4;44212:131;:::i;:::-;44204:139;;43931:419;;;:::o;44356:147::-;44457:11;44494:3;44479:18;;44356:147;;;;:::o;44509:114::-;;:::o;44629:398::-;44788:3;44809:83;44890:1;44885:3;44809:83;:::i;:::-;44802:90;;44901:93;44990:3;44901:93;:::i;:::-;45019:1;45014:3;45010:11;45003:18;;44629:398;;;:::o;45033:379::-;45217:3;45239:147;45382:3;45239:147;:::i;:::-;45232:154;;45403:3;45396:10;;45033:379;;;:::o;45418:245::-;45558:34;45554:1;45546:6;45542:14;45535:58;45627:28;45622:2;45614:6;45610:15;45603:53;45418:245;:::o;45669:366::-;45811:3;45832:67;45896:2;45891:3;45832:67;:::i;:::-;45825:74;;45908:93;45997:3;45908:93;:::i;:::-;46026:2;46021:3;46017:12;46010:19;;45669:366;;;:::o;46041:419::-;46207:4;46245:2;46234:9;46230:18;46222:26;;46294:9;46288:4;46284:20;46280:1;46269:9;46265:17;46258:47;46322:131;46448:4;46322:131;:::i;:::-;46314:139;;46041:419;;;:::o;46466:231::-;46606:34;46602:1;46594:6;46590:14;46583:58;46675:14;46670:2;46662:6;46658:15;46651:39;46466:231;:::o;46703:366::-;46845:3;46866:67;46930:2;46925:3;46866:67;:::i;:::-;46859:74;;46942:93;47031:3;46942:93;:::i;:::-;47060:2;47055:3;47051:12;47044:19;;46703:366;;;:::o;47075:419::-;47241:4;47279:2;47268:9;47264:18;47256:26;;47328:9;47322:4;47318:20;47314:1;47303:9;47299:17;47292:47;47356:131;47482:4;47356:131;:::i;:::-;47348:139;;47075:419;;;:::o;47500:228::-;47640:34;47636:1;47628:6;47624:14;47617:58;47709:11;47704:2;47696:6;47692:15;47685:36;47500:228;:::o;47734:366::-;47876:3;47897:67;47961:2;47956:3;47897:67;:::i;:::-;47890:74;;47973:93;48062:3;47973:93;:::i;:::-;48091:2;48086:3;48082:12;48075:19;;47734:366;;;:::o;48106:419::-;48272:4;48310:2;48299:9;48295:18;48287:26;;48359:9;48353:4;48349:20;48345:1;48334:9;48330:17;48323:47;48387:131;48513:4;48387:131;:::i;:::-;48379:139;;48106:419;;;:::o;48531:223::-;48671:34;48667:1;48659:6;48655:14;48648:58;48740:6;48735:2;48727:6;48723:15;48716:31;48531:223;:::o;48760:366::-;48902:3;48923:67;48987:2;48982:3;48923:67;:::i;:::-;48916:74;;48999:93;49088:3;48999:93;:::i;:::-;49117:2;49112:3;49108:12;49101:19;;48760:366;;;:::o;49132:419::-;49298:4;49336:2;49325:9;49321:18;49313:26;;49385:9;49379:4;49375:20;49371:1;49360:9;49356:17;49349:47;49413:131;49539:4;49413:131;:::i;:::-;49405:139;;49132:419;;;:::o;49557:170::-;49697:22;49693:1;49685:6;49681:14;49674:46;49557:170;:::o;49733:366::-;49875:3;49896:67;49960:2;49955:3;49896:67;:::i;:::-;49889:74;;49972:93;50061:3;49972:93;:::i;:::-;50090:2;50085:3;50081:12;50074:19;;49733:366;;;:::o;50105:419::-;50271:4;50309:2;50298:9;50294:18;50286:26;;50358:9;50352:4;50348:20;50344:1;50333:9;50329:17;50322:47;50386:131;50512:4;50386:131;:::i;:::-;50378:139;;50105:419;;;:::o;50530:166::-;50670:18;50666:1;50658:6;50654:14;50647:42;50530:166;:::o;50702:366::-;50844:3;50865:67;50929:2;50924:3;50865:67;:::i;:::-;50858:74;;50941:93;51030:3;50941:93;:::i;:::-;51059:2;51054:3;51050:12;51043:19;;50702:366;;;:::o;51074:419::-;51240:4;51278:2;51267:9;51263:18;51255:26;;51327:9;51321:4;51317:20;51313:1;51302:9;51298:17;51291:47;51355:131;51481:4;51355:131;:::i;:::-;51347:139;;51074:419;;;:::o;51499:175::-;51639:27;51635:1;51627:6;51623:14;51616:51;51499:175;:::o;51680:366::-;51822:3;51843:67;51907:2;51902:3;51843:67;:::i;:::-;51836:74;;51919:93;52008:3;51919:93;:::i;:::-;52037:2;52032:3;52028:12;52021:19;;51680:366;;;:::o;52052:419::-;52218:4;52256:2;52245:9;52241:18;52233:26;;52305:9;52299:4;52295:20;52291:1;52280:9;52276:17;52269:47;52333:131;52459:4;52333:131;:::i;:::-;52325:139;;52052:419;;;:::o;52477:237::-;52617:34;52613:1;52605:6;52601:14;52594:58;52686:20;52681:2;52673:6;52669:15;52662:45;52477:237;:::o;52720:366::-;52862:3;52883:67;52947:2;52942:3;52883:67;:::i;:::-;52876:74;;52959:93;53048:3;52959:93;:::i;:::-;53077:2;53072:3;53068:12;53061:19;;52720:366;;;:::o;53092:419::-;53258:4;53296:2;53285:9;53281:18;53273:26;;53345:9;53339:4;53335:20;53331:1;53320:9;53316:17;53309:47;53373:131;53499:4;53373:131;:::i;:::-;53365:139;;53092:419;;;:::o;53517:234::-;53657:34;53653:1;53645:6;53641:14;53634:58;53726:17;53721:2;53713:6;53709:15;53702:42;53517:234;:::o;53757:366::-;53899:3;53920:67;53984:2;53979:3;53920:67;:::i;:::-;53913:74;;53996:93;54085:3;53996:93;:::i;:::-;54114:2;54109:3;54105:12;54098:19;;53757:366;;;:::o;54129:419::-;54295:4;54333:2;54322:9;54318:18;54310:26;;54382:9;54376:4;54372:20;54368:1;54357:9;54353:17;54346:47;54410:131;54536:4;54410:131;:::i;:::-;54402:139;;54129:419;;;:::o;54554:435::-;54734:3;54756:95;54847:3;54838:6;54756:95;:::i;:::-;54749:102;;54868:95;54959:3;54950:6;54868:95;:::i;:::-;54861:102;;54980:3;54973:10;;54554:435;;;;;:::o;54995:180::-;55043:77;55040:1;55033:88;55140:4;55137:1;55130:15;55164:4;55161:1;55154:15;55181:137;55235:5;55266:6;55260:13;55251:22;;55282:30;55306:5;55282:30;:::i;:::-;55181:137;;;;:::o;55324:345::-;55391:6;55440:2;55428:9;55419:7;55415:23;55411:32;55408:119;;;55446:79;;:::i;:::-;55408:119;55566:1;55591:61;55644:7;55635:6;55624:9;55620:22;55591:61;:::i;:::-;55581:71;;55537:125;55324:345;;;;:::o;55675:229::-;55815:34;55811:1;55803:6;55799:14;55792:58;55884:12;55879:2;55871:6;55867:15;55860:37;55675:229;:::o;55910:366::-;56052:3;56073:67;56137:2;56132:3;56073:67;:::i;:::-;56066:74;;56149:93;56238:3;56149:93;:::i;:::-;56267:2;56262:3;56258:12;56251:19;;55910:366;;;:::o;56282:419::-;56448:4;56486:2;56475:9;56471:18;56463:26;;56535:9;56529:4;56525:20;56521:1;56510:9;56506:17;56499:47;56563:131;56689:4;56563:131;:::i;:::-;56555:139;;56282:419;;;:::o;56707:98::-;56758:6;56792:5;56786:12;56776:22;;56707:98;;;:::o;56811:168::-;56894:11;56928:6;56923:3;56916:19;56968:4;56963:3;56959:14;56944:29;;56811:168;;;;:::o;56985:360::-;57071:3;57099:38;57131:5;57099:38;:::i;:::-;57153:70;57216:6;57211:3;57153:70;:::i;:::-;57146:77;;57232:52;57277:6;57272:3;57265:4;57258:5;57254:16;57232:52;:::i;:::-;57309:29;57331:6;57309:29;:::i;:::-;57304:3;57300:39;57293:46;;57075:270;56985:360;;;;:::o;57351:640::-;57546:4;57584:3;57573:9;57569:19;57561:27;;57598:71;57666:1;57655:9;57651:17;57642:6;57598:71;:::i;:::-;57679:72;57747:2;57736:9;57732:18;57723:6;57679:72;:::i;:::-;57761;57829:2;57818:9;57814:18;57805:6;57761:72;:::i;:::-;57880:9;57874:4;57870:20;57865:2;57854:9;57850:18;57843:48;57908:76;57979:4;57970:6;57908:76;:::i;:::-;57900:84;;57351:640;;;;;;;:::o;57997:141::-;58053:5;58084:6;58078:13;58069:22;;58100:32;58126:5;58100:32;:::i;:::-;57997:141;;;;:::o;58144:349::-;58213:6;58262:2;58250:9;58241:7;58237:23;58233:32;58230:119;;;58268:79;;:::i;:::-;58230:119;58388:1;58413:63;58468:7;58459:6;58448:9;58444:22;58413:63;:::i;:::-;58403:73;;58359:127;58144:349;;;;:::o;58499:176::-;58531:1;58548:20;58566:1;58548:20;:::i;:::-;58543:25;;58582:20;58600:1;58582:20;:::i;:::-;58577:25;;58621:1;58611:35;;58626:18;;:::i;:::-;58611:35;58667:1;58664;58660:9;58655:14;;58499:176;;;;:::o;58681:182::-;58821:34;58817:1;58809:6;58805:14;58798:58;58681:182;:::o;58869:366::-;59011:3;59032:67;59096:2;59091:3;59032:67;:::i;:::-;59025:74;;59108:93;59197:3;59108:93;:::i;:::-;59226:2;59221:3;59217:12;59210:19;;58869:366;;;:::o;59241:419::-;59407:4;59445:2;59434:9;59430:18;59422:26;;59494:9;59488:4;59484:20;59480:1;59469:9;59465:17;59458:47;59522:131;59648:4;59522:131;:::i;:::-;59514:139;;59241:419;;;:::o;59666:178::-;59806:30;59802:1;59794:6;59790:14;59783:54;59666:178;:::o;59850:366::-;59992:3;60013:67;60077:2;60072:3;60013:67;:::i;:::-;60006:74;;60089:93;60178:3;60089:93;:::i;:::-;60207:2;60202:3;60198:12;60191:19;;59850:366;;;:::o;60222:419::-;60388:4;60426:2;60415:9;60411:18;60403:26;;60475:9;60469:4;60465:20;60461:1;60450:9;60446:17;60439:47;60503:131;60629:4;60503:131;:::i;:::-;60495:139;;60222:419;;;:::o;60647:225::-;60787:34;60783:1;60775:6;60771:14;60764:58;60856:8;60851:2;60843:6;60839:15;60832:33;60647:225;:::o;60878:366::-;61020:3;61041:67;61105:2;61100:3;61041:67;:::i;:::-;61034:74;;61117:93;61206:3;61117:93;:::i;:::-;61235:2;61230:3;61226:12;61219:19;;60878:366;;;:::o;61250:419::-;61416:4;61454:2;61443:9;61439:18;61431:26;;61503:9;61497:4;61493:20;61489:1;61478:9;61474:17;61467:47;61531:131;61657:4;61531:131;:::i;:::-;61523:139;;61250:419;;;:::o;61675:179::-;61815:31;61811:1;61803:6;61799:14;61792:55;61675:179;:::o;61860:366::-;62002:3;62023:67;62087:2;62082:3;62023:67;:::i;:::-;62016:74;;62099:93;62188:3;62099:93;:::i;:::-;62217:2;62212:3;62208:12;62201:19;;61860:366;;;:::o;62232:419::-;62398:4;62436:2;62425:9;62421:18;62413:26;;62485:9;62479:4;62475:20;62471:1;62460:9;62456:17;62449:47;62513:131;62639:4;62513:131;:::i;:::-;62505:139;;62232:419;;;:::o;62657:373::-;62761:3;62789:38;62821:5;62789:38;:::i;:::-;62843:88;62924:6;62919:3;62843:88;:::i;:::-;62836:95;;62940:52;62985:6;62980:3;62973:4;62966:5;62962:16;62940:52;:::i;:::-;63017:6;63012:3;63008:16;63001:23;;62765:265;62657:373;;;;:::o;63036:271::-;63166:3;63188:93;63277:3;63268:6;63188:93;:::i;:::-;63181:100;;63298:3;63291:10;;63036:271;;;;:::o

Swarm Source

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