ETH Price: $3,460.50 (+1.82%)

SprayCans (SC)
 

Overview

TokenID

2

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
SprayCans

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-20
*/

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.0.0/contracts/utils/math/SafeMath.sol



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.0.0/contracts/utils/Strings.sol



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.0.0/contracts/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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.0.0/contracts/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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.0.0/contracts/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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.0.0/contracts/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.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

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

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

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

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

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

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

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

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

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

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

        uint256 totalReceived = address(this).balance + _totalReleased;
        uint256 payment = totalReceived * _shares[account] / _totalShares - _released[account];

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

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

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

    /**
     * @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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.0.0/contracts/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.0.0/contracts/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.0.0/contracts/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.0.0/contracts/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.0.0/contracts/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.0.0/contracts/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.0.0/contracts/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}. 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 || ERC721.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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.0.0/contracts/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/SprayCans.sol


pragma solidity ^0.8.0;




contract SprayCans is ERC721Enumerable, Ownable, PaymentSplitter {
  using Strings for uint256;

  string private _baseUri = "https://ipfs.io/ipfs/QmU4rmWZ3WVAXggx3BKswYFSFejTCeRh1tPnfmbAzwtNHy/";
  bool public _isMintingActive = true;

  uint256 public constant MAX_SUPPLY = 1111;

  mapping(address => uint256) private _buyers; //key is buying address, value is number they've minted
  mapping(address => uint256) private _whitelist_five_plus;
  mapping(address => uint256) private _whitelist_four;
  mapping(address => uint256) private _whitelist_three;

  uint256 public constant PRESALE_START = 1640023200; // Dec 20 2021 1pm ET
  uint256 public constant SALE_START = 1640109600; // Dec 21 2021 1pm ET

  uint256 private _mintCount = 0;

  event Mint(address _to, uint256 _amount);

  constructor(address[] memory payees, uint256[] memory shares) ERC721("SprayCans", "SC") PaymentSplitter(payees, shares) { 
    for (uint i = 0; i < 20; i++) {
      _mint(address(0xfB1e5420041f83623f166612686B53e9A3cCD9B1), _mintCount);
      _mintCount = _mintCount + 1;
    }
  }

  function addWhitelisted(address[] memory _addresses, uint256[] memory _balances) public onlyOwner {
    require(_addresses.length == _balances.length, "lengths must match");
    for (uint i = 0; i < _addresses.length; i++) {
      address _address = _addresses[i];
      uint256 _balance = _balances[i];
      if (_balance >= 5) {
        _whitelist_five_plus[_address] = 3;
      } else if (_balance == 4) {
        _whitelist_four[_address] = 2;
      } else if (_balance == 3) {
        _whitelist_three[_address] = 1;
      }
    }
  }

  function getPrice(address _address) public view returns (uint256) {
    if (block.timestamp >= SALE_START) {
      return 0.1 ether;
    } else if (_whitelist_five_plus[_address] > 0) {
      return 0.070 ether;
    } else if (_whitelist_four[_address] > 0) {
      return 0.075 ether;
    } else if (_whitelist_three[_address] > 0) {
      return 0.080 ether;
    } else {
      return 0.1 ether;
    }
  }

  function getAmountRemaining(address _address) public view returns (uint256) {
    if (block.timestamp >= SALE_START) {
      return 3 - _buyers[_address];
    } else if (_whitelist_five_plus[_address] > 0) {
      return _whitelist_five_plus[_address];
    } else if (_whitelist_four[_address] > 0) {
      return _whitelist_four[_address];
    } else if (_whitelist_three[_address] > 0) {
      return _whitelist_three[_address];
    } else {
      return 0;
    }
  }

  function mint(uint256 amount) public payable {
    require(_isMintingActive && block.timestamp >= PRESALE_START, "Museum: sale is not active");
    require(amount <= getAmountRemaining(msg.sender), "Museum: minting too many");
    require(_mintCount + amount <= MAX_SUPPLY, "Museum: exceeds max supply");
    require(amount * getPrice(msg.sender) == msg.value, "Museum: must send correct ETH amount");

    for (uint i = 0; i < amount; i++) {      
      _mint(msg.sender, _mintCount);
      _mintCount = _mintCount + 1;
    }

    if (block.timestamp >= SALE_START) {
      _buyers[msg.sender] = _buyers[msg.sender] + amount;
    } else if (_whitelist_five_plus[msg.sender] > 0) {
      _whitelist_five_plus[msg.sender] = _whitelist_five_plus[msg.sender] - amount;
    } else if (_whitelist_four[msg.sender] > 0) {
      _whitelist_four[msg.sender] = _whitelist_four[msg.sender] - amount;
    } else if (_whitelist_three[msg.sender] > 0) {
      _whitelist_three[msg.sender] = _whitelist_three[msg.sender] - amount;
    }

    emit Mint(msg.sender, amount);
  }

  function setBaseURI(string memory baseUri) public onlyOwner {
    _baseUri = baseUri;
  }

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

  function toggleMinting() public onlyOwner {
    _isMintingActive = !_isMintingActive;
  }

  function withdraw(address _target, uint256 amount) public onlyOwner {
    payable(_target).transfer(amount);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"payees","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"}],"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":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_isMintingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_balances","type":"uint256[]"}],"name":"addWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getAmountRemaining","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":"_address","type":"address"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":[],"name":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260405180608001604052806044815260200162006a9560449139601090805190602001906200003592919062000d10565b506001601160006101000a81548160ff02191690831515021790555060006016553480156200006357600080fd5b5060405162006ad938038062006ad9833981810160405281019062000089919062000f4a565b81816040518060400160405280600981526020017f537072617943616e7300000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f534300000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200010f92919062000d10565b5080600190805190602001906200012892919062000d10565b50505060006200013d6200034760201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350805182511462000223576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200021a90620011de565b60405180910390fd5b60008251116200026a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002619062001222565b60405180910390fd5b60005b8251811015620002d957620002c38382815181106200029157620002906200151b565b5b6020026020010151838381518110620002af57620002ae6200151b565b5b60200260200101516200034f60201b60201c565b8080620002d09062001440565b9150506200026d565b50505060005b60148110156200033e576200031173fb1e5420041f83623f166612686b53e9a3ccd9b16016546200058960201b60201c565b6001601654620003229190620012fe565b6016819055508080620003359062001440565b915050620002df565b505050620017b2565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620003c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003b99062001156565b60405180910390fd5b6000811162000408576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003ff9062001244565b60405180910390fd5b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146200048d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004849062001200565b60405180910390fd5b600f829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600b54620005449190620012fe565b600b819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac82826040516200057d92919062001129565b60405180910390a15050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620005fc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005f390620011bc565b60405180910390fd5b6200060d816200076f60201b60201c565b1562000650576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006479062001178565b60405180910390fd5b6200066460008383620007db60201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620006b69190620012fe565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b620007f38383836200092260201b620025701760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000840576200083a816200092760201b60201c565b62000888565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000887576200088683826200097060201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620008d557620008cf8162000aed60201b60201c565b6200091d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200091c576200091b828262000bc960201b60201c565b5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016200098a8462000c5560201b620014851760201c565b6200099691906200135b565b905060006007600084815260200190815260200160002054905081811462000a7c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000b0391906200135b565b905060006009600084815260200190815260200160002054905060006008838154811062000b365762000b356200151b565b5b90600052602060002001549050806008838154811062000b5b5762000b5a6200151b565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000bad5762000bac620014ec565b5b6001900381819060005260206000200160009055905550505050565b600062000be18362000c5560201b620014851760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000cc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000cc0906200119a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000d1e90620013d4565b90600052602060002090601f01602090048101928262000d42576000855562000d8e565b82601f1062000d5d57805160ff191683800117855562000d8e565b8280016001018555821562000d8e579182015b8281111562000d8d57825182559160200191906001019062000d70565b5b50905062000d9d919062000da1565b5090565b5b8082111562000dbc57600081600090555060010162000da2565b5090565b600062000dd762000dd1846200128f565b62001266565b9050808382526020820190508285602086028201111562000dfd5762000dfc6200157e565b5b60005b8581101562000e31578162000e16888262000eb6565b84526020840193506020830192505060018101905062000e00565b5050509392505050565b600062000e5262000e4c84620012be565b62001266565b9050808382526020820190508285602086028201111562000e785762000e776200157e565b5b60005b8581101562000eac578162000e91888262000f33565b84526020840193506020830192505060018101905062000e7b565b5050509392505050565b60008151905062000ec7816200177e565b92915050565b600082601f83011262000ee55762000ee462001579565b5b815162000ef784826020860162000dc0565b91505092915050565b600082601f83011262000f185762000f1762001579565b5b815162000f2a84826020860162000e3b565b91505092915050565b60008151905062000f448162001798565b92915050565b6000806040838503121562000f645762000f6362001588565b5b600083015167ffffffffffffffff81111562000f855762000f8462001583565b5b62000f938582860162000ecd565b925050602083015167ffffffffffffffff81111562000fb75762000fb662001583565b5b62000fc58582860162000f00565b9150509250929050565b62000fda8162001396565b82525050565b600062000fef602c83620012ed565b915062000ffc826200159e565b604082019050919050565b600062001016601c83620012ed565b91506200102382620015ed565b602082019050919050565b60006200103d602a83620012ed565b91506200104a8262001616565b604082019050919050565b600062001064602083620012ed565b9150620010718262001665565b602082019050919050565b60006200108b603283620012ed565b915062001098826200168e565b604082019050919050565b6000620010b2602b83620012ed565b9150620010bf82620016dd565b604082019050919050565b6000620010d9601a83620012ed565b9150620010e6826200172c565b602082019050919050565b600062001100601d83620012ed565b91506200110d8262001755565b602082019050919050565b6200112381620013ca565b82525050565b600060408201905062001140600083018562000fcf565b6200114f602083018462001118565b9392505050565b60006020820190508181036000830152620011718162000fe0565b9050919050565b60006020820190508181036000830152620011938162001007565b9050919050565b60006020820190508181036000830152620011b5816200102e565b9050919050565b60006020820190508181036000830152620011d78162001055565b9050919050565b60006020820190508181036000830152620011f9816200107c565b9050919050565b600060208201905081810360008301526200121b81620010a3565b9050919050565b600060208201905081810360008301526200123d81620010ca565b9050919050565b600060208201905081810360008301526200125f81620010f1565b9050919050565b60006200127262001285565b90506200128082826200140a565b919050565b6000604051905090565b600067ffffffffffffffff821115620012ad57620012ac6200154a565b5b602082029050602081019050919050565b600067ffffffffffffffff821115620012dc57620012db6200154a565b5b602082029050602081019050919050565b600082825260208201905092915050565b60006200130b82620013ca565b91506200131883620013ca565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562001350576200134f6200148e565b5b828201905092915050565b60006200136882620013ca565b91506200137583620013ca565b9250828210156200138b576200138a6200148e565b5b828203905092915050565b6000620013a382620013aa565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006002820490506001821680620013ed57607f821691505b60208210811415620014045762001403620014bd565b5b50919050565b62001415826200158d565b810181811067ffffffffffffffff821117156200143757620014366200154a565b5b80604052505050565b60006200144d82620013ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156200148357620014826200148e565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b620017898162001396565b81146200179557600080fd5b50565b620017a381620013ca565b8114620017af57600080fd5b50565b6152d380620017c26000396000f3fe6080604052600436106102135760003560e01c806370a0823111610118578063b88d4fde116100a0578063e33b7de31161006f578063e33b7de314610827578063e985e9c514610852578063ece94e4f1461088f578063f2fde38b146108b8578063f3fef3a3146108e15761025a565b8063b88d4fde14610759578063c87b56dd14610782578063ce7c2ac2146107bf578063d3364687146107fc5761025a565b80638da5cb5b116100e75780638da5cb5b1461068157806395d89b41146106ac5780639852595c146106d7578063a0712d6814610714578063a22cb465146107305761025a565b806370a08231146105d9578063715018a6146106165780637d55094d1461062d5780638b83209b146106445761025a565b80632f745c591161019b57806342842e0e1161016a57806342842e0e146104e25780634ef15e061461050b5780634f6ccce71461053657806355f804b3146105735780636352211e1461059c5761025a565b80632f745c591461041257806332cb6b0c1461044f5780633a98ef391461047a57806341976e09146104a55761025a565b8063095ea7b3116101e2578063095ea7b31461034157806318160ddd1461036a578063191655871461039557806322673030146103be57806323b872dd146103e95761025a565b806301ffc9a71461025f57806306fdde031461029c57806307c6196d146102c7578063081812fc146103045761025a565b3661025a577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061024161090a565b346040516102509291906141e6565b60405180910390a1005b600080fd5b34801561026b57600080fd5b5061028660048036038101906102819190613b9a565b610912565b604051610293919061420f565b60405180910390f35b3480156102a857600080fd5b506102b161098c565b6040516102be919061422a565b60405180910390f35b3480156102d357600080fd5b506102ee60048036038101906102e99190613932565b610a1e565b6040516102fb91906145ac565b60405180910390f35b34801561031057600080fd5b5061032b60048036038101906103269190613c3d565b610c35565b6040516103389190614156565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190613ae2565b610cba565b005b34801561037657600080fd5b5061037f610dd2565b60405161038c91906145ac565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b7919061395f565b610ddf565b005b3480156103ca57600080fd5b506103d3611047565b6040516103e091906145ac565b60405180910390f35b3480156103f557600080fd5b50610410600480360381019061040b91906139cc565b61104f565b005b34801561041e57600080fd5b5061043960048036038101906104349190613ae2565b6110af565b60405161044691906145ac565b60405180910390f35b34801561045b57600080fd5b50610464611154565b60405161047191906145ac565b60405180910390f35b34801561048657600080fd5b5061048f61115a565b60405161049c91906145ac565b60405180910390f35b3480156104b157600080fd5b506104cc60048036038101906104c79190613932565b611164565b6040516104d991906145ac565b60405180910390f35b3480156104ee57600080fd5b50610509600480360381019061050491906139cc565b611299565b005b34801561051757600080fd5b506105206112b9565b60405161052d919061420f565b60405180910390f35b34801561054257600080fd5b5061055d60048036038101906105589190613c3d565b6112cc565b60405161056a91906145ac565b60405180910390f35b34801561057f57600080fd5b5061059a60048036038101906105959190613bf4565b61133d565b005b3480156105a857600080fd5b506105c360048036038101906105be9190613c3d565b6113d3565b6040516105d09190614156565b60405180910390f35b3480156105e557600080fd5b5061060060048036038101906105fb9190613932565b611485565b60405161060d91906145ac565b60405180910390f35b34801561062257600080fd5b5061062b61153d565b005b34801561063957600080fd5b5061064261167a565b005b34801561065057600080fd5b5061066b60048036038101906106669190613c3d565b611722565b6040516106789190614156565b60405180910390f35b34801561068d57600080fd5b5061069661176a565b6040516106a39190614156565b60405180910390f35b3480156106b857600080fd5b506106c1611794565b6040516106ce919061422a565b60405180910390f35b3480156106e357600080fd5b506106fe60048036038101906106f99190613932565b611826565b60405161070b91906145ac565b60405180910390f35b61072e60048036038101906107299190613c3d565b61186f565b005b34801561073c57600080fd5b5061075760048036038101906107529190613aa2565b611d6a565b005b34801561076557600080fd5b50610780600480360381019061077b9190613a1f565b611eeb565b005b34801561078e57600080fd5b506107a960048036038101906107a49190613c3d565b611f4d565b6040516107b6919061422a565b60405180910390f35b3480156107cb57600080fd5b506107e660048036038101906107e19190613932565b611ff4565b6040516107f391906145ac565b60405180910390f35b34801561080857600080fd5b5061081161203d565b60405161081e91906145ac565b60405180910390f35b34801561083357600080fd5b5061083c612045565b60405161084991906145ac565b60405180910390f35b34801561085e57600080fd5b506108796004803603810190610874919061398c565b61204f565b604051610886919061420f565b60405180910390f35b34801561089b57600080fd5b506108b660048036038101906108b19190613b22565b6120e3565b005b3480156108c457600080fd5b506108df60048036038101906108da9190613932565b6122fd565b005b3480156108ed57600080fd5b5061090860048036038101906109039190613ae2565b6124a9565b005b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610985575061098482612575565b5b9050919050565b60606000805461099b90614907565b80601f01602080910402602001604051908101604052809291908181526020018280546109c790614907565b8015610a145780601f106109e957610100808354040283529160200191610a14565b820191906000526020600020905b8154815290600101906020018083116109f757829003601f168201915b5050505050905090565b60006361c216204210610a7e57601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546003610a7791906147d5565b9050610c30565b6000601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610b0d57601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610c30565b6000601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610b9c57601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610c30565b6000601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610c2b57601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610c30565b600090505b919050565b6000610c4082612657565b610c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c769061444c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cc5826113d3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d906144cc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d5561090a565b73ffffffffffffffffffffffffffffffffffffffff161480610d845750610d8381610d7e61090a565b61204f565b5b610dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba906143cc565b60405180910390fd5b610dcd83836126c3565b505050565b6000600880549050905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e58906142ec565b60405180910390fd5b6000600c5447610e7191906146f4565b90506000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b54600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610f03919061477b565b610f0d919061474a565b610f1791906147d5565b90506000811415610f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f54906143ac565b60405180910390fd5b80600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fa891906146f4565b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600c54610ff991906146f4565b600c81905550611009838261277c565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056838260405161103a929190614171565b60405180910390a1505050565b6361c2162081565b61106061105a61090a565b82612870565b61109f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110969061452c565b60405180910390fd5b6110aa83838361294e565b505050565b60006110ba83611485565b82106110fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f29061426c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61045781565b6000600b54905090565b60006361c2162042106111815767016345785d8a00009050611294565b6000601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156111d85766f8b0a10e4700009050611294565b6000601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156112305767010a741a462780009050611294565b6000601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156112885767011c37937e0800009050611294565b67016345785d8a000090505b919050565b6112b483838360405180602001604052806000815250611eeb565b505050565b601160009054906101000a900460ff1681565b60006112d6610dd2565b8210611317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130e9061454c565b60405180910390fd5b6008828154811061132b5761132a614aa0565b5b90600052602060002001549050919050565b61134561090a565b73ffffffffffffffffffffffffffffffffffffffff1661136361176a565b73ffffffffffffffffffffffffffffffffffffffff16146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b09061446c565b60405180910390fd5b80601090805190602001906113cf9291906135f5565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561147c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114739061440c565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ed906143ec565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61154561090a565b73ffffffffffffffffffffffffffffffffffffffff1661156361176a565b73ffffffffffffffffffffffffffffffffffffffff16146115b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b09061446c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61168261090a565b73ffffffffffffffffffffffffffffffffffffffff166116a061176a565b73ffffffffffffffffffffffffffffffffffffffff16146116f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ed9061446c565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b6000600f828154811061173857611737614aa0565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546117a390614907565b80601f01602080910402602001604051908101604052809291908181526020018280546117cf90614907565b801561181c5780601f106117f15761010080835404028352916020019161181c565b820191906000526020600020905b8154815290600101906020018083116117ff57829003601f168201915b5050505050905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601160009054906101000a900460ff16801561188f57506361c0c4a04210155b6118ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c5906144ec565b60405180910390fd5b6118d733610a1e565b811115611919576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119109061450c565b60405180910390fd5b6104578160165461192a91906146f4565b111561196b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119629061458c565b60405180910390fd5b3461197533611164565b82611980919061477b565b146119c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b79061456c565b60405180910390fd5b60005b818110156119ff576119d733601654612baa565b60016016546119e691906146f4565b60168190555080806119f79061496a565b9150506119c3565b506361c216204210611a9e5780601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a5691906146f4565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611d2e565b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611b795780601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b3191906147d5565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611d2d565b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611c545780601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c0c91906147d5565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611d2c565b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611d2b5780601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ce791906147d5565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b5b5b7f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968853382604051611d5f9291906141e6565b60405180910390a150565b611d7261090a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd79061432c565b60405180910390fd5b8060056000611ded61090a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e9a61090a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611edf919061420f565b60405180910390a35050565b611efc611ef661090a565b83612870565b611f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f329061452c565b60405180910390fd5b611f4784848484612d78565b50505050565b6060611f5882612657565b611f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8e906144ac565b60405180910390fd5b6000611fa1612dd4565b90506000815111611fc15760405180602001604052806000815250611fec565b80611fcb84612e66565b604051602001611fdc92919061411d565b6040516020818303038152906040525b915050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6361c0c4a081565b6000600c54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120eb61090a565b73ffffffffffffffffffffffffffffffffffffffff1661210961176a565b73ffffffffffffffffffffffffffffffffffffffff161461215f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121569061446c565b60405180910390fd5b80518251146121a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219a9061424c565b60405180910390fd5b60005b82518110156122f85760008382815181106121c4576121c3614aa0565b5b6020026020010151905060008383815181106121e3576121e2614aa0565b5b602002602001015190506005811061223f576003601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506122e3565b6004811415612292576002601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506122e2565b60038114156122e1576001601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b5b505080806122f09061496a565b9150506121a6565b505050565b61230561090a565b73ffffffffffffffffffffffffffffffffffffffff1661232361176a565b73ffffffffffffffffffffffffffffffffffffffff1614612379576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123709061446c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e0906142ac565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6124b161090a565b73ffffffffffffffffffffffffffffffffffffffff166124cf61176a565b73ffffffffffffffffffffffffffffffffffffffff1614612525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251c9061446c565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561256b573d6000803e3d6000fd5b505050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061264057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612650575061264f82612fc7565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612736836113d3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b804710156127bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b69061436c565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516127e590614141565b60006040518083038185875af1925050503d8060008114612822576040519150601f19603f3d011682016040523d82523d6000602084013e612827565b606091505b505090508061286b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128629061434c565b60405180910390fd5b505050565b600061287b82612657565b6128ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b19061438c565b60405180910390fd5b60006128c5836113d3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061293457508373ffffffffffffffffffffffffffffffffffffffff1661291c84610c35565b73ffffffffffffffffffffffffffffffffffffffff16145b806129455750612944818561204f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661296e826113d3565b73ffffffffffffffffffffffffffffffffffffffff16146129c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129bb9061448c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2b9061430c565b60405180910390fd5b612a3f838383613031565b612a4a6000826126c3565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a9a91906147d5565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612af191906146f4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c119061442c565b60405180910390fd5b612c2381612657565b15612c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5a906142cc565b60405180910390fd5b612c6f60008383613031565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cbf91906146f4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612d8384848461294e565b612d8f84848484613145565b612dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc59061428c565b60405180910390fd5b50505050565b606060108054612de390614907565b80601f0160208091040260200160405190810160405280929190818152602001828054612e0f90614907565b8015612e5c5780601f10612e3157610100808354040283529160200191612e5c565b820191906000526020600020905b815481529060010190602001808311612e3f57829003601f168201915b5050505050905090565b60606000821415612eae576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612fc2565b600082905060005b60008214612ee0578080612ec99061496a565b915050600a82612ed9919061474a565b9150612eb6565b60008167ffffffffffffffff811115612efc57612efb614acf565b5b6040519080825280601f01601f191660200182016040528015612f2e5781602001600182028036833780820191505090505b5090505b60008514612fbb57600182612f4791906147d5565b9150600a85612f5691906149b3565b6030612f6291906146f4565b60f81b818381518110612f7857612f77614aa0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fb4919061474a565b9450612f32565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61303c838383612570565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561307f5761307a816132dc565b6130be565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130bd576130bc8382613325565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613101576130fc81613492565b613140565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461313f5761313e8282613563565b5b5b505050565b60006131668473ffffffffffffffffffffffffffffffffffffffff166135e2565b156132cf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261318f61090a565b8786866040518563ffffffff1660e01b81526004016131b1949392919061419a565b602060405180830381600087803b1580156131cb57600080fd5b505af19250505080156131fc57506040513d601f19601f820116820180604052508101906131f99190613bc7565b60015b61327f573d806000811461322c576040519150601f19603f3d011682016040523d82523d6000602084013e613231565b606091505b50600081511415613277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326e9061428c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132d4565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161333284611485565b61333c91906147d5565b9050600060076000848152602001908152602001600020549050818114613421576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506134a691906147d5565b90506000600960008481526020019081526020016000205490506000600883815481106134d6576134d5614aa0565b5b9060005260206000200154905080600883815481106134f8576134f7614aa0565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061354757613546614a71565b5b6001900381819060005260206000200160009055905550505050565b600061356e83611485565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b82805461360190614907565b90600052602060002090601f016020900481019282613623576000855561366a565b82601f1061363c57805160ff191683800117855561366a565b8280016001018555821561366a579182015b8281111561366957825182559160200191906001019061364e565b5b509050613677919061367b565b5090565b5b8082111561369457600081600090555060010161367c565b5090565b60006136ab6136a6846145ec565b6145c7565b905080838252602082019050828560208602820111156136ce576136cd614b03565b5b60005b858110156136fe57816136e488826137fc565b8452602084019350602083019250506001810190506136d1565b5050509392505050565b600061371b61371684614618565b6145c7565b9050808382526020820190508285602086028201111561373e5761373d614b03565b5b60005b8581101561376e5781613754888261391d565b845260208401935060208301925050600181019050613741565b5050509392505050565b600061378b61378684614644565b6145c7565b9050828152602081018484840111156137a7576137a6614b08565b5b6137b28482856148c5565b509392505050565b60006137cd6137c884614675565b6145c7565b9050828152602081018484840111156137e9576137e8614b08565b5b6137f48482856148c5565b509392505050565b60008135905061380b8161522a565b92915050565b60008135905061382081615241565b92915050565b600082601f83011261383b5761383a614afe565b5b813561384b848260208601613698565b91505092915050565b600082601f83011261386957613868614afe565b5b8135613879848260208601613708565b91505092915050565b60008135905061389181615258565b92915050565b6000813590506138a68161526f565b92915050565b6000815190506138bb8161526f565b92915050565b600082601f8301126138d6576138d5614afe565b5b81356138e6848260208601613778565b91505092915050565b600082601f83011261390457613903614afe565b5b81356139148482602086016137ba565b91505092915050565b60008135905061392c81615286565b92915050565b60006020828403121561394857613947614b12565b5b6000613956848285016137fc565b91505092915050565b60006020828403121561397557613974614b12565b5b600061398384828501613811565b91505092915050565b600080604083850312156139a3576139a2614b12565b5b60006139b1858286016137fc565b92505060206139c2858286016137fc565b9150509250929050565b6000806000606084860312156139e5576139e4614b12565b5b60006139f3868287016137fc565b9350506020613a04868287016137fc565b9250506040613a158682870161391d565b9150509250925092565b60008060008060808587031215613a3957613a38614b12565b5b6000613a47878288016137fc565b9450506020613a58878288016137fc565b9350506040613a698782880161391d565b925050606085013567ffffffffffffffff811115613a8a57613a89614b0d565b5b613a96878288016138c1565b91505092959194509250565b60008060408385031215613ab957613ab8614b12565b5b6000613ac7858286016137fc565b9250506020613ad885828601613882565b9150509250929050565b60008060408385031215613af957613af8614b12565b5b6000613b07858286016137fc565b9250506020613b188582860161391d565b9150509250929050565b60008060408385031215613b3957613b38614b12565b5b600083013567ffffffffffffffff811115613b5757613b56614b0d565b5b613b6385828601613826565b925050602083013567ffffffffffffffff811115613b8457613b83614b0d565b5b613b9085828601613854565b9150509250929050565b600060208284031215613bb057613baf614b12565b5b6000613bbe84828501613897565b91505092915050565b600060208284031215613bdd57613bdc614b12565b5b6000613beb848285016138ac565b91505092915050565b600060208284031215613c0a57613c09614b12565b5b600082013567ffffffffffffffff811115613c2857613c27614b0d565b5b613c34848285016138ef565b91505092915050565b600060208284031215613c5357613c52614b12565b5b6000613c618482850161391d565b91505092915050565b613c738161488f565b82525050565b613c8281614809565b82525050565b613c918161482d565b82525050565b6000613ca2826146a6565b613cac81856146bc565b9350613cbc8185602086016148d4565b613cc581614b17565b840191505092915050565b6000613cdb826146b1565b613ce581856146d8565b9350613cf58185602086016148d4565b613cfe81614b17565b840191505092915050565b6000613d14826146b1565b613d1e81856146e9565b9350613d2e8185602086016148d4565b80840191505092915050565b6000613d476012836146d8565b9150613d5282614b28565b602082019050919050565b6000613d6a602b836146d8565b9150613d7582614b51565b604082019050919050565b6000613d8d6032836146d8565b9150613d9882614ba0565b604082019050919050565b6000613db06026836146d8565b9150613dbb82614bef565b604082019050919050565b6000613dd3601c836146d8565b9150613dde82614c3e565b602082019050919050565b6000613df66026836146d8565b9150613e0182614c67565b604082019050919050565b6000613e196024836146d8565b9150613e2482614cb6565b604082019050919050565b6000613e3c6019836146d8565b9150613e4782614d05565b602082019050919050565b6000613e5f603a836146d8565b9150613e6a82614d2e565b604082019050919050565b6000613e82601d836146d8565b9150613e8d82614d7d565b602082019050919050565b6000613ea5602c836146d8565b9150613eb082614da6565b604082019050919050565b6000613ec8602b836146d8565b9150613ed382614df5565b604082019050919050565b6000613eeb6038836146d8565b9150613ef682614e44565b604082019050919050565b6000613f0e602a836146d8565b9150613f1982614e93565b604082019050919050565b6000613f316029836146d8565b9150613f3c82614ee2565b604082019050919050565b6000613f546020836146d8565b9150613f5f82614f31565b602082019050919050565b6000613f77602c836146d8565b9150613f8282614f5a565b604082019050919050565b6000613f9a6020836146d8565b9150613fa582614fa9565b602082019050919050565b6000613fbd6029836146d8565b9150613fc882614fd2565b604082019050919050565b6000613fe0602f836146d8565b9150613feb82615021565b604082019050919050565b60006140036021836146d8565b915061400e82615070565b604082019050919050565b6000614026601a836146d8565b9150614031826150bf565b602082019050919050565b60006140496018836146d8565b9150614054826150e8565b602082019050919050565b600061406c6000836146cd565b915061407782615111565b600082019050919050565b600061408f6031836146d8565b915061409a82615114565b604082019050919050565b60006140b2602c836146d8565b91506140bd82615163565b604082019050919050565b60006140d56024836146d8565b91506140e0826151b2565b604082019050919050565b60006140f8601a836146d8565b915061410382615201565b602082019050919050565b61411781614885565b82525050565b60006141298285613d09565b91506141358284613d09565b91508190509392505050565b600061414c8261405f565b9150819050919050565b600060208201905061416b6000830184613c79565b92915050565b60006040820190506141866000830185613c6a565b614193602083018461410e565b9392505050565b60006080820190506141af6000830187613c79565b6141bc6020830186613c79565b6141c9604083018561410e565b81810360608301526141db8184613c97565b905095945050505050565b60006040820190506141fb6000830185613c79565b614208602083018461410e565b9392505050565b60006020820190506142246000830184613c88565b92915050565b600060208201905081810360008301526142448184613cd0565b905092915050565b6000602082019050818103600083015261426581613d3a565b9050919050565b6000602082019050818103600083015261428581613d5d565b9050919050565b600060208201905081810360008301526142a581613d80565b9050919050565b600060208201905081810360008301526142c581613da3565b9050919050565b600060208201905081810360008301526142e581613dc6565b9050919050565b6000602082019050818103600083015261430581613de9565b9050919050565b6000602082019050818103600083015261432581613e0c565b9050919050565b6000602082019050818103600083015261434581613e2f565b9050919050565b6000602082019050818103600083015261436581613e52565b9050919050565b6000602082019050818103600083015261438581613e75565b9050919050565b600060208201905081810360008301526143a581613e98565b9050919050565b600060208201905081810360008301526143c581613ebb565b9050919050565b600060208201905081810360008301526143e581613ede565b9050919050565b6000602082019050818103600083015261440581613f01565b9050919050565b6000602082019050818103600083015261442581613f24565b9050919050565b6000602082019050818103600083015261444581613f47565b9050919050565b6000602082019050818103600083015261446581613f6a565b9050919050565b6000602082019050818103600083015261448581613f8d565b9050919050565b600060208201905081810360008301526144a581613fb0565b9050919050565b600060208201905081810360008301526144c581613fd3565b9050919050565b600060208201905081810360008301526144e581613ff6565b9050919050565b6000602082019050818103600083015261450581614019565b9050919050565b600060208201905081810360008301526145258161403c565b9050919050565b6000602082019050818103600083015261454581614082565b9050919050565b60006020820190508181036000830152614565816140a5565b9050919050565b60006020820190508181036000830152614585816140c8565b9050919050565b600060208201905081810360008301526145a5816140eb565b9050919050565b60006020820190506145c1600083018461410e565b92915050565b60006145d16145e2565b90506145dd8282614939565b919050565b6000604051905090565b600067ffffffffffffffff82111561460757614606614acf565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561463357614632614acf565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561465f5761465e614acf565b5b61466882614b17565b9050602081019050919050565b600067ffffffffffffffff8211156146905761468f614acf565b5b61469982614b17565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006146ff82614885565b915061470a83614885565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561473f5761473e6149e4565b5b828201905092915050565b600061475582614885565b915061476083614885565b9250826147705761476f614a13565b5b828204905092915050565b600061478682614885565b915061479183614885565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147ca576147c96149e4565b5b828202905092915050565b60006147e082614885565b91506147eb83614885565b9250828210156147fe576147fd6149e4565b5b828203905092915050565b600061481482614865565b9050919050565b600061482682614865565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061489a826148a1565b9050919050565b60006148ac826148b3565b9050919050565b60006148be82614865565b9050919050565b82818337600083830152505050565b60005b838110156148f25780820151818401526020810190506148d7565b83811115614901576000848401525b50505050565b6000600282049050600182168061491f57607f821691505b6020821081141561493357614932614a42565b5b50919050565b61494282614b17565b810181811067ffffffffffffffff8211171561496157614960614acf565b5b80604052505050565b600061497582614885565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156149a8576149a76149e4565b5b600182019050919050565b60006149be82614885565b91506149c983614885565b9250826149d9576149d8614a13565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f6c656e67746873206d757374206d617463680000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d757365756d3a2073616c65206973206e6f7420616374697665000000000000600082015250565b7f4d757365756d3a206d696e74696e6720746f6f206d616e790000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d757365756d3a206d7573742073656e6420636f72726563742045544820616d60008201527f6f756e7400000000000000000000000000000000000000000000000000000000602082015250565b7f4d757365756d3a2065786365656473206d617820737570706c79000000000000600082015250565b61523381614809565b811461523e57600080fd5b50565b61524a8161481b565b811461525557600080fd5b50565b6152618161482d565b811461526c57600080fd5b50565b61527881614839565b811461528357600080fd5b50565b61528f81614885565b811461529a57600080fd5b5056fea264697066735822122013445169fcd8d99ee25a01c1fc28e5de40b527a8d9686bcf26d7b51f6cda4cae64736f6c6343000807003368747470733a2f2f697066732e696f2f697066732f516d5534726d575a335756415867677833424b737759465346656a54436552683174506e666d62417a77744e48792f00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000800000000000000000000000048f9dca3a262bb64fa08dc66b007a894e0d9bb82000000000000000000000000fb1e5420041f83623f166612686b53e9a3ccd9b10000000000000000000000006d40c146fa3bfe12032e325203b848261895743e00000000000000000000000064ae35c67ea7075f5897a789c0a5bbc97765c43d0000000000000000000000004956289e64be9ddedb69ab941dc3385a4e29b8a70000000000000000000000007fcebd09a8c129ad05388db461173172bbbee5290000000000000000000000009d60432ae5735bca207399e3aeb21dba47b67656000000000000000000000000997b8e4dd410de46277a2a7050e0ed501ba24f7500000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000003

Deployed Bytecode

0x6080604052600436106102135760003560e01c806370a0823111610118578063b88d4fde116100a0578063e33b7de31161006f578063e33b7de314610827578063e985e9c514610852578063ece94e4f1461088f578063f2fde38b146108b8578063f3fef3a3146108e15761025a565b8063b88d4fde14610759578063c87b56dd14610782578063ce7c2ac2146107bf578063d3364687146107fc5761025a565b80638da5cb5b116100e75780638da5cb5b1461068157806395d89b41146106ac5780639852595c146106d7578063a0712d6814610714578063a22cb465146107305761025a565b806370a08231146105d9578063715018a6146106165780637d55094d1461062d5780638b83209b146106445761025a565b80632f745c591161019b57806342842e0e1161016a57806342842e0e146104e25780634ef15e061461050b5780634f6ccce71461053657806355f804b3146105735780636352211e1461059c5761025a565b80632f745c591461041257806332cb6b0c1461044f5780633a98ef391461047a57806341976e09146104a55761025a565b8063095ea7b3116101e2578063095ea7b31461034157806318160ddd1461036a578063191655871461039557806322673030146103be57806323b872dd146103e95761025a565b806301ffc9a71461025f57806306fdde031461029c57806307c6196d146102c7578063081812fc146103045761025a565b3661025a577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061024161090a565b346040516102509291906141e6565b60405180910390a1005b600080fd5b34801561026b57600080fd5b5061028660048036038101906102819190613b9a565b610912565b604051610293919061420f565b60405180910390f35b3480156102a857600080fd5b506102b161098c565b6040516102be919061422a565b60405180910390f35b3480156102d357600080fd5b506102ee60048036038101906102e99190613932565b610a1e565b6040516102fb91906145ac565b60405180910390f35b34801561031057600080fd5b5061032b60048036038101906103269190613c3d565b610c35565b6040516103389190614156565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190613ae2565b610cba565b005b34801561037657600080fd5b5061037f610dd2565b60405161038c91906145ac565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b7919061395f565b610ddf565b005b3480156103ca57600080fd5b506103d3611047565b6040516103e091906145ac565b60405180910390f35b3480156103f557600080fd5b50610410600480360381019061040b91906139cc565b61104f565b005b34801561041e57600080fd5b5061043960048036038101906104349190613ae2565b6110af565b60405161044691906145ac565b60405180910390f35b34801561045b57600080fd5b50610464611154565b60405161047191906145ac565b60405180910390f35b34801561048657600080fd5b5061048f61115a565b60405161049c91906145ac565b60405180910390f35b3480156104b157600080fd5b506104cc60048036038101906104c79190613932565b611164565b6040516104d991906145ac565b60405180910390f35b3480156104ee57600080fd5b50610509600480360381019061050491906139cc565b611299565b005b34801561051757600080fd5b506105206112b9565b60405161052d919061420f565b60405180910390f35b34801561054257600080fd5b5061055d60048036038101906105589190613c3d565b6112cc565b60405161056a91906145ac565b60405180910390f35b34801561057f57600080fd5b5061059a60048036038101906105959190613bf4565b61133d565b005b3480156105a857600080fd5b506105c360048036038101906105be9190613c3d565b6113d3565b6040516105d09190614156565b60405180910390f35b3480156105e557600080fd5b5061060060048036038101906105fb9190613932565b611485565b60405161060d91906145ac565b60405180910390f35b34801561062257600080fd5b5061062b61153d565b005b34801561063957600080fd5b5061064261167a565b005b34801561065057600080fd5b5061066b60048036038101906106669190613c3d565b611722565b6040516106789190614156565b60405180910390f35b34801561068d57600080fd5b5061069661176a565b6040516106a39190614156565b60405180910390f35b3480156106b857600080fd5b506106c1611794565b6040516106ce919061422a565b60405180910390f35b3480156106e357600080fd5b506106fe60048036038101906106f99190613932565b611826565b60405161070b91906145ac565b60405180910390f35b61072e60048036038101906107299190613c3d565b61186f565b005b34801561073c57600080fd5b5061075760048036038101906107529190613aa2565b611d6a565b005b34801561076557600080fd5b50610780600480360381019061077b9190613a1f565b611eeb565b005b34801561078e57600080fd5b506107a960048036038101906107a49190613c3d565b611f4d565b6040516107b6919061422a565b60405180910390f35b3480156107cb57600080fd5b506107e660048036038101906107e19190613932565b611ff4565b6040516107f391906145ac565b60405180910390f35b34801561080857600080fd5b5061081161203d565b60405161081e91906145ac565b60405180910390f35b34801561083357600080fd5b5061083c612045565b60405161084991906145ac565b60405180910390f35b34801561085e57600080fd5b506108796004803603810190610874919061398c565b61204f565b604051610886919061420f565b60405180910390f35b34801561089b57600080fd5b506108b660048036038101906108b19190613b22565b6120e3565b005b3480156108c457600080fd5b506108df60048036038101906108da9190613932565b6122fd565b005b3480156108ed57600080fd5b5061090860048036038101906109039190613ae2565b6124a9565b005b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610985575061098482612575565b5b9050919050565b60606000805461099b90614907565b80601f01602080910402602001604051908101604052809291908181526020018280546109c790614907565b8015610a145780601f106109e957610100808354040283529160200191610a14565b820191906000526020600020905b8154815290600101906020018083116109f757829003601f168201915b5050505050905090565b60006361c216204210610a7e57601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546003610a7791906147d5565b9050610c30565b6000601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610b0d57601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610c30565b6000601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610b9c57601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610c30565b6000601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610c2b57601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610c30565b600090505b919050565b6000610c4082612657565b610c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c769061444c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cc5826113d3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d906144cc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d5561090a565b73ffffffffffffffffffffffffffffffffffffffff161480610d845750610d8381610d7e61090a565b61204f565b5b610dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba906143cc565b60405180910390fd5b610dcd83836126c3565b505050565b6000600880549050905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e58906142ec565b60405180910390fd5b6000600c5447610e7191906146f4565b90506000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b54600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610f03919061477b565b610f0d919061474a565b610f1791906147d5565b90506000811415610f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f54906143ac565b60405180910390fd5b80600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fa891906146f4565b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600c54610ff991906146f4565b600c81905550611009838261277c565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056838260405161103a929190614171565b60405180910390a1505050565b6361c2162081565b61106061105a61090a565b82612870565b61109f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110969061452c565b60405180910390fd5b6110aa83838361294e565b505050565b60006110ba83611485565b82106110fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f29061426c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61045781565b6000600b54905090565b60006361c2162042106111815767016345785d8a00009050611294565b6000601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156111d85766f8b0a10e4700009050611294565b6000601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156112305767010a741a462780009050611294565b6000601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156112885767011c37937e0800009050611294565b67016345785d8a000090505b919050565b6112b483838360405180602001604052806000815250611eeb565b505050565b601160009054906101000a900460ff1681565b60006112d6610dd2565b8210611317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130e9061454c565b60405180910390fd5b6008828154811061132b5761132a614aa0565b5b90600052602060002001549050919050565b61134561090a565b73ffffffffffffffffffffffffffffffffffffffff1661136361176a565b73ffffffffffffffffffffffffffffffffffffffff16146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b09061446c565b60405180910390fd5b80601090805190602001906113cf9291906135f5565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561147c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114739061440c565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ed906143ec565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61154561090a565b73ffffffffffffffffffffffffffffffffffffffff1661156361176a565b73ffffffffffffffffffffffffffffffffffffffff16146115b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b09061446c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61168261090a565b73ffffffffffffffffffffffffffffffffffffffff166116a061176a565b73ffffffffffffffffffffffffffffffffffffffff16146116f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ed9061446c565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b6000600f828154811061173857611737614aa0565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546117a390614907565b80601f01602080910402602001604051908101604052809291908181526020018280546117cf90614907565b801561181c5780601f106117f15761010080835404028352916020019161181c565b820191906000526020600020905b8154815290600101906020018083116117ff57829003601f168201915b5050505050905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601160009054906101000a900460ff16801561188f57506361c0c4a04210155b6118ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c5906144ec565b60405180910390fd5b6118d733610a1e565b811115611919576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119109061450c565b60405180910390fd5b6104578160165461192a91906146f4565b111561196b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119629061458c565b60405180910390fd5b3461197533611164565b82611980919061477b565b146119c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b79061456c565b60405180910390fd5b60005b818110156119ff576119d733601654612baa565b60016016546119e691906146f4565b60168190555080806119f79061496a565b9150506119c3565b506361c216204210611a9e5780601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a5691906146f4565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611d2e565b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611b795780601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b3191906147d5565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611d2d565b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611c545780601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c0c91906147d5565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611d2c565b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611d2b5780601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ce791906147d5565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b5b5b7f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968853382604051611d5f9291906141e6565b60405180910390a150565b611d7261090a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd79061432c565b60405180910390fd5b8060056000611ded61090a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e9a61090a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611edf919061420f565b60405180910390a35050565b611efc611ef661090a565b83612870565b611f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f329061452c565b60405180910390fd5b611f4784848484612d78565b50505050565b6060611f5882612657565b611f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8e906144ac565b60405180910390fd5b6000611fa1612dd4565b90506000815111611fc15760405180602001604052806000815250611fec565b80611fcb84612e66565b604051602001611fdc92919061411d565b6040516020818303038152906040525b915050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6361c0c4a081565b6000600c54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120eb61090a565b73ffffffffffffffffffffffffffffffffffffffff1661210961176a565b73ffffffffffffffffffffffffffffffffffffffff161461215f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121569061446c565b60405180910390fd5b80518251146121a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219a9061424c565b60405180910390fd5b60005b82518110156122f85760008382815181106121c4576121c3614aa0565b5b6020026020010151905060008383815181106121e3576121e2614aa0565b5b602002602001015190506005811061223f576003601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506122e3565b6004811415612292576002601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506122e2565b60038114156122e1576001601560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b5b505080806122f09061496a565b9150506121a6565b505050565b61230561090a565b73ffffffffffffffffffffffffffffffffffffffff1661232361176a565b73ffffffffffffffffffffffffffffffffffffffff1614612379576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123709061446c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e0906142ac565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6124b161090a565b73ffffffffffffffffffffffffffffffffffffffff166124cf61176a565b73ffffffffffffffffffffffffffffffffffffffff1614612525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251c9061446c565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561256b573d6000803e3d6000fd5b505050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061264057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612650575061264f82612fc7565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612736836113d3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b804710156127bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b69061436c565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516127e590614141565b60006040518083038185875af1925050503d8060008114612822576040519150601f19603f3d011682016040523d82523d6000602084013e612827565b606091505b505090508061286b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128629061434c565b60405180910390fd5b505050565b600061287b82612657565b6128ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b19061438c565b60405180910390fd5b60006128c5836113d3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061293457508373ffffffffffffffffffffffffffffffffffffffff1661291c84610c35565b73ffffffffffffffffffffffffffffffffffffffff16145b806129455750612944818561204f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661296e826113d3565b73ffffffffffffffffffffffffffffffffffffffff16146129c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129bb9061448c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2b9061430c565b60405180910390fd5b612a3f838383613031565b612a4a6000826126c3565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a9a91906147d5565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612af191906146f4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c119061442c565b60405180910390fd5b612c2381612657565b15612c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5a906142cc565b60405180910390fd5b612c6f60008383613031565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cbf91906146f4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612d8384848461294e565b612d8f84848484613145565b612dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc59061428c565b60405180910390fd5b50505050565b606060108054612de390614907565b80601f0160208091040260200160405190810160405280929190818152602001828054612e0f90614907565b8015612e5c5780601f10612e3157610100808354040283529160200191612e5c565b820191906000526020600020905b815481529060010190602001808311612e3f57829003601f168201915b5050505050905090565b60606000821415612eae576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612fc2565b600082905060005b60008214612ee0578080612ec99061496a565b915050600a82612ed9919061474a565b9150612eb6565b60008167ffffffffffffffff811115612efc57612efb614acf565b5b6040519080825280601f01601f191660200182016040528015612f2e5781602001600182028036833780820191505090505b5090505b60008514612fbb57600182612f4791906147d5565b9150600a85612f5691906149b3565b6030612f6291906146f4565b60f81b818381518110612f7857612f77614aa0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fb4919061474a565b9450612f32565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61303c838383612570565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561307f5761307a816132dc565b6130be565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130bd576130bc8382613325565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613101576130fc81613492565b613140565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461313f5761313e8282613563565b5b5b505050565b60006131668473ffffffffffffffffffffffffffffffffffffffff166135e2565b156132cf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261318f61090a565b8786866040518563ffffffff1660e01b81526004016131b1949392919061419a565b602060405180830381600087803b1580156131cb57600080fd5b505af19250505080156131fc57506040513d601f19601f820116820180604052508101906131f99190613bc7565b60015b61327f573d806000811461322c576040519150601f19603f3d011682016040523d82523d6000602084013e613231565b606091505b50600081511415613277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326e9061428c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132d4565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161333284611485565b61333c91906147d5565b9050600060076000848152602001908152602001600020549050818114613421576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506134a691906147d5565b90506000600960008481526020019081526020016000205490506000600883815481106134d6576134d5614aa0565b5b9060005260206000200154905080600883815481106134f8576134f7614aa0565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061354757613546614a71565b5b6001900381819060005260206000200160009055905550505050565b600061356e83611485565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b82805461360190614907565b90600052602060002090601f016020900481019282613623576000855561366a565b82601f1061363c57805160ff191683800117855561366a565b8280016001018555821561366a579182015b8281111561366957825182559160200191906001019061364e565b5b509050613677919061367b565b5090565b5b8082111561369457600081600090555060010161367c565b5090565b60006136ab6136a6846145ec565b6145c7565b905080838252602082019050828560208602820111156136ce576136cd614b03565b5b60005b858110156136fe57816136e488826137fc565b8452602084019350602083019250506001810190506136d1565b5050509392505050565b600061371b61371684614618565b6145c7565b9050808382526020820190508285602086028201111561373e5761373d614b03565b5b60005b8581101561376e5781613754888261391d565b845260208401935060208301925050600181019050613741565b5050509392505050565b600061378b61378684614644565b6145c7565b9050828152602081018484840111156137a7576137a6614b08565b5b6137b28482856148c5565b509392505050565b60006137cd6137c884614675565b6145c7565b9050828152602081018484840111156137e9576137e8614b08565b5b6137f48482856148c5565b509392505050565b60008135905061380b8161522a565b92915050565b60008135905061382081615241565b92915050565b600082601f83011261383b5761383a614afe565b5b813561384b848260208601613698565b91505092915050565b600082601f83011261386957613868614afe565b5b8135613879848260208601613708565b91505092915050565b60008135905061389181615258565b92915050565b6000813590506138a68161526f565b92915050565b6000815190506138bb8161526f565b92915050565b600082601f8301126138d6576138d5614afe565b5b81356138e6848260208601613778565b91505092915050565b600082601f83011261390457613903614afe565b5b81356139148482602086016137ba565b91505092915050565b60008135905061392c81615286565b92915050565b60006020828403121561394857613947614b12565b5b6000613956848285016137fc565b91505092915050565b60006020828403121561397557613974614b12565b5b600061398384828501613811565b91505092915050565b600080604083850312156139a3576139a2614b12565b5b60006139b1858286016137fc565b92505060206139c2858286016137fc565b9150509250929050565b6000806000606084860312156139e5576139e4614b12565b5b60006139f3868287016137fc565b9350506020613a04868287016137fc565b9250506040613a158682870161391d565b9150509250925092565b60008060008060808587031215613a3957613a38614b12565b5b6000613a47878288016137fc565b9450506020613a58878288016137fc565b9350506040613a698782880161391d565b925050606085013567ffffffffffffffff811115613a8a57613a89614b0d565b5b613a96878288016138c1565b91505092959194509250565b60008060408385031215613ab957613ab8614b12565b5b6000613ac7858286016137fc565b9250506020613ad885828601613882565b9150509250929050565b60008060408385031215613af957613af8614b12565b5b6000613b07858286016137fc565b9250506020613b188582860161391d565b9150509250929050565b60008060408385031215613b3957613b38614b12565b5b600083013567ffffffffffffffff811115613b5757613b56614b0d565b5b613b6385828601613826565b925050602083013567ffffffffffffffff811115613b8457613b83614b0d565b5b613b9085828601613854565b9150509250929050565b600060208284031215613bb057613baf614b12565b5b6000613bbe84828501613897565b91505092915050565b600060208284031215613bdd57613bdc614b12565b5b6000613beb848285016138ac565b91505092915050565b600060208284031215613c0a57613c09614b12565b5b600082013567ffffffffffffffff811115613c2857613c27614b0d565b5b613c34848285016138ef565b91505092915050565b600060208284031215613c5357613c52614b12565b5b6000613c618482850161391d565b91505092915050565b613c738161488f565b82525050565b613c8281614809565b82525050565b613c918161482d565b82525050565b6000613ca2826146a6565b613cac81856146bc565b9350613cbc8185602086016148d4565b613cc581614b17565b840191505092915050565b6000613cdb826146b1565b613ce581856146d8565b9350613cf58185602086016148d4565b613cfe81614b17565b840191505092915050565b6000613d14826146b1565b613d1e81856146e9565b9350613d2e8185602086016148d4565b80840191505092915050565b6000613d476012836146d8565b9150613d5282614b28565b602082019050919050565b6000613d6a602b836146d8565b9150613d7582614b51565b604082019050919050565b6000613d8d6032836146d8565b9150613d9882614ba0565b604082019050919050565b6000613db06026836146d8565b9150613dbb82614bef565b604082019050919050565b6000613dd3601c836146d8565b9150613dde82614c3e565b602082019050919050565b6000613df66026836146d8565b9150613e0182614c67565b604082019050919050565b6000613e196024836146d8565b9150613e2482614cb6565b604082019050919050565b6000613e3c6019836146d8565b9150613e4782614d05565b602082019050919050565b6000613e5f603a836146d8565b9150613e6a82614d2e565b604082019050919050565b6000613e82601d836146d8565b9150613e8d82614d7d565b602082019050919050565b6000613ea5602c836146d8565b9150613eb082614da6565b604082019050919050565b6000613ec8602b836146d8565b9150613ed382614df5565b604082019050919050565b6000613eeb6038836146d8565b9150613ef682614e44565b604082019050919050565b6000613f0e602a836146d8565b9150613f1982614e93565b604082019050919050565b6000613f316029836146d8565b9150613f3c82614ee2565b604082019050919050565b6000613f546020836146d8565b9150613f5f82614f31565b602082019050919050565b6000613f77602c836146d8565b9150613f8282614f5a565b604082019050919050565b6000613f9a6020836146d8565b9150613fa582614fa9565b602082019050919050565b6000613fbd6029836146d8565b9150613fc882614fd2565b604082019050919050565b6000613fe0602f836146d8565b9150613feb82615021565b604082019050919050565b60006140036021836146d8565b915061400e82615070565b604082019050919050565b6000614026601a836146d8565b9150614031826150bf565b602082019050919050565b60006140496018836146d8565b9150614054826150e8565b602082019050919050565b600061406c6000836146cd565b915061407782615111565b600082019050919050565b600061408f6031836146d8565b915061409a82615114565b604082019050919050565b60006140b2602c836146d8565b91506140bd82615163565b604082019050919050565b60006140d56024836146d8565b91506140e0826151b2565b604082019050919050565b60006140f8601a836146d8565b915061410382615201565b602082019050919050565b61411781614885565b82525050565b60006141298285613d09565b91506141358284613d09565b91508190509392505050565b600061414c8261405f565b9150819050919050565b600060208201905061416b6000830184613c79565b92915050565b60006040820190506141866000830185613c6a565b614193602083018461410e565b9392505050565b60006080820190506141af6000830187613c79565b6141bc6020830186613c79565b6141c9604083018561410e565b81810360608301526141db8184613c97565b905095945050505050565b60006040820190506141fb6000830185613c79565b614208602083018461410e565b9392505050565b60006020820190506142246000830184613c88565b92915050565b600060208201905081810360008301526142448184613cd0565b905092915050565b6000602082019050818103600083015261426581613d3a565b9050919050565b6000602082019050818103600083015261428581613d5d565b9050919050565b600060208201905081810360008301526142a581613d80565b9050919050565b600060208201905081810360008301526142c581613da3565b9050919050565b600060208201905081810360008301526142e581613dc6565b9050919050565b6000602082019050818103600083015261430581613de9565b9050919050565b6000602082019050818103600083015261432581613e0c565b9050919050565b6000602082019050818103600083015261434581613e2f565b9050919050565b6000602082019050818103600083015261436581613e52565b9050919050565b6000602082019050818103600083015261438581613e75565b9050919050565b600060208201905081810360008301526143a581613e98565b9050919050565b600060208201905081810360008301526143c581613ebb565b9050919050565b600060208201905081810360008301526143e581613ede565b9050919050565b6000602082019050818103600083015261440581613f01565b9050919050565b6000602082019050818103600083015261442581613f24565b9050919050565b6000602082019050818103600083015261444581613f47565b9050919050565b6000602082019050818103600083015261446581613f6a565b9050919050565b6000602082019050818103600083015261448581613f8d565b9050919050565b600060208201905081810360008301526144a581613fb0565b9050919050565b600060208201905081810360008301526144c581613fd3565b9050919050565b600060208201905081810360008301526144e581613ff6565b9050919050565b6000602082019050818103600083015261450581614019565b9050919050565b600060208201905081810360008301526145258161403c565b9050919050565b6000602082019050818103600083015261454581614082565b9050919050565b60006020820190508181036000830152614565816140a5565b9050919050565b60006020820190508181036000830152614585816140c8565b9050919050565b600060208201905081810360008301526145a5816140eb565b9050919050565b60006020820190506145c1600083018461410e565b92915050565b60006145d16145e2565b90506145dd8282614939565b919050565b6000604051905090565b600067ffffffffffffffff82111561460757614606614acf565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561463357614632614acf565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561465f5761465e614acf565b5b61466882614b17565b9050602081019050919050565b600067ffffffffffffffff8211156146905761468f614acf565b5b61469982614b17565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006146ff82614885565b915061470a83614885565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561473f5761473e6149e4565b5b828201905092915050565b600061475582614885565b915061476083614885565b9250826147705761476f614a13565b5b828204905092915050565b600061478682614885565b915061479183614885565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147ca576147c96149e4565b5b828202905092915050565b60006147e082614885565b91506147eb83614885565b9250828210156147fe576147fd6149e4565b5b828203905092915050565b600061481482614865565b9050919050565b600061482682614865565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061489a826148a1565b9050919050565b60006148ac826148b3565b9050919050565b60006148be82614865565b9050919050565b82818337600083830152505050565b60005b838110156148f25780820151818401526020810190506148d7565b83811115614901576000848401525b50505050565b6000600282049050600182168061491f57607f821691505b6020821081141561493357614932614a42565b5b50919050565b61494282614b17565b810181811067ffffffffffffffff8211171561496157614960614acf565b5b80604052505050565b600061497582614885565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156149a8576149a76149e4565b5b600182019050919050565b60006149be82614885565b91506149c983614885565b9250826149d9576149d8614a13565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f6c656e67746873206d757374206d617463680000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d757365756d3a2073616c65206973206e6f7420616374697665000000000000600082015250565b7f4d757365756d3a206d696e74696e6720746f6f206d616e790000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d757365756d3a206d7573742073656e6420636f72726563742045544820616d60008201527f6f756e7400000000000000000000000000000000000000000000000000000000602082015250565b7f4d757365756d3a2065786365656473206d617820737570706c79000000000000600082015250565b61523381614809565b811461523e57600080fd5b50565b61524a8161481b565b811461525557600080fd5b50565b6152618161482d565b811461526c57600080fd5b50565b61527881614839565b811461528357600080fd5b50565b61528f81614885565b811461529a57600080fd5b5056fea264697066735822122013445169fcd8d99ee25a01c1fc28e5de40b527a8d9686bcf26d7b51f6cda4cae64736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000800000000000000000000000048f9dca3a262bb64fa08dc66b007a894e0d9bb82000000000000000000000000fb1e5420041f83623f166612686b53e9a3ccd9b10000000000000000000000006d40c146fa3bfe12032e325203b848261895743e00000000000000000000000064ae35c67ea7075f5897a789c0a5bbc97765c43d0000000000000000000000004956289e64be9ddedb69ab941dc3385a4e29b8a70000000000000000000000007fcebd09a8c129ad05388db461173172bbbee5290000000000000000000000009d60432ae5735bca207399e3aeb21dba47b67656000000000000000000000000997b8e4dd410de46277a2a7050e0ed501ba24f7500000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000003

-----Decoded View---------------
Arg [0] : payees (address[]): 0x48F9DCA3a262bb64fa08DC66B007A894e0D9bb82,0xfB1e5420041f83623f166612686B53e9A3cCD9B1,0x6D40C146Fa3bFe12032e325203B848261895743e,0x64AE35c67ea7075f5897a789c0A5Bbc97765c43D,0x4956289E64BE9ddEDB69aB941dC3385A4E29b8a7,0x7fceBd09a8c129Ad05388Db461173172bBbee529,0x9d60432Ae5735Bca207399e3AeB21DBa47B67656,0x997B8E4DD410DE46277A2a7050E0ED501bA24F75
Arg [1] : shares (uint256[]): 40,26,8,8,5,5,5,3

-----Encoded View---------------
20 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [3] : 00000000000000000000000048f9dca3a262bb64fa08dc66b007a894e0d9bb82
Arg [4] : 000000000000000000000000fb1e5420041f83623f166612686b53e9a3ccd9b1
Arg [5] : 0000000000000000000000006d40c146fa3bfe12032e325203b848261895743e
Arg [6] : 00000000000000000000000064ae35c67ea7075f5897a789c0a5bbc97765c43d
Arg [7] : 0000000000000000000000004956289e64be9ddedb69ab941dc3385a4e29b8a7
Arg [8] : 0000000000000000000000007fcebd09a8c129ad05388db461173172bbbee529
Arg [9] : 0000000000000000000000009d60432ae5735bca207399e3aeb21dba47b67656
Arg [10] : 000000000000000000000000997b8e4dd410de46277a2a7050e0ed501ba24f75
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000028
Arg [13] : 000000000000000000000000000000000000000000000000000000000000001a
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000003


Deployed Bytecode Sourcemap

55830:4082:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23471:40;23487:12;:10;:12::i;:::-;23501:9;23471:40;;;;;;;:::i;:::-;;;;;;;;55830:4082;;;;;49632:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37763:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57915:481;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39230:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38760:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50285:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24677:611;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56480:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40120:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49953:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56075:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23602:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57490:419;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40496:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56033:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50475:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59492:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37457:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37187:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12075:148;;;;;;;;;;;;;:::i;:::-;;59698:91;;;;;;;;;;;;;:::i;:::-;;24377:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11424:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37932:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24177:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58402:1084;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39523:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40718:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38107:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23973:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56403:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23787:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39889:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56932:552;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12378:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59795:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9929:98;9982:7;10009:10;10002:17;;9929:98;:::o;49632:237::-;49734:4;49773:35;49758:50;;;:11;:50;;;;:103;;;;49825:36;49849:11;49825:23;:36::i;:::-;49758:103;49751:110;;49632:237;;;:::o;37763:100::-;37817:13;37850:5;37843:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37763:100;:::o;57915:481::-;57982:7;56517:10;58002:15;:29;57998:393;;58053:7;:17;58061:8;58053:17;;;;;;;;;;;;;;;;58049:1;:21;;;;:::i;:::-;58042:28;;;;57998:393;58121:1;58088:20;:30;58109:8;58088:30;;;;;;;;;;;;;;;;:34;58084:307;;;58140:20;:30;58161:8;58140:30;;;;;;;;;;;;;;;;58133:37;;;;58084:307;58216:1;58188:15;:25;58204:8;58188:25;;;;;;;;;;;;;;;;:29;58184:207;;;58235:15;:25;58251:8;58235:25;;;;;;;;;;;;;;;;58228:32;;;;58184:207;58307:1;58278:16;:26;58295:8;58278:26;;;;;;;;;;;;;;;;:30;58274:117;;;58326:16;:26;58343:8;58326:26;;;;;;;;;;;;;;;;58319:33;;;;58274:117;58382:1;58375:8;;57915:481;;;;:::o;39230:221::-;39306:7;39334:16;39342:7;39334;:16::i;:::-;39326:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39419:15;:24;39435:7;39419:24;;;;;;;;;;;;;;;;;;;;;39412:31;;39230:221;;;:::o;38760:404::-;38841:13;38857:23;38872:7;38857:14;:23::i;:::-;38841:39;;38905:5;38899:11;;:2;:11;;;;38891:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;38985:5;38969:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;38994:44;39018:5;39025:12;:10;:12::i;:::-;38994:23;:44::i;:::-;38969:69;38961:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;39135:21;39144:2;39148:7;39135:8;:21::i;:::-;38830:334;38760:404;;:::o;50285:113::-;50346:7;50373:10;:17;;;;50366:24;;50285:113;:::o;24677:611::-;24772:1;24753:7;:16;24761:7;24753:16;;;;;;;;;;;;;;;;:20;24745:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24829:21;24877:14;;24853:21;:38;;;;:::i;:::-;24829:62;;24902:15;24970:9;:18;24980:7;24970:18;;;;;;;;;;;;;;;;24955:12;;24936:7;:16;24944:7;24936:16;;;;;;;;;;;;;;;;24920:13;:32;;;;:::i;:::-;:47;;;;:::i;:::-;:68;;;;:::i;:::-;24902:86;;25020:1;25009:7;:12;;25001:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25124:7;25103:9;:18;25113:7;25103:18;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;25082:9;:18;25092:7;25082:18;;;;;;;;;;;;;;;:49;;;;25176:7;25159:14;;:24;;;;:::i;:::-;25142:14;:41;;;;25196:35;25214:7;25223;25196:17;:35::i;:::-;25247:33;25263:7;25272;25247:33;;;;;;;:::i;:::-;;;;;;;;24734:554;;24677:611;:::o;56480:47::-;56517:10;56480:47;:::o;40120:305::-;40281:41;40300:12;:10;:12::i;:::-;40314:7;40281:18;:41::i;:::-;40273:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;40389:28;40399:4;40405:2;40409:7;40389:9;:28::i;:::-;40120:305;;;:::o;49953:256::-;50050:7;50086:23;50103:5;50086:16;:23::i;:::-;50078:5;:31;50070:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;50175:12;:19;50188:5;50175:19;;;;;;;;;;;;;;;:26;50195:5;50175:26;;;;;;;;;;;;50168:33;;49953:256;;;;:::o;56075:41::-;56112:4;56075:41;:::o;23602:91::-;23646:7;23673:12;;23666:19;;23602:91;:::o;57490:419::-;57547:7;56517:10;57567:15;:29;57563:341;;57614:9;57607:16;;;;57563:341;57674:1;57641:20;:30;57662:8;57641:30;;;;;;;;;;;;;;;;:34;57637:267;;;57693:11;57686:18;;;;57637:267;57750:1;57722:15;:25;57738:8;57722:25;;;;;;;;;;;;;;;;:29;57718:186;;;57769:11;57762:18;;;;57718:186;57827:1;57798:16;:26;57815:8;57798:26;;;;;;;;;;;;;;;;:30;57794:110;;;57846:11;57839:18;;;;57794:110;57887:9;57880:16;;57490:419;;;;:::o;40496:151::-;40600:39;40617:4;40623:2;40627:7;40600:39;;;;;;;;;;;;:16;:39::i;:::-;40496:151;;;:::o;56033:35::-;;;;;;;;;;;;;:::o;50475:233::-;50550:7;50586:30;:28;:30::i;:::-;50578:5;:38;50570:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;50683:10;50694:5;50683:17;;;;;;;;:::i;:::-;;;;;;;;;;50676:24;;50475:233;;;:::o;59492:91::-;11655:12;:10;:12::i;:::-;11644:23;;:7;:5;:7::i;:::-;:23;;;11636:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59570:7:::1;59559:8;:18;;;;;;;;;;;;:::i;:::-;;59492:91:::0;:::o;37457:239::-;37529:7;37549:13;37565:7;:16;37573:7;37565:16;;;;;;;;;;;;;;;;;;;;;37549:32;;37617:1;37600:19;;:5;:19;;;;37592:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37683:5;37676:12;;;37457:239;;;:::o;37187:208::-;37259:7;37304:1;37287:19;;:5;:19;;;;37279:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;37371:9;:16;37381:5;37371:16;;;;;;;;;;;;;;;;37364:23;;37187:208;;;:::o;12075:148::-;11655:12;:10;:12::i;:::-;11644:23;;:7;:5;:7::i;:::-;:23;;;11636:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12182:1:::1;12145:40;;12166:6;;;;;;;;;;;12145:40;;;;;;;;;;;;12213:1;12196:6;;:19;;;;;;;;;;;;;;;;;;12075:148::o:0;59698:91::-;11655:12;:10;:12::i;:::-;11644:23;;:7;:5;:7::i;:::-;:23;;;11636:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59767:16:::1;;;;;;;;;;;59766:17;59747:16;;:36;;;;;;;;;;;;;;;;;;59698:91::o:0;24377:100::-;24428:7;24455;24463:5;24455:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24448:21;;24377:100;;;:::o;11424:87::-;11470:7;11497:6;;;;;;;;;;;11490:13;;11424:87;:::o;37932:104::-;37988:13;38021:7;38014:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37932:104;:::o;24177:109::-;24233:7;24260:9;:18;24270:7;24260:18;;;;;;;;;;;;;;;;24253:25;;24177:109;;;:::o;58402:1084::-;58462:16;;;;;;;;;;;:52;;;;;56443:10;58482:15;:32;;58462:52;58454:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;58570:30;58589:10;58570:18;:30::i;:::-;58560:6;:40;;58552:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;56112:4;58657:6;58644:10;;:19;;;;:::i;:::-;:33;;58636:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;58756:9;58732:20;58741:10;58732:8;:20::i;:::-;58723:6;:29;;;;:::i;:::-;:42;58715:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;58820:6;58815:122;58836:6;58832:1;:10;58815:122;;;58864:29;58870:10;58882;;58864:5;:29::i;:::-;58928:1;58915:10;;:14;;;;:::i;:::-;58902:10;:27;;;;58844:3;;;;;:::i;:::-;;;;58815:122;;;;56517:10;58949:15;:29;58945:498;;59033:6;59011:7;:19;59019:10;59011:19;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;58989:7;:19;58997:10;58989:19;;;;;;;;;;;;;;;:50;;;;58945:498;;;59092:1;59057:20;:32;59078:10;59057:32;;;;;;;;;;;;;;;;:36;59053:390;;;59174:6;59139:20;:32;59160:10;59139:32;;;;;;;;;;;;;;;;:41;;;;:::i;:::-;59104:20;:32;59125:10;59104:32;;;;;;;;;;;;;;;:76;;;;59053:390;;;59228:1;59198:15;:27;59214:10;59198:27;;;;;;;;;;;;;;;;:31;59194:249;;;59300:6;59270:15;:27;59286:10;59270:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;59240:15;:27;59256:10;59240:27;;;;;;;;;;;;;;;:66;;;;59194:249;;;59355:1;59324:16;:28;59341:10;59324:28;;;;;;;;;;;;;;;;:32;59320:123;;;59429:6;59398:16;:28;59415:10;59398:28;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;59367:16;:28;59384:10;59367:28;;;;;;;;;;;;;;;:68;;;;59320:123;59194:249;59053:390;58945:498;59456:24;59461:10;59473:6;59456:24;;;;;;;:::i;:::-;;;;;;;;58402:1084;:::o;39523:295::-;39638:12;:10;:12::i;:::-;39626:24;;:8;:24;;;;39618:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;39738:8;39693:18;:32;39712:12;:10;:12::i;:::-;39693:32;;;;;;;;;;;;;;;:42;39726:8;39693:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;39791:8;39762:48;;39777:12;:10;:12::i;:::-;39762:48;;;39801:8;39762:48;;;;;;:::i;:::-;;;;;;;;39523:295;;:::o;40718:285::-;40850:41;40869:12;:10;:12::i;:::-;40883:7;40850:18;:41::i;:::-;40842:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;40956:39;40970:4;40976:2;40980:7;40989:5;40956:13;:39::i;:::-;40718:285;;;;:::o;38107:360::-;38180:13;38214:16;38222:7;38214;:16::i;:::-;38206:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;38295:21;38319:10;:8;:10::i;:::-;38295:34;;38371:1;38353:7;38347:21;:25;:112;;;;;;;;;;;;;;;;;38412:7;38421:18;:7;:16;:18::i;:::-;38395:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38347:112;38340:119;;;38107:360;;;:::o;23973:105::-;24027:7;24054;:16;24062:7;24054:16;;;;;;;;;;;;;;;;24047:23;;23973:105;;;:::o;56403:50::-;56443:10;56403:50;:::o;23787:95::-;23833:7;23860:14;;23853:21;;23787:95;:::o;39889:164::-;39986:4;40010:18;:25;40029:5;40010:25;;;;;;;;;;;;;;;:35;40036:8;40010:35;;;;;;;;;;;;;;;;;;;;;;;;;40003:42;;39889:164;;;;:::o;56932:552::-;11655:12;:10;:12::i;:::-;11644:23;;:7;:5;:7::i;:::-;:23;;;11636:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57066:9:::1;:16;57045:10;:17;:37;57037:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57117:6;57112:367;57133:10;:17;57129:1;:21;57112:367;;;57166:16;57185:10;57196:1;57185:13;;;;;;;;:::i;:::-;;;;;;;;57166:32;;57207:16;57226:9;57236:1;57226:12;;;;;;;;:::i;:::-;;;;;;;;57207:31;;57263:1;57251:8;:13;57247:225;;57310:1;57277:20;:30;57298:8;57277:30;;;;;;;;;;;;;;;:34;;;;57247:225;;;57343:1;57331:8;:13;57327:145;;;57385:1;57357:15;:25;57373:8;57357:25;;;;;;;;;;;;;;;:29;;;;57327:145;;;57418:1;57406:8;:13;57402:70;;;57461:1;57432:16;:26;57449:8;57432:26;;;;;;;;;;;;;;;:30;;;;57402:70;57327:145;57247:225;57157:322;;57152:3;;;;;:::i;:::-;;;;57112:367;;;;56932:552:::0;;:::o;12378:244::-;11655:12;:10;:12::i;:::-;11644:23;;:7;:5;:7::i;:::-;:23;;;11636:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12487:1:::1;12467:22;;:8;:22;;;;12459:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12577:8;12548:38;;12569:6;;;;;;;;;;;12548:38;;;;;;;;;;;;12606:8;12597:6;;:17;;;;;;;;;;;;;;;;;;12378:244:::0;:::o;59795:114::-;11655:12;:10;:12::i;:::-;11644:23;;:7;:5;:7::i;:::-;:23;;;11636:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59878:7:::1;59870:25;;:33;59896:6;59870:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;59795:114:::0;;:::o;48549:93::-;;;;:::o;36831:292::-;36933:4;36972:25;36957:40;;;:11;:40;;;;:105;;;;37029:33;37014:48;;;:11;:48;;;;36957:105;:158;;;;37079:36;37103:11;37079:23;:36::i;:::-;36957:158;36950:165;;36831:292;;;:::o;42470:127::-;42535:4;42587:1;42559:30;;:7;:16;42567:7;42559:16;;;;;;;;;;;;;;;;;;;;;:30;;;;42552:37;;42470:127;;;:::o;46354:174::-;46456:2;46429:15;:24;46445:7;46429:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;46512:7;46508:2;46474:46;;46483:23;46498:7;46483:14;:23::i;:::-;46474:46;;;;;;;;;;;;46354:174;;:::o;14805:397::-;14920:6;14895:21;:31;;14887:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15052:12;15070:9;:14;;15093:6;15070:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15051:54;;;15124:7;15116:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;14876:326;14805:397;;:::o;42764:355::-;42857:4;42882:16;42890:7;42882;:16::i;:::-;42874:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42958:13;42974:23;42989:7;42974:14;:23::i;:::-;42958:39;;43027:5;43016:16;;:7;:16;;;:51;;;;43060:7;43036:31;;:20;43048:7;43036:11;:20::i;:::-;:31;;;43016:51;:94;;;;43071:39;43095:5;43102:7;43071:23;:39::i;:::-;43016:94;43008:103;;;42764:355;;;;:::o;45692:544::-;45817:4;45790:31;;:23;45805:7;45790:14;:23::i;:::-;:31;;;45782:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;45900:1;45886:16;;:2;:16;;;;45878:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45956:39;45977:4;45983:2;45987:7;45956:20;:39::i;:::-;46060:29;46077:1;46081:7;46060:8;:29::i;:::-;46121:1;46102:9;:15;46112:4;46102:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;46150:1;46133:9;:13;46143:2;46133:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;46181:2;46162:7;:16;46170:7;46162:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;46220:7;46216:2;46201:27;;46210:4;46201:27;;;;;;;;;;;;45692:544;;;:::o;44384:382::-;44478:1;44464:16;;:2;:16;;;;44456:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;44537:16;44545:7;44537;:16::i;:::-;44536:17;44528:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44599:45;44628:1;44632:2;44636:7;44599:20;:45::i;:::-;44674:1;44657:9;:13;44667:2;44657:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;44705:2;44686:7;:16;44694:7;44686:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44750:7;44746:2;44725:33;;44742:1;44725:33;;;;;;;;;;;;44384:382;;:::o;41885:272::-;41999:28;42009:4;42015:2;42019:7;41999:9;:28::i;:::-;42046:48;42069:4;42075:2;42079:7;42088:5;42046:22;:48::i;:::-;42038:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;41885:272;;;;:::o;59589:103::-;59649:13;59678:8;59671:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59589:103;:::o;7495:723::-;7551:13;7781:1;7772:5;:10;7768:53;;;7799:10;;;;;;;;;;;;;;;;;;;;;7768:53;7831:12;7846:5;7831:20;;7862:14;7887:78;7902:1;7894:4;:9;7887:78;;7920:8;;;;;:::i;:::-;;;;7951:2;7943:10;;;;;:::i;:::-;;;7887:78;;;7975:19;8007:6;7997:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7975:39;;8025:154;8041:1;8032:5;:10;8025:154;;8069:1;8059:11;;;;;:::i;:::-;;;8136:2;8128:5;:10;;;;:::i;:::-;8115:2;:24;;;;:::i;:::-;8102:39;;8085:6;8092;8085:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8165:2;8156:11;;;;;:::i;:::-;;;8025:154;;;8203:6;8189:21;;;;;7495:723;;;;:::o;28685:157::-;28770:4;28809:25;28794:40;;;:11;:40;;;;28787:47;;28685:157;;;:::o;51321:555::-;51431:45;51458:4;51464:2;51468:7;51431:26;:45::i;:::-;51509:1;51493:18;;:4;:18;;;51489:187;;;51528:40;51560:7;51528:31;:40::i;:::-;51489:187;;;51598:2;51590:10;;:4;:10;;;51586:90;;51617:47;51650:4;51656:7;51617:32;:47::i;:::-;51586:90;51489:187;51704:1;51690:16;;:2;:16;;;51686:183;;;51723:45;51760:7;51723:36;:45::i;:::-;51686:183;;;51796:4;51790:10;;:2;:10;;;51786:83;;51817:40;51845:2;51849:7;51817:27;:40::i;:::-;51786:83;51686:183;51321:555;;;:::o;47093:843::-;47214:4;47240:15;:2;:13;;;:15::i;:::-;47236:693;;;47292:2;47276:36;;;47313:12;:10;:12::i;:::-;47327:4;47333:7;47342:5;47276:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47272:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47539:1;47522:6;:13;:18;47518:341;;;47565:60;;;;;;;;;;:::i;:::-;;;;;;;;47518:341;47809:6;47803:13;47794:6;47790:2;47786:15;47779:38;47272:602;47409:45;;;47399:55;;;:6;:55;;;;47392:62;;;;;47236:693;47913:4;47906:11;;47093:843;;;;;;;:::o;52599:164::-;52703:10;:17;;;;52676:15;:24;52692:7;52676:24;;;;;;;;;;;:44;;;;52731:10;52747:7;52731:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52599:164;:::o;53390:988::-;53656:22;53706:1;53681:22;53698:4;53681:16;:22::i;:::-;:26;;;;:::i;:::-;53656:51;;53718:18;53739:17;:26;53757:7;53739:26;;;;;;;;;;;;53718:47;;53886:14;53872:10;:28;53868:328;;53917:19;53939:12;:18;53952:4;53939:18;;;;;;;;;;;;;;;:34;53958:14;53939:34;;;;;;;;;;;;53917:56;;54023:11;53990:12;:18;54003:4;53990:18;;;;;;;;;;;;;;;:30;54009:10;53990:30;;;;;;;;;;;:44;;;;54140:10;54107:17;:30;54125:11;54107:30;;;;;;;;;;;:43;;;;53902:294;53868:328;54292:17;:26;54310:7;54292:26;;;;;;;;;;;54285:33;;;54336:12;:18;54349:4;54336:18;;;;;;;;;;;;;;;:34;54355:14;54336:34;;;;;;;;;;;54329:41;;;53471:907;;53390:988;;:::o;54673:1079::-;54926:22;54971:1;54951:10;:17;;;;:21;;;;:::i;:::-;54926:46;;54983:18;55004:15;:24;55020:7;55004:24;;;;;;;;;;;;54983:45;;55355:19;55377:10;55388:14;55377:26;;;;;;;;:::i;:::-;;;;;;;;;;55355:48;;55441:11;55416:10;55427;55416:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;55552:10;55521:15;:28;55537:11;55521:28;;;;;;;;;;;:41;;;;55693:15;:24;55709:7;55693:24;;;;;;;;;;;55686:31;;;55728:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54744:1008;;;54673:1079;:::o;52177:221::-;52262:14;52279:20;52296:2;52279:16;:20::i;:::-;52262:37;;52337:7;52310:12;:16;52323:2;52310:16;;;;;;;;;;;;;;;:24;52327:6;52310:24;;;;;;;;;;;:34;;;;52384:6;52355:17;:26;52373:7;52355:26;;;;;;;;;;;:35;;;;52251:147;52177:221;;:::o;13448:422::-;13508:4;13716:12;13827:7;13815:20;13807:28;;13861:1;13854:4;:8;13847:15;;;13448:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2476:155::-;2530:5;2568:6;2555:20;2546:29;;2584:41;2619:5;2584:41;:::i;:::-;2476:155;;;;:::o;2654:370::-;2725:5;2774:3;2767:4;2759:6;2755:17;2751:27;2741:122;;2782:79;;:::i;:::-;2741:122;2899:6;2886:20;2924:94;3014:3;3006:6;2999:4;2991:6;2987:17;2924:94;:::i;:::-;2915:103;;2731:293;2654:370;;;;:::o;3047:::-;3118:5;3167:3;3160:4;3152:6;3148:17;3144:27;3134:122;;3175:79;;:::i;:::-;3134:122;3292:6;3279:20;3317:94;3407:3;3399:6;3392:4;3384:6;3380:17;3317:94;:::i;:::-;3308:103;;3124:293;3047:370;;;;:::o;3423:133::-;3466:5;3504:6;3491:20;3482:29;;3520:30;3544:5;3520:30;:::i;:::-;3423:133;;;;:::o;3562:137::-;3607:5;3645:6;3632:20;3623:29;;3661:32;3687:5;3661:32;:::i;:::-;3562:137;;;;:::o;3705:141::-;3761:5;3792:6;3786:13;3777:22;;3808:32;3834:5;3808:32;:::i;:::-;3705:141;;;;:::o;3865:338::-;3920:5;3969:3;3962:4;3954:6;3950:17;3946:27;3936:122;;3977:79;;:::i;:::-;3936:122;4094:6;4081:20;4119:78;4193:3;4185:6;4178:4;4170:6;4166:17;4119:78;:::i;:::-;4110:87;;3926:277;3865:338;;;;:::o;4223:340::-;4279:5;4328:3;4321:4;4313:6;4309:17;4305:27;4295:122;;4336:79;;:::i;:::-;4295:122;4453:6;4440:20;4478:79;4553:3;4545:6;4538:4;4530:6;4526:17;4478:79;:::i;:::-;4469:88;;4285:278;4223:340;;;;:::o;4569:139::-;4615:5;4653:6;4640:20;4631:29;;4669:33;4696:5;4669:33;:::i;:::-;4569:139;;;;:::o;4714:329::-;4773:6;4822:2;4810:9;4801:7;4797:23;4793:32;4790:119;;;4828:79;;:::i;:::-;4790:119;4948:1;4973:53;5018:7;5009:6;4998:9;4994:22;4973:53;:::i;:::-;4963:63;;4919:117;4714:329;;;;:::o;5049:345::-;5116:6;5165:2;5153:9;5144:7;5140:23;5136:32;5133:119;;;5171:79;;:::i;:::-;5133:119;5291:1;5316:61;5369:7;5360:6;5349:9;5345:22;5316:61;:::i;:::-;5306:71;;5262:125;5049:345;;;;:::o;5400:474::-;5468:6;5476;5525:2;5513:9;5504:7;5500:23;5496:32;5493:119;;;5531:79;;:::i;:::-;5493:119;5651:1;5676:53;5721:7;5712:6;5701:9;5697:22;5676:53;:::i;:::-;5666:63;;5622:117;5778:2;5804:53;5849:7;5840:6;5829:9;5825:22;5804:53;:::i;:::-;5794:63;;5749:118;5400:474;;;;;:::o;5880:619::-;5957:6;5965;5973;6022:2;6010:9;6001:7;5997:23;5993:32;5990:119;;;6028:79;;:::i;:::-;5990:119;6148:1;6173:53;6218:7;6209:6;6198:9;6194:22;6173:53;:::i;:::-;6163:63;;6119:117;6275:2;6301:53;6346:7;6337:6;6326:9;6322:22;6301:53;:::i;:::-;6291:63;;6246:118;6403:2;6429:53;6474:7;6465:6;6454:9;6450:22;6429:53;:::i;:::-;6419:63;;6374:118;5880:619;;;;;:::o;6505:943::-;6600:6;6608;6616;6624;6673:3;6661:9;6652:7;6648:23;6644:33;6641:120;;;6680:79;;:::i;:::-;6641:120;6800:1;6825:53;6870:7;6861:6;6850:9;6846:22;6825:53;:::i;:::-;6815:63;;6771:117;6927:2;6953:53;6998:7;6989:6;6978:9;6974:22;6953:53;:::i;:::-;6943:63;;6898:118;7055:2;7081:53;7126:7;7117:6;7106:9;7102:22;7081:53;:::i;:::-;7071:63;;7026:118;7211:2;7200:9;7196:18;7183:32;7242:18;7234:6;7231:30;7228:117;;;7264:79;;:::i;:::-;7228:117;7369:62;7423:7;7414:6;7403:9;7399:22;7369:62;:::i;:::-;7359:72;;7154:287;6505:943;;;;;;;:::o;7454:468::-;7519:6;7527;7576:2;7564:9;7555:7;7551:23;7547:32;7544:119;;;7582:79;;:::i;:::-;7544:119;7702:1;7727:53;7772:7;7763:6;7752:9;7748:22;7727:53;:::i;:::-;7717:63;;7673:117;7829:2;7855:50;7897:7;7888:6;7877:9;7873:22;7855:50;:::i;:::-;7845:60;;7800:115;7454:468;;;;;:::o;7928:474::-;7996:6;8004;8053:2;8041:9;8032:7;8028:23;8024:32;8021:119;;;8059:79;;:::i;:::-;8021:119;8179:1;8204:53;8249:7;8240:6;8229:9;8225:22;8204:53;:::i;:::-;8194:63;;8150:117;8306:2;8332:53;8377:7;8368:6;8357:9;8353:22;8332:53;:::i;:::-;8322:63;;8277:118;7928:474;;;;;:::o;8408:894::-;8526:6;8534;8583:2;8571:9;8562:7;8558:23;8554:32;8551:119;;;8589:79;;:::i;:::-;8551:119;8737:1;8726:9;8722:17;8709:31;8767:18;8759:6;8756:30;8753:117;;;8789:79;;:::i;:::-;8753:117;8894:78;8964:7;8955:6;8944:9;8940:22;8894:78;:::i;:::-;8884:88;;8680:302;9049:2;9038:9;9034:18;9021:32;9080:18;9072:6;9069:30;9066:117;;;9102:79;;:::i;:::-;9066:117;9207:78;9277:7;9268:6;9257:9;9253:22;9207:78;:::i;:::-;9197:88;;8992:303;8408:894;;;;;:::o;9308:327::-;9366:6;9415:2;9403:9;9394:7;9390:23;9386:32;9383:119;;;9421:79;;:::i;:::-;9383:119;9541:1;9566:52;9610:7;9601:6;9590:9;9586:22;9566:52;:::i;:::-;9556:62;;9512:116;9308:327;;;;:::o;9641:349::-;9710:6;9759:2;9747:9;9738:7;9734:23;9730:32;9727:119;;;9765:79;;:::i;:::-;9727:119;9885:1;9910:63;9965:7;9956:6;9945:9;9941:22;9910:63;:::i;:::-;9900:73;;9856:127;9641:349;;;;:::o;9996:509::-;10065:6;10114:2;10102:9;10093:7;10089:23;10085:32;10082:119;;;10120:79;;:::i;:::-;10082:119;10268:1;10257:9;10253:17;10240:31;10298:18;10290:6;10287:30;10284:117;;;10320:79;;:::i;:::-;10284:117;10425:63;10480:7;10471:6;10460:9;10456:22;10425:63;:::i;:::-;10415:73;;10211:287;9996:509;;;;:::o;10511:329::-;10570:6;10619:2;10607:9;10598:7;10594:23;10590:32;10587:119;;;10625:79;;:::i;:::-;10587:119;10745:1;10770:53;10815:7;10806:6;10795:9;10791:22;10770:53;:::i;:::-;10760:63;;10716:117;10511:329;;;;:::o;10846:147::-;10941:45;10980:5;10941:45;:::i;:::-;10936:3;10929:58;10846:147;;:::o;10999:118::-;11086:24;11104:5;11086:24;:::i;:::-;11081:3;11074:37;10999:118;;:::o;11123:109::-;11204:21;11219:5;11204:21;:::i;:::-;11199:3;11192:34;11123:109;;:::o;11238:360::-;11324:3;11352:38;11384:5;11352:38;:::i;:::-;11406:70;11469:6;11464:3;11406:70;:::i;:::-;11399:77;;11485:52;11530:6;11525:3;11518:4;11511:5;11507:16;11485:52;:::i;:::-;11562:29;11584:6;11562:29;:::i;:::-;11557:3;11553:39;11546:46;;11328:270;11238:360;;;;:::o;11604:364::-;11692:3;11720:39;11753:5;11720:39;:::i;:::-;11775:71;11839:6;11834:3;11775:71;:::i;:::-;11768:78;;11855:52;11900:6;11895:3;11888:4;11881:5;11877:16;11855:52;:::i;:::-;11932:29;11954:6;11932:29;:::i;:::-;11927:3;11923:39;11916:46;;11696:272;11604:364;;;;:::o;11974:377::-;12080:3;12108:39;12141:5;12108:39;:::i;:::-;12163:89;12245:6;12240:3;12163:89;:::i;:::-;12156:96;;12261:52;12306:6;12301:3;12294:4;12287:5;12283:16;12261:52;:::i;:::-;12338:6;12333:3;12329:16;12322:23;;12084:267;11974:377;;;;:::o;12357:366::-;12499:3;12520:67;12584:2;12579:3;12520:67;:::i;:::-;12513:74;;12596:93;12685:3;12596:93;:::i;:::-;12714:2;12709:3;12705:12;12698:19;;12357:366;;;:::o;12729:::-;12871:3;12892:67;12956:2;12951:3;12892:67;:::i;:::-;12885:74;;12968:93;13057:3;12968:93;:::i;:::-;13086:2;13081:3;13077:12;13070:19;;12729:366;;;:::o;13101:::-;13243:3;13264:67;13328:2;13323:3;13264:67;:::i;:::-;13257:74;;13340:93;13429:3;13340:93;:::i;:::-;13458:2;13453:3;13449:12;13442:19;;13101:366;;;:::o;13473:::-;13615:3;13636:67;13700:2;13695:3;13636:67;:::i;:::-;13629:74;;13712:93;13801:3;13712:93;:::i;:::-;13830:2;13825:3;13821:12;13814:19;;13473:366;;;:::o;13845:::-;13987:3;14008:67;14072:2;14067:3;14008:67;:::i;:::-;14001:74;;14084:93;14173:3;14084:93;:::i;:::-;14202:2;14197:3;14193:12;14186:19;;13845:366;;;:::o;14217:::-;14359:3;14380:67;14444:2;14439:3;14380:67;:::i;:::-;14373:74;;14456:93;14545:3;14456:93;:::i;:::-;14574:2;14569:3;14565:12;14558:19;;14217:366;;;:::o;14589:::-;14731:3;14752:67;14816:2;14811:3;14752:67;:::i;:::-;14745:74;;14828:93;14917:3;14828:93;:::i;:::-;14946:2;14941:3;14937:12;14930:19;;14589:366;;;:::o;14961:::-;15103:3;15124:67;15188:2;15183:3;15124:67;:::i;:::-;15117:74;;15200:93;15289:3;15200:93;:::i;:::-;15318:2;15313:3;15309:12;15302:19;;14961:366;;;:::o;15333:::-;15475:3;15496:67;15560:2;15555:3;15496:67;:::i;:::-;15489:74;;15572:93;15661:3;15572:93;:::i;:::-;15690:2;15685:3;15681:12;15674:19;;15333:366;;;:::o;15705:::-;15847:3;15868:67;15932:2;15927:3;15868:67;:::i;:::-;15861:74;;15944:93;16033:3;15944:93;:::i;:::-;16062:2;16057:3;16053:12;16046:19;;15705:366;;;:::o;16077:::-;16219:3;16240:67;16304:2;16299:3;16240:67;:::i;:::-;16233:74;;16316:93;16405:3;16316:93;:::i;:::-;16434:2;16429:3;16425:12;16418:19;;16077:366;;;:::o;16449:::-;16591:3;16612:67;16676:2;16671:3;16612:67;:::i;:::-;16605:74;;16688:93;16777:3;16688:93;:::i;:::-;16806:2;16801:3;16797:12;16790:19;;16449:366;;;:::o;16821:::-;16963:3;16984:67;17048:2;17043:3;16984:67;:::i;:::-;16977:74;;17060:93;17149:3;17060:93;:::i;:::-;17178:2;17173:3;17169:12;17162:19;;16821:366;;;:::o;17193:::-;17335:3;17356:67;17420:2;17415:3;17356:67;:::i;:::-;17349:74;;17432:93;17521:3;17432:93;:::i;:::-;17550:2;17545:3;17541:12;17534:19;;17193:366;;;:::o;17565:::-;17707:3;17728:67;17792:2;17787:3;17728:67;:::i;:::-;17721:74;;17804:93;17893:3;17804:93;:::i;:::-;17922:2;17917:3;17913:12;17906:19;;17565:366;;;:::o;17937:::-;18079:3;18100:67;18164:2;18159:3;18100:67;:::i;:::-;18093:74;;18176:93;18265:3;18176:93;:::i;:::-;18294:2;18289:3;18285:12;18278:19;;17937:366;;;:::o;18309:::-;18451:3;18472:67;18536:2;18531:3;18472:67;:::i;:::-;18465:74;;18548:93;18637:3;18548:93;:::i;:::-;18666:2;18661:3;18657:12;18650:19;;18309:366;;;:::o;18681:::-;18823:3;18844:67;18908:2;18903:3;18844:67;:::i;:::-;18837:74;;18920:93;19009:3;18920:93;:::i;:::-;19038:2;19033:3;19029:12;19022:19;;18681:366;;;:::o;19053:::-;19195:3;19216:67;19280:2;19275:3;19216:67;:::i;:::-;19209:74;;19292:93;19381:3;19292:93;:::i;:::-;19410:2;19405:3;19401:12;19394:19;;19053:366;;;:::o;19425:::-;19567:3;19588:67;19652:2;19647:3;19588:67;:::i;:::-;19581:74;;19664:93;19753:3;19664:93;:::i;:::-;19782:2;19777:3;19773:12;19766:19;;19425:366;;;:::o;19797:::-;19939:3;19960:67;20024:2;20019:3;19960:67;:::i;:::-;19953:74;;20036:93;20125:3;20036:93;:::i;:::-;20154:2;20149:3;20145:12;20138:19;;19797:366;;;:::o;20169:::-;20311:3;20332:67;20396:2;20391:3;20332:67;:::i;:::-;20325:74;;20408:93;20497:3;20408:93;:::i;:::-;20526:2;20521:3;20517:12;20510:19;;20169:366;;;:::o;20541:::-;20683:3;20704:67;20768:2;20763:3;20704:67;:::i;:::-;20697:74;;20780:93;20869:3;20780:93;:::i;:::-;20898:2;20893:3;20889:12;20882:19;;20541:366;;;:::o;20913:398::-;21072:3;21093:83;21174:1;21169:3;21093:83;:::i;:::-;21086:90;;21185:93;21274:3;21185:93;:::i;:::-;21303:1;21298:3;21294:11;21287:18;;20913:398;;;:::o;21317:366::-;21459:3;21480:67;21544:2;21539:3;21480:67;:::i;:::-;21473:74;;21556:93;21645:3;21556:93;:::i;:::-;21674:2;21669:3;21665:12;21658:19;;21317:366;;;:::o;21689:::-;21831:3;21852:67;21916:2;21911:3;21852:67;:::i;:::-;21845:74;;21928:93;22017:3;21928:93;:::i;:::-;22046:2;22041:3;22037:12;22030:19;;21689:366;;;:::o;22061:::-;22203:3;22224:67;22288:2;22283:3;22224:67;:::i;:::-;22217:74;;22300:93;22389:3;22300:93;:::i;:::-;22418:2;22413:3;22409:12;22402:19;;22061:366;;;:::o;22433:::-;22575:3;22596:67;22660:2;22655:3;22596:67;:::i;:::-;22589:74;;22672:93;22761:3;22672:93;:::i;:::-;22790:2;22785:3;22781:12;22774:19;;22433:366;;;:::o;22805:118::-;22892:24;22910:5;22892:24;:::i;:::-;22887:3;22880:37;22805:118;;:::o;22929:435::-;23109:3;23131:95;23222:3;23213:6;23131:95;:::i;:::-;23124:102;;23243:95;23334:3;23325:6;23243:95;:::i;:::-;23236:102;;23355:3;23348:10;;22929:435;;;;;:::o;23370:379::-;23554:3;23576:147;23719:3;23576:147;:::i;:::-;23569:154;;23740:3;23733:10;;23370:379;;;:::o;23755:222::-;23848:4;23886:2;23875:9;23871:18;23863:26;;23899:71;23967:1;23956:9;23952:17;23943:6;23899:71;:::i;:::-;23755:222;;;;:::o;23983:348::-;24112:4;24150:2;24139:9;24135:18;24127:26;;24163:79;24239:1;24228:9;24224:17;24215:6;24163:79;:::i;:::-;24252:72;24320:2;24309:9;24305:18;24296:6;24252:72;:::i;:::-;23983:348;;;;;:::o;24337:640::-;24532:4;24570:3;24559:9;24555:19;24547:27;;24584:71;24652:1;24641:9;24637:17;24628:6;24584:71;:::i;:::-;24665:72;24733:2;24722:9;24718:18;24709:6;24665:72;:::i;:::-;24747;24815:2;24804:9;24800:18;24791:6;24747:72;:::i;:::-;24866:9;24860:4;24856:20;24851:2;24840:9;24836:18;24829:48;24894:76;24965:4;24956:6;24894:76;:::i;:::-;24886:84;;24337:640;;;;;;;:::o;24983:332::-;25104:4;25142:2;25131:9;25127:18;25119:26;;25155:71;25223:1;25212:9;25208:17;25199:6;25155:71;:::i;:::-;25236:72;25304:2;25293:9;25289:18;25280:6;25236:72;:::i;:::-;24983:332;;;;;:::o;25321:210::-;25408:4;25446:2;25435:9;25431:18;25423:26;;25459:65;25521:1;25510:9;25506:17;25497:6;25459:65;:::i;:::-;25321:210;;;;:::o;25537:313::-;25650:4;25688:2;25677:9;25673:18;25665:26;;25737:9;25731:4;25727:20;25723:1;25712:9;25708:17;25701:47;25765:78;25838:4;25829:6;25765:78;:::i;:::-;25757:86;;25537:313;;;;:::o;25856:419::-;26022:4;26060:2;26049:9;26045:18;26037:26;;26109:9;26103:4;26099:20;26095:1;26084:9;26080:17;26073:47;26137:131;26263:4;26137:131;:::i;:::-;26129:139;;25856:419;;;:::o;26281:::-;26447:4;26485:2;26474:9;26470:18;26462:26;;26534:9;26528:4;26524:20;26520:1;26509:9;26505:17;26498:47;26562:131;26688:4;26562:131;:::i;:::-;26554:139;;26281:419;;;:::o;26706:::-;26872:4;26910:2;26899:9;26895:18;26887:26;;26959:9;26953:4;26949:20;26945:1;26934:9;26930:17;26923:47;26987:131;27113:4;26987:131;:::i;:::-;26979:139;;26706:419;;;:::o;27131:::-;27297:4;27335:2;27324:9;27320:18;27312:26;;27384:9;27378:4;27374:20;27370:1;27359:9;27355:17;27348:47;27412:131;27538:4;27412:131;:::i;:::-;27404:139;;27131:419;;;:::o;27556:::-;27722:4;27760:2;27749:9;27745:18;27737:26;;27809:9;27803:4;27799:20;27795:1;27784:9;27780:17;27773:47;27837:131;27963:4;27837:131;:::i;:::-;27829:139;;27556:419;;;:::o;27981:::-;28147:4;28185:2;28174:9;28170:18;28162:26;;28234:9;28228:4;28224:20;28220:1;28209:9;28205:17;28198:47;28262:131;28388:4;28262:131;:::i;:::-;28254:139;;27981:419;;;:::o;28406:::-;28572:4;28610:2;28599:9;28595:18;28587:26;;28659:9;28653:4;28649:20;28645:1;28634:9;28630:17;28623:47;28687:131;28813:4;28687:131;:::i;:::-;28679:139;;28406:419;;;:::o;28831:::-;28997:4;29035:2;29024:9;29020:18;29012:26;;29084:9;29078:4;29074:20;29070:1;29059:9;29055:17;29048:47;29112:131;29238:4;29112:131;:::i;:::-;29104:139;;28831:419;;;:::o;29256:::-;29422:4;29460:2;29449:9;29445:18;29437:26;;29509:9;29503:4;29499:20;29495:1;29484:9;29480:17;29473:47;29537:131;29663:4;29537:131;:::i;:::-;29529:139;;29256:419;;;:::o;29681:::-;29847:4;29885:2;29874:9;29870:18;29862:26;;29934:9;29928:4;29924:20;29920:1;29909:9;29905:17;29898:47;29962:131;30088:4;29962:131;:::i;:::-;29954:139;;29681:419;;;:::o;30106:::-;30272:4;30310:2;30299:9;30295:18;30287:26;;30359:9;30353:4;30349:20;30345:1;30334:9;30330:17;30323:47;30387:131;30513:4;30387:131;:::i;:::-;30379:139;;30106:419;;;:::o;30531:::-;30697:4;30735:2;30724:9;30720:18;30712:26;;30784:9;30778:4;30774:20;30770:1;30759:9;30755:17;30748:47;30812:131;30938:4;30812:131;:::i;:::-;30804:139;;30531:419;;;:::o;30956:::-;31122:4;31160:2;31149:9;31145:18;31137:26;;31209:9;31203:4;31199:20;31195:1;31184:9;31180:17;31173:47;31237:131;31363:4;31237:131;:::i;:::-;31229:139;;30956:419;;;:::o;31381:::-;31547:4;31585:2;31574:9;31570:18;31562:26;;31634:9;31628:4;31624:20;31620:1;31609:9;31605:17;31598:47;31662:131;31788:4;31662:131;:::i;:::-;31654:139;;31381:419;;;:::o;31806:::-;31972:4;32010:2;31999:9;31995:18;31987:26;;32059:9;32053:4;32049:20;32045:1;32034:9;32030:17;32023:47;32087:131;32213:4;32087:131;:::i;:::-;32079:139;;31806:419;;;:::o;32231:::-;32397:4;32435:2;32424:9;32420:18;32412:26;;32484:9;32478:4;32474:20;32470:1;32459:9;32455:17;32448:47;32512:131;32638:4;32512:131;:::i;:::-;32504:139;;32231:419;;;:::o;32656:::-;32822:4;32860:2;32849:9;32845:18;32837:26;;32909:9;32903:4;32899:20;32895:1;32884:9;32880:17;32873:47;32937:131;33063:4;32937:131;:::i;:::-;32929:139;;32656:419;;;:::o;33081:::-;33247:4;33285:2;33274:9;33270:18;33262:26;;33334:9;33328:4;33324:20;33320:1;33309:9;33305:17;33298:47;33362:131;33488:4;33362:131;:::i;:::-;33354:139;;33081:419;;;:::o;33506:::-;33672:4;33710:2;33699:9;33695:18;33687:26;;33759:9;33753:4;33749:20;33745:1;33734:9;33730:17;33723:47;33787:131;33913:4;33787:131;:::i;:::-;33779:139;;33506:419;;;:::o;33931:::-;34097:4;34135:2;34124:9;34120:18;34112:26;;34184:9;34178:4;34174:20;34170:1;34159:9;34155:17;34148:47;34212:131;34338:4;34212:131;:::i;:::-;34204:139;;33931:419;;;:::o;34356:::-;34522:4;34560:2;34549:9;34545:18;34537:26;;34609:9;34603:4;34599:20;34595:1;34584:9;34580:17;34573:47;34637:131;34763:4;34637:131;:::i;:::-;34629:139;;34356:419;;;:::o;34781:::-;34947:4;34985:2;34974:9;34970:18;34962:26;;35034:9;35028:4;35024:20;35020:1;35009:9;35005:17;34998:47;35062:131;35188:4;35062:131;:::i;:::-;35054:139;;34781:419;;;:::o;35206:::-;35372:4;35410:2;35399:9;35395:18;35387:26;;35459:9;35453:4;35449:20;35445:1;35434:9;35430:17;35423:47;35487:131;35613:4;35487:131;:::i;:::-;35479:139;;35206:419;;;:::o;35631:::-;35797:4;35835:2;35824:9;35820:18;35812:26;;35884:9;35878:4;35874:20;35870:1;35859:9;35855:17;35848:47;35912:131;36038:4;35912:131;:::i;:::-;35904:139;;35631:419;;;:::o;36056:::-;36222:4;36260:2;36249:9;36245:18;36237:26;;36309:9;36303:4;36299:20;36295:1;36284:9;36280:17;36273:47;36337:131;36463:4;36337:131;:::i;:::-;36329:139;;36056:419;;;:::o;36481:::-;36647:4;36685:2;36674:9;36670:18;36662:26;;36734:9;36728:4;36724:20;36720:1;36709:9;36705:17;36698:47;36762:131;36888:4;36762:131;:::i;:::-;36754:139;;36481:419;;;:::o;36906:::-;37072:4;37110:2;37099:9;37095:18;37087:26;;37159:9;37153:4;37149:20;37145:1;37134:9;37130:17;37123:47;37187:131;37313:4;37187:131;:::i;:::-;37179:139;;36906:419;;;:::o;37331:222::-;37424:4;37462:2;37451:9;37447:18;37439:26;;37475:71;37543:1;37532:9;37528:17;37519:6;37475:71;:::i;:::-;37331:222;;;;:::o;37559:129::-;37593:6;37620:20;;:::i;:::-;37610:30;;37649:33;37677:4;37669:6;37649:33;:::i;:::-;37559:129;;;:::o;37694:75::-;37727:6;37760:2;37754:9;37744:19;;37694:75;:::o;37775:311::-;37852:4;37942:18;37934:6;37931:30;37928:56;;;37964:18;;:::i;:::-;37928:56;38014:4;38006:6;38002:17;37994:25;;38074:4;38068;38064:15;38056:23;;37775:311;;;:::o;38092:::-;38169:4;38259:18;38251:6;38248:30;38245:56;;;38281:18;;:::i;:::-;38245:56;38331:4;38323:6;38319:17;38311:25;;38391:4;38385;38381:15;38373:23;;38092:311;;;:::o;38409:307::-;38470:4;38560:18;38552:6;38549:30;38546:56;;;38582:18;;:::i;:::-;38546:56;38620:29;38642:6;38620:29;:::i;:::-;38612:37;;38704:4;38698;38694:15;38686:23;;38409:307;;;:::o;38722:308::-;38784:4;38874:18;38866:6;38863:30;38860:56;;;38896:18;;:::i;:::-;38860:56;38934:29;38956:6;38934:29;:::i;:::-;38926:37;;39018:4;39012;39008:15;39000:23;;38722:308;;;:::o;39036:98::-;39087:6;39121:5;39115:12;39105:22;;39036:98;;;:::o;39140:99::-;39192:6;39226:5;39220:12;39210:22;;39140:99;;;:::o;39245:168::-;39328:11;39362:6;39357:3;39350:19;39402:4;39397:3;39393:14;39378:29;;39245:168;;;;:::o;39419:147::-;39520:11;39557:3;39542:18;;39419:147;;;;:::o;39572:169::-;39656:11;39690:6;39685:3;39678:19;39730:4;39725:3;39721:14;39706:29;;39572:169;;;;:::o;39747:148::-;39849:11;39886:3;39871:18;;39747:148;;;;:::o;39901:305::-;39941:3;39960:20;39978:1;39960:20;:::i;:::-;39955:25;;39994:20;40012:1;39994:20;:::i;:::-;39989:25;;40148:1;40080:66;40076:74;40073:1;40070:81;40067:107;;;40154:18;;:::i;:::-;40067:107;40198:1;40195;40191:9;40184:16;;39901:305;;;;:::o;40212:185::-;40252:1;40269:20;40287:1;40269:20;:::i;:::-;40264:25;;40303:20;40321:1;40303:20;:::i;:::-;40298:25;;40342:1;40332:35;;40347:18;;:::i;:::-;40332:35;40389:1;40386;40382:9;40377:14;;40212:185;;;;:::o;40403:348::-;40443:7;40466:20;40484:1;40466:20;:::i;:::-;40461:25;;40500:20;40518:1;40500:20;:::i;:::-;40495:25;;40688:1;40620:66;40616:74;40613:1;40610:81;40605:1;40598:9;40591:17;40587:105;40584:131;;;40695:18;;:::i;:::-;40584:131;40743:1;40740;40736:9;40725:20;;40403:348;;;;:::o;40757:191::-;40797:4;40817:20;40835:1;40817:20;:::i;:::-;40812:25;;40851:20;40869:1;40851:20;:::i;:::-;40846:25;;40890:1;40887;40884:8;40881:34;;;40895:18;;:::i;:::-;40881:34;40940:1;40937;40933:9;40925:17;;40757:191;;;;:::o;40954:96::-;40991:7;41020:24;41038:5;41020:24;:::i;:::-;41009:35;;40954:96;;;:::o;41056:104::-;41101:7;41130:24;41148:5;41130:24;:::i;:::-;41119:35;;41056:104;;;:::o;41166:90::-;41200:7;41243:5;41236:13;41229:21;41218:32;;41166:90;;;:::o;41262:149::-;41298:7;41338:66;41331:5;41327:78;41316:89;;41262:149;;;:::o;41417:126::-;41454:7;41494:42;41487:5;41483:54;41472:65;;41417:126;;;:::o;41549:77::-;41586:7;41615:5;41604:16;;41549:77;;;:::o;41632:134::-;41690:9;41723:37;41754:5;41723:37;:::i;:::-;41710:50;;41632:134;;;:::o;41772:126::-;41822:9;41855:37;41886:5;41855:37;:::i;:::-;41842:50;;41772:126;;;:::o;41904:113::-;41954:9;41987:24;42005:5;41987:24;:::i;:::-;41974:37;;41904:113;;;:::o;42023:154::-;42107:6;42102:3;42097;42084:30;42169:1;42160:6;42155:3;42151:16;42144:27;42023:154;;;:::o;42183:307::-;42251:1;42261:113;42275:6;42272:1;42269:13;42261:113;;;42360:1;42355:3;42351:11;42345:18;42341:1;42336:3;42332:11;42325:39;42297:2;42294:1;42290:10;42285:15;;42261:113;;;42392:6;42389:1;42386:13;42383:101;;;42472:1;42463:6;42458:3;42454:16;42447:27;42383:101;42232:258;42183:307;;;:::o;42496:320::-;42540:6;42577:1;42571:4;42567:12;42557:22;;42624:1;42618:4;42614:12;42645:18;42635:81;;42701:4;42693:6;42689:17;42679:27;;42635:81;42763:2;42755:6;42752:14;42732:18;42729:38;42726:84;;;42782:18;;:::i;:::-;42726:84;42547:269;42496:320;;;:::o;42822:281::-;42905:27;42927:4;42905:27;:::i;:::-;42897:6;42893:40;43035:6;43023:10;43020:22;42999:18;42987:10;42984:34;42981:62;42978:88;;;43046:18;;:::i;:::-;42978:88;43086:10;43082:2;43075:22;42865:238;42822:281;;:::o;43109:233::-;43148:3;43171:24;43189:5;43171:24;:::i;:::-;43162:33;;43217:66;43210:5;43207:77;43204:103;;;43287:18;;:::i;:::-;43204:103;43334:1;43327:5;43323:13;43316:20;;43109:233;;;:::o;43348:176::-;43380:1;43397:20;43415:1;43397:20;:::i;:::-;43392:25;;43431:20;43449:1;43431:20;:::i;:::-;43426:25;;43470:1;43460:35;;43475:18;;:::i;:::-;43460:35;43516:1;43513;43509:9;43504:14;;43348:176;;;;:::o;43530:180::-;43578:77;43575:1;43568:88;43675:4;43672:1;43665:15;43699:4;43696:1;43689:15;43716:180;43764:77;43761:1;43754:88;43861:4;43858:1;43851:15;43885:4;43882:1;43875:15;43902:180;43950:77;43947:1;43940:88;44047:4;44044:1;44037:15;44071:4;44068:1;44061:15;44088:180;44136:77;44133:1;44126:88;44233:4;44230:1;44223:15;44257:4;44254:1;44247:15;44274:180;44322:77;44319:1;44312:88;44419:4;44416:1;44409:15;44443:4;44440:1;44433:15;44460:180;44508:77;44505:1;44498:88;44605:4;44602:1;44595:15;44629:4;44626:1;44619:15;44646:117;44755:1;44752;44745:12;44769:117;44878:1;44875;44868:12;44892:117;45001:1;44998;44991:12;45015:117;45124:1;45121;45114:12;45138:117;45247:1;45244;45237:12;45261:102;45302:6;45353:2;45349:7;45344:2;45337:5;45333:14;45329:28;45319:38;;45261:102;;;:::o;45369:168::-;45509:20;45505:1;45497:6;45493:14;45486:44;45369:168;:::o;45543:230::-;45683:34;45679:1;45671:6;45667:14;45660:58;45752:13;45747:2;45739:6;45735:15;45728:38;45543:230;:::o;45779:237::-;45919:34;45915:1;45907:6;45903:14;45896:58;45988:20;45983:2;45975:6;45971:15;45964:45;45779:237;:::o;46022:225::-;46162:34;46158:1;46150:6;46146:14;46139:58;46231:8;46226:2;46218:6;46214:15;46207:33;46022:225;:::o;46253:178::-;46393:30;46389:1;46381:6;46377:14;46370:54;46253:178;:::o;46437:225::-;46577:34;46573:1;46565:6;46561:14;46554:58;46646:8;46641:2;46633:6;46629:15;46622:33;46437:225;:::o;46668:223::-;46808:34;46804:1;46796:6;46792:14;46785:58;46877:6;46872:2;46864:6;46860:15;46853:31;46668:223;:::o;46897:175::-;47037:27;47033:1;47025:6;47021:14;47014:51;46897:175;:::o;47078:245::-;47218:34;47214:1;47206:6;47202:14;47195:58;47287:28;47282:2;47274:6;47270:15;47263:53;47078:245;:::o;47329:179::-;47469:31;47465:1;47457:6;47453:14;47446:55;47329:179;:::o;47514:231::-;47654:34;47650:1;47642:6;47638:14;47631:58;47723:14;47718:2;47710:6;47706:15;47699:39;47514:231;:::o;47751:230::-;47891:34;47887:1;47879:6;47875:14;47868:58;47960:13;47955:2;47947:6;47943:15;47936:38;47751:230;:::o;47987:243::-;48127:34;48123:1;48115:6;48111:14;48104:58;48196:26;48191:2;48183:6;48179:15;48172:51;47987:243;:::o;48236:229::-;48376:34;48372:1;48364:6;48360:14;48353:58;48445:12;48440:2;48432:6;48428:15;48421:37;48236:229;:::o;48471:228::-;48611:34;48607:1;48599:6;48595:14;48588:58;48680:11;48675:2;48667:6;48663:15;48656:36;48471:228;:::o;48705:182::-;48845:34;48841:1;48833:6;48829:14;48822:58;48705:182;:::o;48893:231::-;49033:34;49029:1;49021:6;49017:14;49010:58;49102:14;49097:2;49089:6;49085:15;49078:39;48893:231;:::o;49130:182::-;49270:34;49266:1;49258:6;49254:14;49247:58;49130:182;:::o;49318:228::-;49458:34;49454:1;49446:6;49442:14;49435:58;49527:11;49522:2;49514:6;49510:15;49503:36;49318:228;:::o;49552:234::-;49692:34;49688:1;49680:6;49676:14;49669:58;49761:17;49756:2;49748:6;49744:15;49737:42;49552:234;:::o;49792:220::-;49932:34;49928:1;49920:6;49916:14;49909:58;50001:3;49996:2;49988:6;49984:15;49977:28;49792:220;:::o;50018:176::-;50158:28;50154:1;50146:6;50142:14;50135:52;50018:176;:::o;50200:174::-;50340:26;50336:1;50328:6;50324:14;50317:50;50200:174;:::o;50380:114::-;;:::o;50500:236::-;50640:34;50636:1;50628:6;50624:14;50617:58;50709:19;50704:2;50696:6;50692:15;50685:44;50500:236;:::o;50742:231::-;50882:34;50878:1;50870:6;50866:14;50859:58;50951:14;50946:2;50938:6;50934:15;50927:39;50742:231;:::o;50979:223::-;51119:34;51115:1;51107:6;51103:14;51096:58;51188:6;51183:2;51175:6;51171:15;51164:31;50979:223;:::o;51208:176::-;51348:28;51344:1;51336:6;51332:14;51325:52;51208:176;:::o;51390:122::-;51463:24;51481:5;51463:24;:::i;:::-;51456:5;51453:35;51443:63;;51502:1;51499;51492:12;51443:63;51390:122;:::o;51518:138::-;51599:32;51625:5;51599:32;:::i;:::-;51592:5;51589:43;51579:71;;51646:1;51643;51636:12;51579:71;51518:138;:::o;51662:116::-;51732:21;51747:5;51732:21;:::i;:::-;51725:5;51722:32;51712:60;;51768:1;51765;51758:12;51712:60;51662:116;:::o;51784:120::-;51856:23;51873:5;51856:23;:::i;:::-;51849:5;51846:34;51836:62;;51894:1;51891;51884:12;51836:62;51784:120;:::o;51910:122::-;51983:24;52001:5;51983:24;:::i;:::-;51976:5;51973:35;51963:63;;52022:1;52019;52012:12;51963:63;51910:122;:::o

Swarm Source

ipfs://13445169fcd8d99ee25a01c1fc28e5de40b527a8d9686bcf26d7b51f6cda4cae
Loading...
Loading
Loading...
Loading
[ 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.