ETH Price: $3,272.66 (+0.83%)
Gas: 1 Gwei

Token

Color Plots (CP)
 

Overview

Max Total Supply

133 CP

Holders

64

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
3 CP
0x622Ff61c8EEe4cDc46B814D31903fe34C09abfbF
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:
ColorPlots

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-08
*/

/*________  ________  ___       ________  ________  ________  ___       ________  _________   
|\   ____\|\   __  \|\  \     |\   __  \|\   __  \|\   __  \|\  \     |\   __  \|\___   ___\ 
\ \  \___|\ \  \|\  \ \  \    \ \  \|\  \ \  \|\  \ \  \|\  \ \  \    \ \  \|\  \|___ \  \_| 
 \ \  \    \ \  \\\  \ \  \    \ \  \\\  \ \   _  _\ \   ____\ \  \    \ \  \\\  \   \ \  \  
  \ \  \____\ \  \\\  \ \  \____\ \  \\\  \ \  \\  \\ \  \___|\ \  \____\ \  \\\  \   \ \  \ 
   \ \_______\ \_______\ \_______\ \_______\ \__\\ _\\ \__\    \ \_______\ \_______\   \ \__\
    \|_______|\|_______|\|_______|\|_______|\|__|\|__|\|__|     \|_______|\|_______|    \|__| */

// SPDX-License-Identifier: MIT

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

pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/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;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        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 || 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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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



pragma solidity ^0.8.0;



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

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



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/ColorPlots.sol



pragma solidity ^0.8.0;








interface IStatic {
    function mint(address to, uint256 value) external;
    function burn(address user, uint256 amount) external;
}

contract ColorPlots is ERC721Enumerable, Ownable, ERC721Burnable {
    using SafeMath for uint256;
    using Counters for Counters.Counter;
    using Strings for uint256;
    Counters.Counter private _tokenIdTracker;

    IStatic public Static;
    
    uint256 public constant MAX_GENESIS_SUPPLY = 2197;
    uint256 public constant MAX_SUPPLY = 8000;
    uint256 public PUBLIC_SALE_PRICE = 0.06 ether; // will be set later
    uint256 public constant MAX_BY_MINT = 3;

    uint256 public constant MAX_GENESIS_SIZE = 32;
    uint256 public constant MAX_DESCENDANT_SIZE = 16;

    address public constant dev1Address = 0x91E2C907d583748eF33E0FAa2c29656Adb757453;
    address public constant dev2Address = 0xB2E2e105312f17CAcDFD92931781587Cd783f995;

    uint256 public earningStartTime;
    
    bool public staking = false;

    mapping(uint256 => uint256) public lastTimeClaimed;
    bool public publicSaleActive = false;
    bool public preSaleActive = false;

    mapping (address => uint256) public presaleWhitelist;
    mapping (uint256 => uint256) public size;
    mapping (uint256 => uint256) public status; //0 means upgrading Area, 1 means earnings $Static
    mapping (uint256 => uint256) public progressToNextSize;
    
    string public baseTokenURI;

    event CreateShape(uint256 indexed id);
    constructor() ERC721("Color Plots", "CP") {}
    
    /*/////////////////////////////////////////////////////////////////////////////
                            Mint Logic
    /////////////////////////////////////////////////////////////////////////////*/
    
    //Resume/pause Public Sale
    function togglePublicSale() public onlyOwner {
        publicSaleActive = !publicSaleActive;
    }

    //Resume/pause Presale
    function togglePreSale() public onlyOwner {
        preSaleActive = !preSaleActive;
    }

    //Return total supply
    function _totalSupply() internal view returns (uint) {
        return _tokenIdTracker.current();
    }

    //Public Mint
    function mint(uint256 _count) public payable {
        uint256 total = _totalSupply();
        require(publicSaleActive, "Public Sale is not active");
        require(total + _count <= MAX_GENESIS_SUPPLY, "All plots have been minted");
        require(_count <= MAX_BY_MINT, "3 max per tx");
        require(msg.value >= price(_count), "Not enough eth sent");

        for (uint256 i = 0; i < _count; i++) {
            _mintPlot(msg.sender);
        }
    }

    //Presale Mint
    function preSaleMint(uint256 _count) public payable {
        uint256 total = _totalSupply();
        uint256 numReserved = presaleWhitelist[msg.sender];
        require(preSaleActive, "Public Sale is not active");
        require(numReserved > 0, "You do not have any presale mints reserved");
        require(_count <= numReserved, "You do not have enough reserved");
        require(total + _count <= MAX_GENESIS_SUPPLY, "All plots have been minted");
        require(_count <= MAX_BY_MINT, "3 max per tx");
        require(msg.value >= price(_count), "Not enough eth sent");
        presaleWhitelist[msg.sender] = numReserved - _count;
        for (uint256 i = 0; i < _count; i++) {
            _mintPlot(msg.sender);
        }
    }
    
    //Mint plot to wallet
    function _mintPlot(address _to) private {
        uint id = _totalSupply();
        _tokenIdTracker.increment();
        _safeMint(_to, id);
        size[id] = getRandomSize();
        status[id] = 1;
        progressToNextSize[id] = 0;
        emit CreateShape(id);
    }

    //add addresses to presale
    function editWhitelist(address[] calldata addresses, uint256[] calldata count) external onlyOwner {
        for(uint256 i; i < addresses.length; i++){
            presaleWhitelist[addresses[i]] = count[i];
        }
    }

    //Return Cost for minting x plots
    function price(uint256 _count) public view returns (uint256) {
        return PUBLIC_SALE_PRICE.mul(_count);
    }
    
    
    function _baseURI() internal view virtual override returns (string memory) {
        return baseTokenURI;
    }
    
    //Set tokenURI based on size of plot
    function tokenURI(uint256 id) public view virtual override returns (string memory) {
        require(_exists(id), "ERC721Metadata: URI query for nonexistent token");
        string memory slash = '/';
        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, size[id].toString(), slash, id.toString())) : "";
    }
    
    
    function setBaseURI(string memory baseURI) public onlyOwner {
        baseTokenURI = baseURI;
    }
    
     /*/////////////////////////////////////////////////////////////////////////////
                            Staking Logic
    /////////////////////////////////////////////////////////////////////////////*/
    
    //Set address for $Static
    function setStaticAddress(address staticAddr) external onlyOwner {
        Static = IStatic(staticAddr);
    }
    
    //Mint a descendant plot using $Static
    function generateColorPlot() external {
        uint256 supply = totalSupply();
        require(supply < MAX_SUPPLY, "All Color Plots have been generated");
        uint256 descendantCost = _getDescendantCost(totalSupply());
        Static.burn(msg.sender, descendantCost);
        _mintPlot(msg.sender);
    }
    
    function _getDescendantCost(uint256 supply) internal pure returns (uint256) {
        if (supply < 2500) return  32 ether;
        if (supply < 3000) return  128 ether;
        if (supply < 3500) return  512 ether;
        if (supply < 4000) return  2048 ether;
        if (supply < 4500) return  8192 ether;
        if (supply < 5500) return  16384 ether;
        if (supply < 7000) return  131072 ether;
        else return  131072 ether;
    }
    
    //Reset start time of earning once earning $Static Begins
    function setEarningStartTime() external onlyOwner {
        earningStartTime = block.timestamp;
    }
    
    //Claim Static owed to wallett
    function _claim(uint256 id) internal {
        require(ownerOf(id) == msg.sender, "You do not own this Color Plot");
        require(staking, "Claiming $Static is paused"); 
        if(status[id] == 0){
            uint256 upgradeProgress = (block.timestamp - (lastTimeClaimed[id] >= earningStartTime ? lastTimeClaimed[id] : earningStartTime)) * 10000 / 1 days;
            uint256 totalProgress = progressToNextSize[id] + upgradeProgress;
            progressToNextSize[id] = totalProgress % 10000;
            uint256 upgrades = (totalProgress - progressToNextSize[id]) / 10000;
             
            if(id < MAX_GENESIS_SUPPLY) {
                if(size[id] + upgrades <= MAX_GENESIS_SIZE){
                    size[id] += upgrades;
                }
                else{
                    size[id] = MAX_GENESIS_SIZE;
                }
            } else {
                if(size[id] + upgrades <= MAX_DESCENDANT_SIZE){
                    size[id] += upgrades;
                }
                else{
                    size[id] = MAX_DESCENDANT_SIZE;
                }
            }
            lastTimeClaimed[id] = block.timestamp;
        }
        if(status[id] == 1){
            Static.mint(msg.sender, getEarnings(id));
            lastTimeClaimed[id] = block.timestamp;
        }
    }
    
    function claim(uint256[] calldata ids) external {
        for(uint256 i = 0; i < ids.length; i++){
            _claim(ids[i]);
        }
    }
    
    //Passive earning of $Static
    function getEarnings(uint256 id) internal view returns(uint256) {
        return (size[id] ** 2) * (block.timestamp - (lastTimeClaimed[id] >= earningStartTime ? lastTimeClaimed[id] : earningStartTime)) * 1 ether / 1 days;
    }
    
    //Resume/pause earning
    function toggleStaking() public onlyOwner {
        staking = !staking;
    }
    
    //Internal set status | 0 = leveling to increase area, 1 = Staking for $Static
    function _setStatus(uint256 id, uint256 newStatus) internal {
        require(ownerOf(id) == msg.sender, "You do not own this Color Plot");
        require(status[id] != newStatus, "Your plot is already set to this status");

        _claim(id);
        status[id] = newStatus;
    }
    
    function setStatus(uint256[] calldata ids, uint256 newStatus) external {
        for (uint256 i = 0; i < ids.length; i++) {
            _setStatus(ids[i], newStatus);
        }
    }
    
    /*/////////////////////////////////////////////////////////////////////////////
                            Extra Logic
    /////////////////////////////////////////////////////////////////////////////*/
    
    //Generate pseudo-random int from 0 - 100
    function randomSeed() private view returns (uint) {
        uint randomHash = uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp)));
        return randomHash % 100;
    } 
    
    //Get pseudo-random starting size of plot
    function getRandomSize() private view returns (uint) {
        uint seed = randomSeed();
        uint defSize = 2;
        if (seed >= 75){
            defSize = 3;
        }
        if (seed >= 95) {
            defSize = 4;
        }
        return defSize;
    }

    //Withdraw 
    function withdrawAll() public payable onlyOwner {
        uint256 balance = address(this).balance;
        uint256 dev1Share = balance.mul(50).div(100);
        uint256 dev2Share = balance.mul(50).div(100);

        require(balance > 0);
        _withdraw(dev1Address, dev1Share);
        _withdraw(dev2Address, dev2Share);
    }

    function _withdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    }
    
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"CreateShape","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_BY_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_DESCENDANT_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_GENESIS_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_GENESIS_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Static","outputs":[{"internalType":"contract IStatic","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dev1Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dev2Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earningStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"count","type":"uint256[]"}],"name":"editWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"generateColorPlot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"","type":"uint256"}],"name":"lastTimeClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","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":[],"name":"preSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"progressToNextSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"setEarningStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staticAddr","type":"address"}],"name":"setStaticAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256","name":"newStatus","type":"uint256"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"size","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"status","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":"togglePreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleStaking","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":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

608060405266d529ae9e860000600d556000600f60006101000a81548160ff0219169083151502179055506000601160006101000a81548160ff0219169083151502179055506000601160016101000a81548160ff0219169083151502179055503480156200006d57600080fd5b506040518060400160405280600b81526020017f436f6c6f7220506c6f74730000000000000000000000000000000000000000008152506040518060400160405280600281526020017f43500000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000f292919062000202565b5080600190805190602001906200010b92919062000202565b5050506200012e620001226200013460201b60201c565b6200013c60201b60201c565b62000317565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021090620002b2565b90600052602060002090601f01602090048101928262000234576000855562000280565b82601f106200024f57805160ff191683800117855562000280565b8280016001018555821562000280579182015b828111156200027f57825182559160200191906001019062000262565b5b5090506200028f919062000293565b5090565b5b80821115620002ae57600081600090555060010162000294565b5090565b60006002820490506001821680620002cb57607f821691505b60208210811415620002e257620002e1620002e8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615de580620003276000396000f3fe60806040526004361061031a5760003560e01c8063738e7218116101ab578063b88d4fde116100f7578063d886a5c811610095578063eb8835ab1161006f578063eb8835ab14610b65578063ef55838f14610ba2578063f2fde38b14610bdf578063fff5982b14610c085761031a565b8063d886a5c814610ae8578063e222c7f914610b11578063e985e9c514610b285761031a565b8063c87b56dd116100d1578063c87b56dd14610a52578063ca3cb52214610a8f578063ce2dda9614610aa6578063d547cfb714610abd5761031a565b8063b88d4fde146109d5578063ba801901146109fe578063bc8893b414610a275761031a565b80638da5cb5b116101645780639ed18f541161013e5780639ed18f541461093c578063a0712d6814610967578063a22cb46514610983578063b1c1430d146109ac5761031a565b80638da5cb5b146108a957806395655795146108d457806395d89b41146109115761031a565b8063738e7218146107c55780637835c635146107f0578063844947081461080c578063853828b61461083757806385edea13146108415780638ad5de281461087e5761031a565b80633b8105b31161026a5780634f6ccce7116102235780636352211e116101fd5780636352211e1461070b5780636ba4c1381461074857806370a0823114610771578063715018a6146107ae5761031a565b80634f6ccce71461067a57806355f804b3146106b757806357eac866146106e05761031a565b80633b8105b31461059257806342842e0e146105a957806342966c68146105d257806342d21ef7146105fb5780634c9d162a146106385780634cf088d91461064f5761031a565b806320c09e24116102d75780632ea89404116102b15780632ea89404146104d45780632f745c59146104ff57806331b8b1001461053c57806332cb6b0c146105675761031a565b806320c09e241461044357806323b872dd1461046e57806326a49e37146104975761031a565b806301ffc9a71461031f57806306fdde031461035c57806307e89ec014610387578063081812fc146103b2578063095ea7b3146103ef57806318160ddd14610418575b600080fd5b34801561032b57600080fd5b506103466004803603810190610341919061463d565b610c33565b6040516103539190615344565b60405180910390f35b34801561036857600080fd5b50610371610c45565b60405161037e919061537a565b60405180910390f35b34801561039357600080fd5b5061039c610cd7565b6040516103a9919061575c565b60405180910390f35b3480156103be57600080fd5b506103d960048036038101906103d491906146d0565b610cdd565b6040516103e691906152b4565b60405180910390f35b3480156103fb57600080fd5b50610416600480360381019061041191906144ef565b610d62565b005b34801561042457600080fd5b5061042d610e7a565b60405161043a919061575c565b60405180910390f35b34801561044f57600080fd5b50610458610e87565b60405161046591906152b4565b60405180910390f35b34801561047a57600080fd5b50610495600480360381019061049091906143e9565b610e9f565b005b3480156104a357600080fd5b506104be60048036038101906104b991906146d0565b610eff565b6040516104cb919061575c565b60405180910390f35b3480156104e057600080fd5b506104e9610f1d565b6040516104f6919061575c565b60405180910390f35b34801561050b57600080fd5b50610526600480360381019061052191906144ef565b610f22565b604051610533919061575c565b60405180910390f35b34801561054857600080fd5b50610551610fc7565b60405161055e919061535f565b60405180910390f35b34801561057357600080fd5b5061057c610fed565b604051610589919061575c565b60405180910390f35b34801561059e57600080fd5b506105a7610ff3565b005b3480156105b557600080fd5b506105d060048036038101906105cb91906143e9565b61109b565b005b3480156105de57600080fd5b506105f960048036038101906105f491906146d0565b6110bb565b005b34801561060757600080fd5b50610622600480360381019061061d91906146d0565b611117565b60405161062f919061575c565b60405180910390f35b34801561064457600080fd5b5061064d61112f565b005b34801561065b57600080fd5b506106646111b4565b6040516106719190615344565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c91906146d0565b6111c7565b6040516106ae919061575c565b60405180910390f35b3480156106c357600080fd5b506106de60048036038101906106d9919061468f565b61125e565b005b3480156106ec57600080fd5b506106f56112f4565b604051610702919061575c565b60405180910390f35b34801561071757600080fd5b50610732600480360381019061072d91906146d0565b6112fa565b60405161073f91906152b4565b60405180910390f35b34801561075457600080fd5b5061076f600480360381019061076a91906145a0565b6113ac565b005b34801561077d57600080fd5b5061079860048036038101906107939190614384565b61141a565b6040516107a5919061575c565b60405180910390f35b3480156107ba57600080fd5b506107c36114d2565b005b3480156107d157600080fd5b506107da61155a565b6040516107e7919061575c565b60405180910390f35b61080a600480360381019061080591906146d0565b611560565b005b34801561081857600080fd5b506108216117e0565b60405161082e9190615344565b60405180910390f35b61083f6117f3565b005b34801561084d57600080fd5b50610868600480360381019061086391906146d0565b611918565b604051610875919061575c565b60405180910390f35b34801561088a57600080fd5b50610893611930565b6040516108a0919061575c565b60405180910390f35b3480156108b557600080fd5b506108be611935565b6040516108cb91906152b4565b60405180910390f35b3480156108e057600080fd5b506108fb60048036038101906108f691906146d0565b61195f565b604051610908919061575c565b60405180910390f35b34801561091d57600080fd5b50610926611977565b604051610933919061537a565b60405180910390f35b34801561094857600080fd5b50610951611a09565b60405161095e919061575c565b60405180910390f35b610981600480360381019061097c91906146d0565b611a0e565b005b34801561098f57600080fd5b506109aa60048036038101906109a591906144b3565b611b74565b005b3480156109b857600080fd5b506109d360048036038101906109ce9190614384565b611cf5565b005b3480156109e157600080fd5b506109fc60048036038101906109f79190614438565b611db5565b005b348015610a0a57600080fd5b50610a256004803603810190610a2091906145e5565b611e17565b005b348015610a3357600080fd5b50610a3c611e87565b604051610a499190615344565b60405180910390f35b348015610a5e57600080fd5b50610a796004803603810190610a7491906146d0565b611e9a565b604051610a86919061537a565b60405180910390f35b348015610a9b57600080fd5b50610aa4611f9b565b005b348015610ab257600080fd5b50610abb612043565b005b348015610ac957600080fd5b50610ad2612143565b604051610adf919061537a565b60405180910390f35b348015610af457600080fd5b50610b0f6004803603810190610b0a919061452b565b6121d1565b005b348015610b1d57600080fd5b50610b26612345565b005b348015610b3457600080fd5b50610b4f6004803603810190610b4a91906143ad565b6123ed565b604051610b5c9190615344565b60405180910390f35b348015610b7157600080fd5b50610b8c6004803603810190610b879190614384565b612481565b604051610b99919061575c565b60405180910390f35b348015610bae57600080fd5b50610bc96004803603810190610bc491906146d0565b612499565b604051610bd6919061575c565b60405180910390f35b348015610beb57600080fd5b50610c066004803603810190610c019190614384565b6124b1565b005b348015610c1457600080fd5b50610c1d6125a9565b604051610c2a91906152b4565b60405180910390f35b6000610c3e826125c1565b9050919050565b606060008054610c5490615bc3565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8090615bc3565b8015610ccd5780601f10610ca257610100808354040283529160200191610ccd565b820191906000526020600020905b815481529060010190602001808311610cb057829003601f168201915b5050505050905090565b600d5481565b6000610ce88261263b565b610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e9061559c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d6d826112fa565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd59061563c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dfd6126a7565b73ffffffffffffffffffffffffffffffffffffffff161480610e2c5750610e2b81610e266126a7565b6123ed565b5b610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e62906154fc565b60405180910390fd5b610e7583836126af565b505050565b6000600880549050905090565b73b2e2e105312f17cacdfd92931781587cd783f99581565b610eb0610eaa6126a7565b82612768565b610eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee6906156bc565b60405180910390fd5b610efa838383612846565b505050565b6000610f1682600d54612aa290919063ffffffff16565b9050919050565b601081565b6000610f2d8361141a565b8210610f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f65906153bc565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f4081565b610ffb6126a7565b73ffffffffffffffffffffffffffffffffffffffff16611019611935565b73ffffffffffffffffffffffffffffffffffffffff161461106f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611066906155bc565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b6110b683838360405180602001604052806000815250611db5565b505050565b6110cc6110c66126a7565b82612768565b61110b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111029061573c565b60405180910390fd5b61111481612ab8565b50565b60146020528060005260406000206000915090505481565b6111376126a7565b73ffffffffffffffffffffffffffffffffffffffff16611155611935565b73ffffffffffffffffffffffffffffffffffffffff16146111ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a2906155bc565b60405180910390fd5b42600e81905550565b600f60009054906101000a900460ff1681565b60006111d1610e7a565b8210611212576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611209906156dc565b60405180910390fd5b6008828154811061124c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6112666126a7565b73ffffffffffffffffffffffffffffffffffffffff16611284611935565b73ffffffffffffffffffffffffffffffffffffffff16146112da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d1906155bc565b60405180910390fd5b80601690805190602001906112f0929190614114565b5050565b600e5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a9061553c565b60405180910390fd5b80915050919050565b60005b82829050811015611415576114028383838181106113f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135612bc9565b808061140d90615bf5565b9150506113af565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561148b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114829061551c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114da6126a7565b73ffffffffffffffffffffffffffffffffffffffff166114f8611935565b73ffffffffffffffffffffffffffffffffffffffff161461154e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611545906155bc565b60405180910390fd5b6115586000612f5f565b565b61089581565b600061156a613025565b90506000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601160019054906101000a900460ff166115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f69061547c565b60405180910390fd5b60008111611642576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116399061545c565b60405180910390fd5b80831115611685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167c9061567c565b60405180910390fd5b61089583836116949190615856565b11156116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cc9061555c565b60405180910390fd5b6003831115611719576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117109061565c565b60405180910390fd5b61172283610eff565b341015611764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175b906155fc565b60405180910390fd5b82816117709190615aa8565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b838110156117da576117c733613036565b80806117d290615bf5565b9150506117b6565b50505050565b601160019054906101000a900460ff1681565b6117fb6126a7565b73ffffffffffffffffffffffffffffffffffffffff16611819611935565b73ffffffffffffffffffffffffffffffffffffffff161461186f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611866906155bc565b60405180910390fd5b6000479050600061189d606461188f603285612aa290919063ffffffff16565b6130d890919063ffffffff16565b905060006118c860646118ba603286612aa290919063ffffffff16565b6130d890919063ffffffff16565b9050600083116118d757600080fd5b6118f57391e2c907d583748ef33e0faa2c29656adb757453836130ee565b61191373b2e2e105312f17cacdfd92931781587cd783f995826130ee565b505050565b60136020528060005260406000206000915090505481565b600381565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60156020528060005260406000206000915090505481565b60606001805461198690615bc3565b80601f01602080910402602001604051908101604052809291908181526020018280546119b290615bc3565b80156119ff5780601f106119d4576101008083540402835291602001916119ff565b820191906000526020600020905b8154815290600101906020018083116119e257829003601f168201915b5050505050905090565b602081565b6000611a18613025565b9050601160009054906101000a900460ff16611a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a609061547c565b60405180910390fd5b6108958282611a789190615856565b1115611ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab09061555c565b60405180910390fd5b6003821115611afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af49061565c565b60405180910390fd5b611b0682610eff565b341015611b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3f906155fc565b60405180910390fd5b60005b82811015611b6f57611b5c33613036565b8080611b6790615bf5565b915050611b4b565b505050565b611b7c6126a7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be1906154bc565b60405180910390fd5b8060056000611bf76126a7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ca46126a7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ce99190615344565b60405180910390a35050565b611cfd6126a7565b73ffffffffffffffffffffffffffffffffffffffff16611d1b611935565b73ffffffffffffffffffffffffffffffffffffffff1614611d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d68906155bc565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611dc6611dc06126a7565b83612768565b611e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfc906156bc565b60405180910390fd5b611e118484848461319f565b50505050565b60005b83839050811015611e8157611e6e848483818110611e61577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135836131fb565b8080611e7990615bf5565b915050611e1a565b50505050565b601160009054906101000a900460ff1681565b6060611ea58261263b565b611ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edb9061561c565b60405180910390fd5b60006040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525090506000611f286132ec565b90506000815111611f485760405180602001604052806000815250611f92565b80611f65601360008781526020019081526020016000205461337e565b83611f6f8761337e565b604051602001611f829493929190615235565b6040516020818303038152906040525b92505050919050565b611fa36126a7565b73ffffffffffffffffffffffffffffffffffffffff16611fc1611935565b73ffffffffffffffffffffffffffffffffffffffff1614612017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200e906155bc565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b600061204d610e7a565b9050611f408110612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208a9061571c565b60405180910390fd5b60006120a56120a0610e7a565b61352b565b9050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac33836040518363ffffffff1660e01b815260040161210492919061531b565b600060405180830381600087803b15801561211e57600080fd5b505af1158015612132573d6000803e3d6000fd5b5050505061213f33613036565b5050565b6016805461215090615bc3565b80601f016020809104026020016040519081016040528092919081815260200182805461217c90615bc3565b80156121c95780601f1061219e576101008083540402835291602001916121c9565b820191906000526020600020905b8154815290600101906020018083116121ac57829003601f168201915b505050505081565b6121d96126a7565b73ffffffffffffffffffffffffffffffffffffffff166121f7611935565b73ffffffffffffffffffffffffffffffffffffffff161461224d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612244906155bc565b60405180910390fd5b60005b8484905081101561233e57828282818110612294577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135601260008787858181106122d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906122ed9190614384565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061233690615bf5565b915050612250565b5050505050565b61234d6126a7565b73ffffffffffffffffffffffffffffffffffffffff1661236b611935565b73ffffffffffffffffffffffffffffffffffffffff16146123c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b8906155bc565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60126020528060005260406000206000915090505481565b60106020528060005260406000206000915090505481565b6124b96126a7565b73ffffffffffffffffffffffffffffffffffffffff166124d7611935565b73ffffffffffffffffffffffffffffffffffffffff161461252d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612524906155bc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561259d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612594906153fc565b60405180910390fd5b6125a681612f5f565b50565b7391e2c907d583748ef33e0faa2c29656adb75745381565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612634575061263382613600565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612722836112fa565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006127738261263b565b6127b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a9906154dc565b60405180910390fd5b60006127bd836112fa565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061282c57508373ffffffffffffffffffffffffffffffffffffffff1661281484610cdd565b73ffffffffffffffffffffffffffffffffffffffff16145b8061283d575061283c81856123ed565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612866826112fa565b73ffffffffffffffffffffffffffffffffffffffff16146128bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b3906155dc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561292c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129239061549c565b60405180910390fd5b6129378383836136e2565b6129426000826126af565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129929190615aa8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129e99190615856565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612ab09190615a4e565b905092915050565b6000612ac3826112fa565b9050612ad1816000846136e2565b612adc6000836126af565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b2c9190615aa8565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b3373ffffffffffffffffffffffffffffffffffffffff16612be9826112fa565b73ffffffffffffffffffffffffffffffffffffffff1614612c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c369061539c565b60405180910390fd5b600f60009054906101000a900460ff16612c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c85906156fc565b60405180910390fd5b600060146000838152602001908152602001600020541415612e9057600062015180612710600e5460106000868152602001908152602001600020541015612cd857600e54612ced565b60106000858152602001908152602001600020545b42612cf89190615aa8565b612d029190615a4e565b612d0c91906158ac565b90506000816015600085815260200190815260200160002054612d2f9190615856565b905061271081612d3f9190615c48565b60156000858152602001908152602001600020819055506000612710601560008681526020019081526020016000205483612d7a9190615aa8565b612d8491906158ac565b9050610895841015612e04576020816013600087815260200190815260200160002054612db19190615856565b11612de55780601360008681526020019081526020016000206000828254612dd99190615856565b92505081905550612dff565b602060136000868152602001908152602001600020819055505b612e74565b6010816013600087815260200190815260200160002054612e259190615856565b11612e595780601360008681526020019081526020016000206000828254612e4d9190615856565b92505081905550612e73565b601060136000868152602001908152602001600020819055505b5b4260106000868152602001908152602001600020819055505050505b600160146000838152602001908152602001600020541415612f5c57600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933612ef4846136f2565b6040518363ffffffff1660e01b8152600401612f1192919061531b565b600060405180830381600087803b158015612f2b57600080fd5b505af1158015612f3f573d6000803e3d6000fd5b505050504260106000838152602001908152602001600020819055505b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000613031600b61378b565b905090565b6000613040613025565b905061304c600b613799565b61305682826137af565b61305e6137cd565b60136000838152602001908152602001600020819055506001601460008381526020019081526020016000208190555060006015600083815260200190815260200160002081905550807f0917cc144b0b4c380ffcd22bd3c84b58a8e4ed7fb8b3fdfa347bb5cf17f311b360405160405180910390a25050565b600081836130e691906158ac565b905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161311490615273565b60006040518083038185875af1925050503d8060008114613151576040519150601f19603f3d011682016040523d82523d6000602084013e613156565b606091505b505090508061319a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131919061569c565b60405180910390fd5b505050565b6131aa848484612846565b6131b684848484613802565b6131f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ec906153dc565b60405180910390fd5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff1661321b836112fa565b73ffffffffffffffffffffffffffffffffffffffff1614613271576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132689061539c565b60405180910390fd5b80601460008481526020019081526020016000205414156132c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132be9061543c565b60405180910390fd5b6132d082612bc9565b8060146000848152602001908152602001600020819055505050565b6060601680546132fb90615bc3565b80601f016020809104026020016040519081016040528092919081815260200182805461332790615bc3565b80156133745780601f1061334957610100808354040283529160200191613374565b820191906000526020600020905b81548152906001019060200180831161335757829003601f168201915b5050505050905090565b606060008214156133c6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613526565b600082905060005b600082146133f85780806133e190615bf5565b915050600a826133f191906158ac565b91506133ce565b60008167ffffffffffffffff81111561343a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561346c5781602001600182028036833780820191505090505b5090505b6000851461351f576001826134859190615aa8565b9150600a856134949190615c48565b60306134a09190615856565b60f81b8183815181106134dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561351891906158ac565b9450613470565b8093505050505b919050565b60006109c4821015613548576801bc16d674ec80000090506135fb565b610bb8821015613563576806f05b59d3b200000090506135fb565b610dac82101561357e57681bc16d674ec800000090506135fb565b610fa082101561359957686f05b59d3b2000000090506135fb565b6111948210156135b5576901bc16d674ec8000000090506135fb565b61157c8210156135d1576903782dace9d90000000090506135fb565b611b588210156135ed57691bc16d674ec80000000090506135fb565b691bc16d674ec80000000090505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806136cb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806136db57506136da82613999565b5b9050919050565b6136ed838383613a03565b505050565b600062015180670de0b6b3a7640000600e546010600086815260200190815260200160002054101561372657600e5461373b565b60106000858152602001908152602001600020545b426137469190615aa8565b600260136000878152602001908152602001600020546137669190615930565b6137709190615a4e565b61377a9190615a4e565b61378491906158ac565b9050919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6137c9828260405180602001604052806000815250613b17565b5050565b6000806137d8613b72565b9050600060029050604b82106137ed57600390505b605f82106137fa57600490505b809250505090565b60006138238473ffffffffffffffffffffffffffffffffffffffff16613bb6565b1561398c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261384c6126a7565b8786866040518563ffffffff1660e01b815260040161386e94939291906152cf565b602060405180830381600087803b15801561388857600080fd5b505af19250505080156138b957506040513d601f19601f820116820180604052508101906138b69190614666565b60015b61393c573d80600081146138e9576040519150601f19603f3d011682016040523d82523d6000602084013e6138ee565b606091505b50600081511415613934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161392b906153dc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613991565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613a0e838383613bc9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613a5157613a4c81613bce565b613a90565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613a8f57613a8e8382613c17565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ad357613ace81613d84565b613b12565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613b1157613b108282613ec7565b5b5b505050565b613b218383613f46565b613b2e6000848484613802565b613b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b64906153dc565b60405180910390fd5b505050565b6000804442604051602001613b88929190615288565b6040516020818303038152906040528051906020012060001c9050606481613bb09190615c48565b91505090565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613c248461141a565b613c2e9190615aa8565b9050600060076000848152602001908152602001600020549050818114613d13576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613d989190615aa8565b9050600060096000848152602001908152602001600020549050600060088381548110613dee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613e36577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613eab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613ed28361141a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fad9061557c565b60405180910390fd5b613fbf8161263b565b15613fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ff69061541c565b60405180910390fd5b61400b600083836136e2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461405b9190615856565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461412090615bc3565b90600052602060002090601f0160209004810192826141425760008555614189565b82601f1061415b57805160ff1916838001178555614189565b82800160010185558215614189579182015b8281111561418857825182559160200191906001019061416d565b5b509050614196919061419a565b5090565b5b808211156141b357600081600090555060010161419b565b5090565b60006141ca6141c5846157a8565b615777565b9050828152602081018484840111156141e257600080fd5b6141ed848285615b81565b509392505050565b6000614208614203846157d8565b615777565b90508281526020810184848401111561422057600080fd5b61422b848285615b81565b509392505050565b60008135905061424281615d53565b92915050565b60008083601f84011261425a57600080fd5b8235905067ffffffffffffffff81111561427357600080fd5b60208301915083602082028301111561428b57600080fd5b9250929050565b60008083601f8401126142a457600080fd5b8235905067ffffffffffffffff8111156142bd57600080fd5b6020830191508360208202830111156142d557600080fd5b9250929050565b6000813590506142eb81615d6a565b92915050565b60008135905061430081615d81565b92915050565b60008151905061431581615d81565b92915050565b600082601f83011261432c57600080fd5b813561433c8482602086016141b7565b91505092915050565b600082601f83011261435657600080fd5b81356143668482602086016141f5565b91505092915050565b60008135905061437e81615d98565b92915050565b60006020828403121561439657600080fd5b60006143a484828501614233565b91505092915050565b600080604083850312156143c057600080fd5b60006143ce85828601614233565b92505060206143df85828601614233565b9150509250929050565b6000806000606084860312156143fe57600080fd5b600061440c86828701614233565b935050602061441d86828701614233565b925050604061442e8682870161436f565b9150509250925092565b6000806000806080858703121561444e57600080fd5b600061445c87828801614233565b945050602061446d87828801614233565b935050604061447e8782880161436f565b925050606085013567ffffffffffffffff81111561449b57600080fd5b6144a78782880161431b565b91505092959194509250565b600080604083850312156144c657600080fd5b60006144d485828601614233565b92505060206144e5858286016142dc565b9150509250929050565b6000806040838503121561450257600080fd5b600061451085828601614233565b92505060206145218582860161436f565b9150509250929050565b6000806000806040858703121561454157600080fd5b600085013567ffffffffffffffff81111561455b57600080fd5b61456787828801614248565b9450945050602085013567ffffffffffffffff81111561458657600080fd5b61459287828801614292565b925092505092959194509250565b600080602083850312156145b357600080fd5b600083013567ffffffffffffffff8111156145cd57600080fd5b6145d985828601614292565b92509250509250929050565b6000806000604084860312156145fa57600080fd5b600084013567ffffffffffffffff81111561461457600080fd5b61462086828701614292565b935093505060206146338682870161436f565b9150509250925092565b60006020828403121561464f57600080fd5b600061465d848285016142f1565b91505092915050565b60006020828403121561467857600080fd5b600061468684828501614306565b91505092915050565b6000602082840312156146a157600080fd5b600082013567ffffffffffffffff8111156146bb57600080fd5b6146c784828501614345565b91505092915050565b6000602082840312156146e257600080fd5b60006146f08482850161436f565b91505092915050565b61470281615adc565b82525050565b61471181615aee565b82525050565b600061472282615808565b61472c818561581e565b935061473c818560208601615b90565b61474581615d35565b840191505092915050565b61475981615b5d565b82525050565b600061476a82615813565b614774818561583a565b9350614784818560208601615b90565b61478d81615d35565b840191505092915050565b60006147a382615813565b6147ad818561584b565b93506147bd818560208601615b90565b80840191505092915050565b60006147d6601e8361583a565b91507f596f7520646f206e6f74206f776e207468697320436f6c6f7220506c6f7400006000830152602082019050919050565b6000614816602b8361583a565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061487c60328361583a565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006148e260268361583a565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614948601c8361583a565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061498860278361583a565b91507f596f757220706c6f7420697320616c72656164792073657420746f207468697360008301527f20737461747573000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006149ee602a8361583a565b91507f596f7520646f206e6f74206861766520616e792070726573616c65206d696e7460008301527f73207265736572766564000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a5460198361583a565b91507f5075626c69632053616c65206973206e6f7420616374697665000000000000006000830152602082019050919050565b6000614a9460248361583a565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614afa60198361583a565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614b3a602c8361583a565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614ba060388361583a565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614c06602a8361583a565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c6c60298361583a565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614cd2601a8361583a565b91507f416c6c20706c6f74732068617665206265656e206d696e7465640000000000006000830152602082019050919050565b6000614d1260208361583a565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614d52602c8361583a565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614db860208361583a565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614df860298361583a565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e5e60138361583a565b91507f4e6f7420656e6f756768206574682073656e74000000000000000000000000006000830152602082019050919050565b6000614e9e602f8361583a565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614f0460218361583a565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614f6a600c8361583a565b91507f33206d61782070657220747800000000000000000000000000000000000000006000830152602082019050919050565b6000614faa601f8361583a565b91507f596f7520646f206e6f74206861766520656e6f756768207265736572766564006000830152602082019050919050565b6000614fea60008361582f565b9150600082019050919050565b600061500460108361583a565b91507f5472616e73666572206661696c65642e000000000000000000000000000000006000830152602082019050919050565b600061504460318361583a565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006150aa602c8361583a565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000615110601a8361583a565b91507f436c61696d696e672024537461746963206973207061757365640000000000006000830152602082019050919050565b600061515060238361583a565b91507f416c6c20436f6c6f7220506c6f74732068617665206265656e2067656e65726160008301527f74656400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006151b660308361583a565b91507f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f766564000000000000000000000000000000006020830152604082019050919050565b61521881615b46565b82525050565b61522f61522a82615b46565b615c3e565b82525050565b60006152418287614798565b915061524d8286614798565b91506152598285614798565b91506152658284614798565b915081905095945050505050565b600061527e82614fdd565b9150819050919050565b6000615294828561521e565b6020820191506152a4828461521e565b6020820191508190509392505050565b60006020820190506152c960008301846146f9565b92915050565b60006080820190506152e460008301876146f9565b6152f160208301866146f9565b6152fe604083018561520f565b81810360608301526153108184614717565b905095945050505050565b600060408201905061533060008301856146f9565b61533d602083018461520f565b9392505050565b60006020820190506153596000830184614708565b92915050565b60006020820190506153746000830184614750565b92915050565b60006020820190508181036000830152615394818461475f565b905092915050565b600060208201905081810360008301526153b5816147c9565b9050919050565b600060208201905081810360008301526153d581614809565b9050919050565b600060208201905081810360008301526153f58161486f565b9050919050565b60006020820190508181036000830152615415816148d5565b9050919050565b600060208201905081810360008301526154358161493b565b9050919050565b600060208201905081810360008301526154558161497b565b9050919050565b60006020820190508181036000830152615475816149e1565b9050919050565b6000602082019050818103600083015261549581614a47565b9050919050565b600060208201905081810360008301526154b581614a87565b9050919050565b600060208201905081810360008301526154d581614aed565b9050919050565b600060208201905081810360008301526154f581614b2d565b9050919050565b6000602082019050818103600083015261551581614b93565b9050919050565b6000602082019050818103600083015261553581614bf9565b9050919050565b6000602082019050818103600083015261555581614c5f565b9050919050565b6000602082019050818103600083015261557581614cc5565b9050919050565b6000602082019050818103600083015261559581614d05565b9050919050565b600060208201905081810360008301526155b581614d45565b9050919050565b600060208201905081810360008301526155d581614dab565b9050919050565b600060208201905081810360008301526155f581614deb565b9050919050565b6000602082019050818103600083015261561581614e51565b9050919050565b6000602082019050818103600083015261563581614e91565b9050919050565b6000602082019050818103600083015261565581614ef7565b9050919050565b6000602082019050818103600083015261567581614f5d565b9050919050565b6000602082019050818103600083015261569581614f9d565b9050919050565b600060208201905081810360008301526156b581614ff7565b9050919050565b600060208201905081810360008301526156d581615037565b9050919050565b600060208201905081810360008301526156f58161509d565b9050919050565b6000602082019050818103600083015261571581615103565b9050919050565b6000602082019050818103600083015261573581615143565b9050919050565b60006020820190508181036000830152615755816151a9565b9050919050565b6000602082019050615771600083018461520f565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561579e5761579d615d06565b5b8060405250919050565b600067ffffffffffffffff8211156157c3576157c2615d06565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156157f3576157f2615d06565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061586182615b46565b915061586c83615b46565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156158a1576158a0615c79565b5b828201905092915050565b60006158b782615b46565b91506158c283615b46565b9250826158d2576158d1615ca8565b5b828204905092915050565b6000808291508390505b60018511156159275780860481111561590357615902615c79565b5b60018516156159125780820291505b808102905061592085615d46565b94506158e7565b94509492505050565b600061593b82615b46565b915061594683615b50565b92506159737fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461597b565b905092915050565b60008261598b5760019050615a47565b816159995760009050615a47565b81600181146159af57600281146159b9576159e8565b6001915050615a47565b60ff8411156159cb576159ca615c79565b5b8360020a9150848211156159e2576159e1615c79565b5b50615a47565b5060208310610133831016604e8410600b8410161715615a1d5782820a905083811115615a1857615a17615c79565b5b615a47565b615a2a84848460016158dd565b92509050818404811115615a4157615a40615c79565b5b81810290505b9392505050565b6000615a5982615b46565b9150615a6483615b46565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615a9d57615a9c615c79565b5b828202905092915050565b6000615ab382615b46565b9150615abe83615b46565b925082821015615ad157615ad0615c79565b5b828203905092915050565b6000615ae782615b26565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615b6882615b6f565b9050919050565b6000615b7a82615b26565b9050919050565b82818337600083830152505050565b60005b83811015615bae578082015181840152602081019050615b93565b83811115615bbd576000848401525b50505050565b60006002820490506001821680615bdb57607f821691505b60208210811415615bef57615bee615cd7565b5b50919050565b6000615c0082615b46565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615c3357615c32615c79565b5b600182019050919050565b6000819050919050565b6000615c5382615b46565b9150615c5e83615b46565b925082615c6e57615c6d615ca8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b615d5c81615adc565b8114615d6757600080fd5b50565b615d7381615aee565b8114615d7e57600080fd5b50565b615d8a81615afa565b8114615d9557600080fd5b50565b615da181615b46565b8114615dac57600080fd5b5056fea26469706673582212209d1b88e2beeae8b61118cac747706258734cd1b526efbc10885d648e5b5c655964736f6c63430008000033

Deployed Bytecode

0x60806040526004361061031a5760003560e01c8063738e7218116101ab578063b88d4fde116100f7578063d886a5c811610095578063eb8835ab1161006f578063eb8835ab14610b65578063ef55838f14610ba2578063f2fde38b14610bdf578063fff5982b14610c085761031a565b8063d886a5c814610ae8578063e222c7f914610b11578063e985e9c514610b285761031a565b8063c87b56dd116100d1578063c87b56dd14610a52578063ca3cb52214610a8f578063ce2dda9614610aa6578063d547cfb714610abd5761031a565b8063b88d4fde146109d5578063ba801901146109fe578063bc8893b414610a275761031a565b80638da5cb5b116101645780639ed18f541161013e5780639ed18f541461093c578063a0712d6814610967578063a22cb46514610983578063b1c1430d146109ac5761031a565b80638da5cb5b146108a957806395655795146108d457806395d89b41146109115761031a565b8063738e7218146107c55780637835c635146107f0578063844947081461080c578063853828b61461083757806385edea13146108415780638ad5de281461087e5761031a565b80633b8105b31161026a5780634f6ccce7116102235780636352211e116101fd5780636352211e1461070b5780636ba4c1381461074857806370a0823114610771578063715018a6146107ae5761031a565b80634f6ccce71461067a57806355f804b3146106b757806357eac866146106e05761031a565b80633b8105b31461059257806342842e0e146105a957806342966c68146105d257806342d21ef7146105fb5780634c9d162a146106385780634cf088d91461064f5761031a565b806320c09e24116102d75780632ea89404116102b15780632ea89404146104d45780632f745c59146104ff57806331b8b1001461053c57806332cb6b0c146105675761031a565b806320c09e241461044357806323b872dd1461046e57806326a49e37146104975761031a565b806301ffc9a71461031f57806306fdde031461035c57806307e89ec014610387578063081812fc146103b2578063095ea7b3146103ef57806318160ddd14610418575b600080fd5b34801561032b57600080fd5b506103466004803603810190610341919061463d565b610c33565b6040516103539190615344565b60405180910390f35b34801561036857600080fd5b50610371610c45565b60405161037e919061537a565b60405180910390f35b34801561039357600080fd5b5061039c610cd7565b6040516103a9919061575c565b60405180910390f35b3480156103be57600080fd5b506103d960048036038101906103d491906146d0565b610cdd565b6040516103e691906152b4565b60405180910390f35b3480156103fb57600080fd5b50610416600480360381019061041191906144ef565b610d62565b005b34801561042457600080fd5b5061042d610e7a565b60405161043a919061575c565b60405180910390f35b34801561044f57600080fd5b50610458610e87565b60405161046591906152b4565b60405180910390f35b34801561047a57600080fd5b50610495600480360381019061049091906143e9565b610e9f565b005b3480156104a357600080fd5b506104be60048036038101906104b991906146d0565b610eff565b6040516104cb919061575c565b60405180910390f35b3480156104e057600080fd5b506104e9610f1d565b6040516104f6919061575c565b60405180910390f35b34801561050b57600080fd5b50610526600480360381019061052191906144ef565b610f22565b604051610533919061575c565b60405180910390f35b34801561054857600080fd5b50610551610fc7565b60405161055e919061535f565b60405180910390f35b34801561057357600080fd5b5061057c610fed565b604051610589919061575c565b60405180910390f35b34801561059e57600080fd5b506105a7610ff3565b005b3480156105b557600080fd5b506105d060048036038101906105cb91906143e9565b61109b565b005b3480156105de57600080fd5b506105f960048036038101906105f491906146d0565b6110bb565b005b34801561060757600080fd5b50610622600480360381019061061d91906146d0565b611117565b60405161062f919061575c565b60405180910390f35b34801561064457600080fd5b5061064d61112f565b005b34801561065b57600080fd5b506106646111b4565b6040516106719190615344565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c91906146d0565b6111c7565b6040516106ae919061575c565b60405180910390f35b3480156106c357600080fd5b506106de60048036038101906106d9919061468f565b61125e565b005b3480156106ec57600080fd5b506106f56112f4565b604051610702919061575c565b60405180910390f35b34801561071757600080fd5b50610732600480360381019061072d91906146d0565b6112fa565b60405161073f91906152b4565b60405180910390f35b34801561075457600080fd5b5061076f600480360381019061076a91906145a0565b6113ac565b005b34801561077d57600080fd5b5061079860048036038101906107939190614384565b61141a565b6040516107a5919061575c565b60405180910390f35b3480156107ba57600080fd5b506107c36114d2565b005b3480156107d157600080fd5b506107da61155a565b6040516107e7919061575c565b60405180910390f35b61080a600480360381019061080591906146d0565b611560565b005b34801561081857600080fd5b506108216117e0565b60405161082e9190615344565b60405180910390f35b61083f6117f3565b005b34801561084d57600080fd5b50610868600480360381019061086391906146d0565b611918565b604051610875919061575c565b60405180910390f35b34801561088a57600080fd5b50610893611930565b6040516108a0919061575c565b60405180910390f35b3480156108b557600080fd5b506108be611935565b6040516108cb91906152b4565b60405180910390f35b3480156108e057600080fd5b506108fb60048036038101906108f691906146d0565b61195f565b604051610908919061575c565b60405180910390f35b34801561091d57600080fd5b50610926611977565b604051610933919061537a565b60405180910390f35b34801561094857600080fd5b50610951611a09565b60405161095e919061575c565b60405180910390f35b610981600480360381019061097c91906146d0565b611a0e565b005b34801561098f57600080fd5b506109aa60048036038101906109a591906144b3565b611b74565b005b3480156109b857600080fd5b506109d360048036038101906109ce9190614384565b611cf5565b005b3480156109e157600080fd5b506109fc60048036038101906109f79190614438565b611db5565b005b348015610a0a57600080fd5b50610a256004803603810190610a2091906145e5565b611e17565b005b348015610a3357600080fd5b50610a3c611e87565b604051610a499190615344565b60405180910390f35b348015610a5e57600080fd5b50610a796004803603810190610a7491906146d0565b611e9a565b604051610a86919061537a565b60405180910390f35b348015610a9b57600080fd5b50610aa4611f9b565b005b348015610ab257600080fd5b50610abb612043565b005b348015610ac957600080fd5b50610ad2612143565b604051610adf919061537a565b60405180910390f35b348015610af457600080fd5b50610b0f6004803603810190610b0a919061452b565b6121d1565b005b348015610b1d57600080fd5b50610b26612345565b005b348015610b3457600080fd5b50610b4f6004803603810190610b4a91906143ad565b6123ed565b604051610b5c9190615344565b60405180910390f35b348015610b7157600080fd5b50610b8c6004803603810190610b879190614384565b612481565b604051610b99919061575c565b60405180910390f35b348015610bae57600080fd5b50610bc96004803603810190610bc491906146d0565b612499565b604051610bd6919061575c565b60405180910390f35b348015610beb57600080fd5b50610c066004803603810190610c019190614384565b6124b1565b005b348015610c1457600080fd5b50610c1d6125a9565b604051610c2a91906152b4565b60405180910390f35b6000610c3e826125c1565b9050919050565b606060008054610c5490615bc3565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8090615bc3565b8015610ccd5780601f10610ca257610100808354040283529160200191610ccd565b820191906000526020600020905b815481529060010190602001808311610cb057829003601f168201915b5050505050905090565b600d5481565b6000610ce88261263b565b610d27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1e9061559c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d6d826112fa565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd59061563c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dfd6126a7565b73ffffffffffffffffffffffffffffffffffffffff161480610e2c5750610e2b81610e266126a7565b6123ed565b5b610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e62906154fc565b60405180910390fd5b610e7583836126af565b505050565b6000600880549050905090565b73b2e2e105312f17cacdfd92931781587cd783f99581565b610eb0610eaa6126a7565b82612768565b610eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee6906156bc565b60405180910390fd5b610efa838383612846565b505050565b6000610f1682600d54612aa290919063ffffffff16565b9050919050565b601081565b6000610f2d8361141a565b8210610f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f65906153bc565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f4081565b610ffb6126a7565b73ffffffffffffffffffffffffffffffffffffffff16611019611935565b73ffffffffffffffffffffffffffffffffffffffff161461106f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611066906155bc565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b6110b683838360405180602001604052806000815250611db5565b505050565b6110cc6110c66126a7565b82612768565b61110b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111029061573c565b60405180910390fd5b61111481612ab8565b50565b60146020528060005260406000206000915090505481565b6111376126a7565b73ffffffffffffffffffffffffffffffffffffffff16611155611935565b73ffffffffffffffffffffffffffffffffffffffff16146111ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a2906155bc565b60405180910390fd5b42600e81905550565b600f60009054906101000a900460ff1681565b60006111d1610e7a565b8210611212576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611209906156dc565b60405180910390fd5b6008828154811061124c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6112666126a7565b73ffffffffffffffffffffffffffffffffffffffff16611284611935565b73ffffffffffffffffffffffffffffffffffffffff16146112da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d1906155bc565b60405180910390fd5b80601690805190602001906112f0929190614114565b5050565b600e5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139a9061553c565b60405180910390fd5b80915050919050565b60005b82829050811015611415576114028383838181106113f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135612bc9565b808061140d90615bf5565b9150506113af565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561148b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114829061551c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114da6126a7565b73ffffffffffffffffffffffffffffffffffffffff166114f8611935565b73ffffffffffffffffffffffffffffffffffffffff161461154e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611545906155bc565b60405180910390fd5b6115586000612f5f565b565b61089581565b600061156a613025565b90506000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601160019054906101000a900460ff166115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f69061547c565b60405180910390fd5b60008111611642576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116399061545c565b60405180910390fd5b80831115611685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167c9061567c565b60405180910390fd5b61089583836116949190615856565b11156116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cc9061555c565b60405180910390fd5b6003831115611719576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117109061565c565b60405180910390fd5b61172283610eff565b341015611764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175b906155fc565b60405180910390fd5b82816117709190615aa8565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b838110156117da576117c733613036565b80806117d290615bf5565b9150506117b6565b50505050565b601160019054906101000a900460ff1681565b6117fb6126a7565b73ffffffffffffffffffffffffffffffffffffffff16611819611935565b73ffffffffffffffffffffffffffffffffffffffff161461186f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611866906155bc565b60405180910390fd5b6000479050600061189d606461188f603285612aa290919063ffffffff16565b6130d890919063ffffffff16565b905060006118c860646118ba603286612aa290919063ffffffff16565b6130d890919063ffffffff16565b9050600083116118d757600080fd5b6118f57391e2c907d583748ef33e0faa2c29656adb757453836130ee565b61191373b2e2e105312f17cacdfd92931781587cd783f995826130ee565b505050565b60136020528060005260406000206000915090505481565b600381565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60156020528060005260406000206000915090505481565b60606001805461198690615bc3565b80601f01602080910402602001604051908101604052809291908181526020018280546119b290615bc3565b80156119ff5780601f106119d4576101008083540402835291602001916119ff565b820191906000526020600020905b8154815290600101906020018083116119e257829003601f168201915b5050505050905090565b602081565b6000611a18613025565b9050601160009054906101000a900460ff16611a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a609061547c565b60405180910390fd5b6108958282611a789190615856565b1115611ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab09061555c565b60405180910390fd5b6003821115611afd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af49061565c565b60405180910390fd5b611b0682610eff565b341015611b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3f906155fc565b60405180910390fd5b60005b82811015611b6f57611b5c33613036565b8080611b6790615bf5565b915050611b4b565b505050565b611b7c6126a7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be1906154bc565b60405180910390fd5b8060056000611bf76126a7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ca46126a7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ce99190615344565b60405180910390a35050565b611cfd6126a7565b73ffffffffffffffffffffffffffffffffffffffff16611d1b611935565b73ffffffffffffffffffffffffffffffffffffffff1614611d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d68906155bc565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611dc6611dc06126a7565b83612768565b611e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfc906156bc565b60405180910390fd5b611e118484848461319f565b50505050565b60005b83839050811015611e8157611e6e848483818110611e61577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135836131fb565b8080611e7990615bf5565b915050611e1a565b50505050565b601160009054906101000a900460ff1681565b6060611ea58261263b565b611ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edb9061561c565b60405180910390fd5b60006040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525090506000611f286132ec565b90506000815111611f485760405180602001604052806000815250611f92565b80611f65601360008781526020019081526020016000205461337e565b83611f6f8761337e565b604051602001611f829493929190615235565b6040516020818303038152906040525b92505050919050565b611fa36126a7565b73ffffffffffffffffffffffffffffffffffffffff16611fc1611935565b73ffffffffffffffffffffffffffffffffffffffff1614612017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200e906155bc565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b600061204d610e7a565b9050611f408110612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208a9061571c565b60405180910390fd5b60006120a56120a0610e7a565b61352b565b9050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac33836040518363ffffffff1660e01b815260040161210492919061531b565b600060405180830381600087803b15801561211e57600080fd5b505af1158015612132573d6000803e3d6000fd5b5050505061213f33613036565b5050565b6016805461215090615bc3565b80601f016020809104026020016040519081016040528092919081815260200182805461217c90615bc3565b80156121c95780601f1061219e576101008083540402835291602001916121c9565b820191906000526020600020905b8154815290600101906020018083116121ac57829003601f168201915b505050505081565b6121d96126a7565b73ffffffffffffffffffffffffffffffffffffffff166121f7611935565b73ffffffffffffffffffffffffffffffffffffffff161461224d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612244906155bc565b60405180910390fd5b60005b8484905081101561233e57828282818110612294577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135601260008787858181106122d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906122ed9190614384565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061233690615bf5565b915050612250565b5050505050565b61234d6126a7565b73ffffffffffffffffffffffffffffffffffffffff1661236b611935565b73ffffffffffffffffffffffffffffffffffffffff16146123c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b8906155bc565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60126020528060005260406000206000915090505481565b60106020528060005260406000206000915090505481565b6124b96126a7565b73ffffffffffffffffffffffffffffffffffffffff166124d7611935565b73ffffffffffffffffffffffffffffffffffffffff161461252d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612524906155bc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561259d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612594906153fc565b60405180910390fd5b6125a681612f5f565b50565b7391e2c907d583748ef33e0faa2c29656adb75745381565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612634575061263382613600565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612722836112fa565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006127738261263b565b6127b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a9906154dc565b60405180910390fd5b60006127bd836112fa565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061282c57508373ffffffffffffffffffffffffffffffffffffffff1661281484610cdd565b73ffffffffffffffffffffffffffffffffffffffff16145b8061283d575061283c81856123ed565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612866826112fa565b73ffffffffffffffffffffffffffffffffffffffff16146128bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b3906155dc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561292c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129239061549c565b60405180910390fd5b6129378383836136e2565b6129426000826126af565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129929190615aa8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129e99190615856565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612ab09190615a4e565b905092915050565b6000612ac3826112fa565b9050612ad1816000846136e2565b612adc6000836126af565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b2c9190615aa8565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b3373ffffffffffffffffffffffffffffffffffffffff16612be9826112fa565b73ffffffffffffffffffffffffffffffffffffffff1614612c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c369061539c565b60405180910390fd5b600f60009054906101000a900460ff16612c8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c85906156fc565b60405180910390fd5b600060146000838152602001908152602001600020541415612e9057600062015180612710600e5460106000868152602001908152602001600020541015612cd857600e54612ced565b60106000858152602001908152602001600020545b42612cf89190615aa8565b612d029190615a4e565b612d0c91906158ac565b90506000816015600085815260200190815260200160002054612d2f9190615856565b905061271081612d3f9190615c48565b60156000858152602001908152602001600020819055506000612710601560008681526020019081526020016000205483612d7a9190615aa8565b612d8491906158ac565b9050610895841015612e04576020816013600087815260200190815260200160002054612db19190615856565b11612de55780601360008681526020019081526020016000206000828254612dd99190615856565b92505081905550612dff565b602060136000868152602001908152602001600020819055505b612e74565b6010816013600087815260200190815260200160002054612e259190615856565b11612e595780601360008681526020019081526020016000206000828254612e4d9190615856565b92505081905550612e73565b601060136000868152602001908152602001600020819055505b5b4260106000868152602001908152602001600020819055505050505b600160146000838152602001908152602001600020541415612f5c57600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933612ef4846136f2565b6040518363ffffffff1660e01b8152600401612f1192919061531b565b600060405180830381600087803b158015612f2b57600080fd5b505af1158015612f3f573d6000803e3d6000fd5b505050504260106000838152602001908152602001600020819055505b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000613031600b61378b565b905090565b6000613040613025565b905061304c600b613799565b61305682826137af565b61305e6137cd565b60136000838152602001908152602001600020819055506001601460008381526020019081526020016000208190555060006015600083815260200190815260200160002081905550807f0917cc144b0b4c380ffcd22bd3c84b58a8e4ed7fb8b3fdfa347bb5cf17f311b360405160405180910390a25050565b600081836130e691906158ac565b905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161311490615273565b60006040518083038185875af1925050503d8060008114613151576040519150601f19603f3d011682016040523d82523d6000602084013e613156565b606091505b505090508061319a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131919061569c565b60405180910390fd5b505050565b6131aa848484612846565b6131b684848484613802565b6131f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ec906153dc565b60405180910390fd5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff1661321b836112fa565b73ffffffffffffffffffffffffffffffffffffffff1614613271576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132689061539c565b60405180910390fd5b80601460008481526020019081526020016000205414156132c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132be9061543c565b60405180910390fd5b6132d082612bc9565b8060146000848152602001908152602001600020819055505050565b6060601680546132fb90615bc3565b80601f016020809104026020016040519081016040528092919081815260200182805461332790615bc3565b80156133745780601f1061334957610100808354040283529160200191613374565b820191906000526020600020905b81548152906001019060200180831161335757829003601f168201915b5050505050905090565b606060008214156133c6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613526565b600082905060005b600082146133f85780806133e190615bf5565b915050600a826133f191906158ac565b91506133ce565b60008167ffffffffffffffff81111561343a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561346c5781602001600182028036833780820191505090505b5090505b6000851461351f576001826134859190615aa8565b9150600a856134949190615c48565b60306134a09190615856565b60f81b8183815181106134dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561351891906158ac565b9450613470565b8093505050505b919050565b60006109c4821015613548576801bc16d674ec80000090506135fb565b610bb8821015613563576806f05b59d3b200000090506135fb565b610dac82101561357e57681bc16d674ec800000090506135fb565b610fa082101561359957686f05b59d3b2000000090506135fb565b6111948210156135b5576901bc16d674ec8000000090506135fb565b61157c8210156135d1576903782dace9d90000000090506135fb565b611b588210156135ed57691bc16d674ec80000000090506135fb565b691bc16d674ec80000000090505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806136cb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806136db57506136da82613999565b5b9050919050565b6136ed838383613a03565b505050565b600062015180670de0b6b3a7640000600e546010600086815260200190815260200160002054101561372657600e5461373b565b60106000858152602001908152602001600020545b426137469190615aa8565b600260136000878152602001908152602001600020546137669190615930565b6137709190615a4e565b61377a9190615a4e565b61378491906158ac565b9050919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6137c9828260405180602001604052806000815250613b17565b5050565b6000806137d8613b72565b9050600060029050604b82106137ed57600390505b605f82106137fa57600490505b809250505090565b60006138238473ffffffffffffffffffffffffffffffffffffffff16613bb6565b1561398c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261384c6126a7565b8786866040518563ffffffff1660e01b815260040161386e94939291906152cf565b602060405180830381600087803b15801561388857600080fd5b505af19250505080156138b957506040513d601f19601f820116820180604052508101906138b69190614666565b60015b61393c573d80600081146138e9576040519150601f19603f3d011682016040523d82523d6000602084013e6138ee565b606091505b50600081511415613934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161392b906153dc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613991565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613a0e838383613bc9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613a5157613a4c81613bce565b613a90565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613a8f57613a8e8382613c17565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ad357613ace81613d84565b613b12565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613b1157613b108282613ec7565b5b5b505050565b613b218383613f46565b613b2e6000848484613802565b613b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b64906153dc565b60405180910390fd5b505050565b6000804442604051602001613b88929190615288565b6040516020818303038152906040528051906020012060001c9050606481613bb09190615c48565b91505090565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613c248461141a565b613c2e9190615aa8565b9050600060076000848152602001908152602001600020549050818114613d13576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613d989190615aa8565b9050600060096000848152602001908152602001600020549050600060088381548110613dee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613e36577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613eab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613ed28361141a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fad9061557c565b60405180910390fd5b613fbf8161263b565b15613fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ff69061541c565b60405180910390fd5b61400b600083836136e2565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461405b9190615856565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461412090615bc3565b90600052602060002090601f0160209004810192826141425760008555614189565b82601f1061415b57805160ff1916838001178555614189565b82800160010185558215614189579182015b8281111561418857825182559160200191906001019061416d565b5b509050614196919061419a565b5090565b5b808211156141b357600081600090555060010161419b565b5090565b60006141ca6141c5846157a8565b615777565b9050828152602081018484840111156141e257600080fd5b6141ed848285615b81565b509392505050565b6000614208614203846157d8565b615777565b90508281526020810184848401111561422057600080fd5b61422b848285615b81565b509392505050565b60008135905061424281615d53565b92915050565b60008083601f84011261425a57600080fd5b8235905067ffffffffffffffff81111561427357600080fd5b60208301915083602082028301111561428b57600080fd5b9250929050565b60008083601f8401126142a457600080fd5b8235905067ffffffffffffffff8111156142bd57600080fd5b6020830191508360208202830111156142d557600080fd5b9250929050565b6000813590506142eb81615d6a565b92915050565b60008135905061430081615d81565b92915050565b60008151905061431581615d81565b92915050565b600082601f83011261432c57600080fd5b813561433c8482602086016141b7565b91505092915050565b600082601f83011261435657600080fd5b81356143668482602086016141f5565b91505092915050565b60008135905061437e81615d98565b92915050565b60006020828403121561439657600080fd5b60006143a484828501614233565b91505092915050565b600080604083850312156143c057600080fd5b60006143ce85828601614233565b92505060206143df85828601614233565b9150509250929050565b6000806000606084860312156143fe57600080fd5b600061440c86828701614233565b935050602061441d86828701614233565b925050604061442e8682870161436f565b9150509250925092565b6000806000806080858703121561444e57600080fd5b600061445c87828801614233565b945050602061446d87828801614233565b935050604061447e8782880161436f565b925050606085013567ffffffffffffffff81111561449b57600080fd5b6144a78782880161431b565b91505092959194509250565b600080604083850312156144c657600080fd5b60006144d485828601614233565b92505060206144e5858286016142dc565b9150509250929050565b6000806040838503121561450257600080fd5b600061451085828601614233565b92505060206145218582860161436f565b9150509250929050565b6000806000806040858703121561454157600080fd5b600085013567ffffffffffffffff81111561455b57600080fd5b61456787828801614248565b9450945050602085013567ffffffffffffffff81111561458657600080fd5b61459287828801614292565b925092505092959194509250565b600080602083850312156145b357600080fd5b600083013567ffffffffffffffff8111156145cd57600080fd5b6145d985828601614292565b92509250509250929050565b6000806000604084860312156145fa57600080fd5b600084013567ffffffffffffffff81111561461457600080fd5b61462086828701614292565b935093505060206146338682870161436f565b9150509250925092565b60006020828403121561464f57600080fd5b600061465d848285016142f1565b91505092915050565b60006020828403121561467857600080fd5b600061468684828501614306565b91505092915050565b6000602082840312156146a157600080fd5b600082013567ffffffffffffffff8111156146bb57600080fd5b6146c784828501614345565b91505092915050565b6000602082840312156146e257600080fd5b60006146f08482850161436f565b91505092915050565b61470281615adc565b82525050565b61471181615aee565b82525050565b600061472282615808565b61472c818561581e565b935061473c818560208601615b90565b61474581615d35565b840191505092915050565b61475981615b5d565b82525050565b600061476a82615813565b614774818561583a565b9350614784818560208601615b90565b61478d81615d35565b840191505092915050565b60006147a382615813565b6147ad818561584b565b93506147bd818560208601615b90565b80840191505092915050565b60006147d6601e8361583a565b91507f596f7520646f206e6f74206f776e207468697320436f6c6f7220506c6f7400006000830152602082019050919050565b6000614816602b8361583a565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061487c60328361583a565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006148e260268361583a565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614948601c8361583a565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061498860278361583a565b91507f596f757220706c6f7420697320616c72656164792073657420746f207468697360008301527f20737461747573000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006149ee602a8361583a565b91507f596f7520646f206e6f74206861766520616e792070726573616c65206d696e7460008301527f73207265736572766564000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a5460198361583a565b91507f5075626c69632053616c65206973206e6f7420616374697665000000000000006000830152602082019050919050565b6000614a9460248361583a565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614afa60198361583a565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614b3a602c8361583a565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614ba060388361583a565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614c06602a8361583a565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c6c60298361583a565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614cd2601a8361583a565b91507f416c6c20706c6f74732068617665206265656e206d696e7465640000000000006000830152602082019050919050565b6000614d1260208361583a565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614d52602c8361583a565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614db860208361583a565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614df860298361583a565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e5e60138361583a565b91507f4e6f7420656e6f756768206574682073656e74000000000000000000000000006000830152602082019050919050565b6000614e9e602f8361583a565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614f0460218361583a565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614f6a600c8361583a565b91507f33206d61782070657220747800000000000000000000000000000000000000006000830152602082019050919050565b6000614faa601f8361583a565b91507f596f7520646f206e6f74206861766520656e6f756768207265736572766564006000830152602082019050919050565b6000614fea60008361582f565b9150600082019050919050565b600061500460108361583a565b91507f5472616e73666572206661696c65642e000000000000000000000000000000006000830152602082019050919050565b600061504460318361583a565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006150aa602c8361583a565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000615110601a8361583a565b91507f436c61696d696e672024537461746963206973207061757365640000000000006000830152602082019050919050565b600061515060238361583a565b91507f416c6c20436f6c6f7220506c6f74732068617665206265656e2067656e65726160008301527f74656400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006151b660308361583a565b91507f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f766564000000000000000000000000000000006020830152604082019050919050565b61521881615b46565b82525050565b61522f61522a82615b46565b615c3e565b82525050565b60006152418287614798565b915061524d8286614798565b91506152598285614798565b91506152658284614798565b915081905095945050505050565b600061527e82614fdd565b9150819050919050565b6000615294828561521e565b6020820191506152a4828461521e565b6020820191508190509392505050565b60006020820190506152c960008301846146f9565b92915050565b60006080820190506152e460008301876146f9565b6152f160208301866146f9565b6152fe604083018561520f565b81810360608301526153108184614717565b905095945050505050565b600060408201905061533060008301856146f9565b61533d602083018461520f565b9392505050565b60006020820190506153596000830184614708565b92915050565b60006020820190506153746000830184614750565b92915050565b60006020820190508181036000830152615394818461475f565b905092915050565b600060208201905081810360008301526153b5816147c9565b9050919050565b600060208201905081810360008301526153d581614809565b9050919050565b600060208201905081810360008301526153f58161486f565b9050919050565b60006020820190508181036000830152615415816148d5565b9050919050565b600060208201905081810360008301526154358161493b565b9050919050565b600060208201905081810360008301526154558161497b565b9050919050565b60006020820190508181036000830152615475816149e1565b9050919050565b6000602082019050818103600083015261549581614a47565b9050919050565b600060208201905081810360008301526154b581614a87565b9050919050565b600060208201905081810360008301526154d581614aed565b9050919050565b600060208201905081810360008301526154f581614b2d565b9050919050565b6000602082019050818103600083015261551581614b93565b9050919050565b6000602082019050818103600083015261553581614bf9565b9050919050565b6000602082019050818103600083015261555581614c5f565b9050919050565b6000602082019050818103600083015261557581614cc5565b9050919050565b6000602082019050818103600083015261559581614d05565b9050919050565b600060208201905081810360008301526155b581614d45565b9050919050565b600060208201905081810360008301526155d581614dab565b9050919050565b600060208201905081810360008301526155f581614deb565b9050919050565b6000602082019050818103600083015261561581614e51565b9050919050565b6000602082019050818103600083015261563581614e91565b9050919050565b6000602082019050818103600083015261565581614ef7565b9050919050565b6000602082019050818103600083015261567581614f5d565b9050919050565b6000602082019050818103600083015261569581614f9d565b9050919050565b600060208201905081810360008301526156b581614ff7565b9050919050565b600060208201905081810360008301526156d581615037565b9050919050565b600060208201905081810360008301526156f58161509d565b9050919050565b6000602082019050818103600083015261571581615103565b9050919050565b6000602082019050818103600083015261573581615143565b9050919050565b60006020820190508181036000830152615755816151a9565b9050919050565b6000602082019050615771600083018461520f565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561579e5761579d615d06565b5b8060405250919050565b600067ffffffffffffffff8211156157c3576157c2615d06565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156157f3576157f2615d06565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061586182615b46565b915061586c83615b46565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156158a1576158a0615c79565b5b828201905092915050565b60006158b782615b46565b91506158c283615b46565b9250826158d2576158d1615ca8565b5b828204905092915050565b6000808291508390505b60018511156159275780860481111561590357615902615c79565b5b60018516156159125780820291505b808102905061592085615d46565b94506158e7565b94509492505050565b600061593b82615b46565b915061594683615b50565b92506159737fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461597b565b905092915050565b60008261598b5760019050615a47565b816159995760009050615a47565b81600181146159af57600281146159b9576159e8565b6001915050615a47565b60ff8411156159cb576159ca615c79565b5b8360020a9150848211156159e2576159e1615c79565b5b50615a47565b5060208310610133831016604e8410600b8410161715615a1d5782820a905083811115615a1857615a17615c79565b5b615a47565b615a2a84848460016158dd565b92509050818404811115615a4157615a40615c79565b5b81810290505b9392505050565b6000615a5982615b46565b9150615a6483615b46565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615a9d57615a9c615c79565b5b828202905092915050565b6000615ab382615b46565b9150615abe83615b46565b925082821015615ad157615ad0615c79565b5b828203905092915050565b6000615ae782615b26565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615b6882615b6f565b9050919050565b6000615b7a82615b26565b9050919050565b82818337600083830152505050565b60005b83811015615bae578082015181840152602081019050615b93565b83811115615bbd576000848401525b50505050565b60006002820490506001821680615bdb57607f821691505b60208210811415615bef57615bee615cd7565b5b50919050565b6000615c0082615b46565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615c3357615c32615c79565b5b600182019050919050565b6000819050919050565b6000615c5382615b46565b9150615c5e83615b46565b925082615c6e57615c6d615ca8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b615d5c81615adc565b8114615d6757600080fd5b50565b615d7381615aee565b8114615d7e57600080fd5b50565b615d8a81615afa565b8114615d9557600080fd5b50565b615da181615b46565b8114615dac57600080fd5b5056fea26469706673582212209d1b88e2beeae8b61118cac747706258734cd1b526efbc10885d648e5b5c655964736f6c63430008000033

Deployed Bytecode Sourcemap

53116:10415:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63343:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33928:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53482:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35487:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35010:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47385:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53799:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36377:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57036:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53655:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47053:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53344:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53434:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61088:79;;;;;;;;;;;;;:::i;:::-;;36787:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45563:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54216:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59126:103;;;;;;;;;;;;;:::i;:::-;;53932:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47575:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57736:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53888:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33622:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60627:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33352:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13627:94;;;;;;;;;;;;;:::i;:::-;;53378:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55655:750;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54068:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62575:337;;;:::i;:::-;;54169:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53555:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12976:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54316:54;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34097:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53603:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55159:468;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35780:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58100:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37043:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61564:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54025:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57337:381;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54902:91;;;;;;;;;;;;;:::i;:::-;;58268:316;;;;;;;;;;;;;:::i;:::-;;54383:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56764:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54766:100;;;;;;;;;;;;;:::i;:::-;;36146:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54110:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53968:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13876:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53712:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63343:179;63454:4;63478:36;63502:11;63478:23;:36::i;:::-;63471:43;;63343:179;;;:::o;33928:100::-;33982:13;34015:5;34008:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33928:100;:::o;53482:45::-;;;;:::o;35487:221::-;35563:7;35591:16;35599:7;35591;:16::i;:::-;35583:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35676:15;:24;35692:7;35676:24;;;;;;;;;;;;;;;;;;;;;35669:31;;35487:221;;;:::o;35010:411::-;35091:13;35107:23;35122:7;35107:14;:23::i;:::-;35091:39;;35155:5;35149:11;;:2;:11;;;;35141:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;35249:5;35233:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;35258:37;35275:5;35282:12;:10;:12::i;:::-;35258:16;:37::i;:::-;35233:62;35211:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;35392:21;35401:2;35405:7;35392:8;:21::i;:::-;35010:411;;;:::o;47385:113::-;47446:7;47473:10;:17;;;;47466:24;;47385:113;:::o;53799:80::-;53837:42;53799:80;:::o;36377:339::-;36572:41;36591:12;:10;:12::i;:::-;36605:7;36572:18;:41::i;:::-;36564:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;36680:28;36690:4;36696:2;36700:7;36680:9;:28::i;:::-;36377:339;;;:::o;57036:116::-;57088:7;57115:29;57137:6;57115:17;;:21;;:29;;;;:::i;:::-;57108:36;;57036:116;;;:::o;53655:48::-;53701:2;53655:48;:::o;47053:256::-;47150:7;47186:23;47203:5;47186:16;:23::i;:::-;47178:5;:31;47170:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;47275:12;:19;47288:5;47275:19;;;;;;;;;;;;;;;:26;47295:5;47275:26;;;;;;;;;;;;47268:33;;47053:256;;;;:::o;53344:21::-;;;;;;;;;;;;;:::o;53434:41::-;53471:4;53434:41;:::o;61088:79::-;13207:12;:10;:12::i;:::-;13196:23;;:7;:5;:7::i;:::-;:23;;;13188:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61152:7:::1;;;;;;;;;;;61151:8;61141:7;;:18;;;;;;;;;;;;;;;;;;61088:79::o:0;36787:185::-;36925:39;36942:4;36948:2;36952:7;36925:39;;;;;;;;;;;;:16;:39::i;:::-;36787:185;;;:::o;45563:245::-;45681:41;45700:12;:10;:12::i;:::-;45714:7;45681:18;:41::i;:::-;45673:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;45786:14;45792:7;45786:5;:14::i;:::-;45563:245;:::o;54216:42::-;;;;;;;;;;;;;;;;;:::o;59126:103::-;13207:12;:10;:12::i;:::-;13196:23;;:7;:5;:7::i;:::-;:23;;;13188:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59206:15:::1;59187:16;:34;;;;59126:103::o:0;53932:27::-;;;;;;;;;;;;;:::o;47575:233::-;47650:7;47686:30;:28;:30::i;:::-;47678:5;:38;47670:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;47783:10;47794:5;47783:17;;;;;;;;;;;;;;;;;;;;;;;;47776:24;;47575:233;;;:::o;57736:101::-;13207:12;:10;:12::i;:::-;13196:23;;:7;:5;:7::i;:::-;:23;;;13188:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57822:7:::1;57807:12;:22;;;;;;;;;;;;:::i;:::-;;57736:101:::0;:::o;53888:31::-;;;;:::o;33622:239::-;33694:7;33714:13;33730:7;:16;33738:7;33730:16;;;;;;;;;;;;;;;;;;;;;33714:32;;33782:1;33765:19;;:5;:19;;;;33757:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33848:5;33841:12;;;33622:239;;;:::o;60627:146::-;60690:9;60686:80;60709:3;;:10;;60705:1;:14;60686:80;;;60740:14;60747:3;;60751:1;60747:6;;;;;;;;;;;;;;;;;;;;;60740;:14::i;:::-;60721:3;;;;;:::i;:::-;;;;60686:80;;;;60627:146;;:::o;33352:208::-;33424:7;33469:1;33452:19;;:5;:19;;;;33444:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;33536:9;:16;33546:5;33536:16;;;;;;;;;;;;;;;;33529:23;;33352:208;;;:::o;13627:94::-;13207:12;:10;:12::i;:::-;13196:23;;:7;:5;:7::i;:::-;:23;;;13188:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13692:21:::1;13710:1;13692:9;:21::i;:::-;13627:94::o:0;53378:49::-;53423:4;53378:49;:::o;55655:750::-;55718:13;55734:14;:12;:14::i;:::-;55718:30;;55759:19;55781:16;:28;55798:10;55781:28;;;;;;;;;;;;;;;;55759:50;;55828:13;;;;;;;;;;;55820:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;55904:1;55890:11;:15;55882:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;55981:11;55971:6;:21;;55963:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53423:4;56055:6;56047:5;:14;;;;:::i;:::-;:36;;56039:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;53593:1;56133:6;:21;;56125:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;56203:13;56209:6;56203:5;:13::i;:::-;56190:9;:26;;56182:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;56296:6;56282:11;:20;;;;:::i;:::-;56251:16;:28;56268:10;56251:28;;;;;;;;;;;;;;;:51;;;;56318:9;56313:85;56337:6;56333:1;:10;56313:85;;;56365:21;56375:10;56365:9;:21::i;:::-;56345:3;;;;;:::i;:::-;;;;56313:85;;;;55655:750;;;:::o;54068:33::-;;;;;;;;;;;;;:::o;62575:337::-;13207:12;:10;:12::i;:::-;13196:23;;:7;:5;:7::i;:::-;:23;;;13188:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62634:15:::1;62652:21;62634:39;;62684:17;62704:24;62724:3;62704:15;62716:2;62704:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;62684:44;;62739:17;62759:24;62779:3;62759:15;62771:2;62759:7;:11;;:15;;;;:::i;:::-;:19;;:24;;;;:::i;:::-;62739:44;;62814:1;62804:7;:11;62796:20;;;::::0;::::1;;62827:33;53750:42;62850:9;62827;:33::i;:::-;62871;53837:42;62894:9;62871;:33::i;:::-;13267:1;;;62575:337::o:0;54169:40::-;;;;;;;;;;;;;;;;;:::o;53555:39::-;53593:1;53555:39;:::o;12976:87::-;13022:7;13049:6;;;;;;;;;;;13042:13;;12976:87;:::o;54316:54::-;;;;;;;;;;;;;;;;;:::o;34097:104::-;34153:13;34186:7;34179:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34097:104;:::o;53603:45::-;53646:2;53603:45;:::o;55159:468::-;55215:13;55231:14;:12;:14::i;:::-;55215:30;;55264:16;;;;;;;;;;;55256:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;53423:4;55337:6;55329:5;:14;;;;:::i;:::-;:36;;55321:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;53593:1;55415:6;:21;;55407:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;55485:13;55491:6;55485:5;:13::i;:::-;55472:9;:26;;55464:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;55540:9;55535:85;55559:6;55555:1;:10;55535:85;;;55587:21;55597:10;55587:9;:21::i;:::-;55567:3;;;;;:::i;:::-;;;;55535:85;;;;55159:468;;:::o;35780:295::-;35895:12;:10;:12::i;:::-;35883:24;;:8;:24;;;;35875:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;35995:8;35950:18;:32;35969:12;:10;:12::i;:::-;35950:32;;;;;;;;;;;;;;;:42;35983:8;35950:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;36048:8;36019:48;;36034:12;:10;:12::i;:::-;36019:48;;;36058:8;36019:48;;;;;;:::i;:::-;;;;;;;;35780:295;;:::o;58100:112::-;13207:12;:10;:12::i;:::-;13196:23;;:7;:5;:7::i;:::-;:23;;;13188:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58193:10:::1;58176:6;;:28;;;;;;;;;;;;;;;;;;58100:112:::0;:::o;37043:328::-;37218:41;37237:12;:10;:12::i;:::-;37251:7;37218:18;:41::i;:::-;37210:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37324:39;37338:4;37344:2;37348:7;37357:5;37324:13;:39::i;:::-;37043:328;;;;:::o;61564:186::-;61651:9;61646:97;61670:3;;:10;;61666:1;:14;61646:97;;;61702:29;61713:3;;61717:1;61713:6;;;;;;;;;;;;;;;;;;;;;61721:9;61702:10;:29::i;:::-;61682:3;;;;;:::i;:::-;;;;61646:97;;;;61564:186;;;:::o;54025:36::-;;;;;;;;;;;;;:::o;57337:381::-;57405:13;57439:11;57447:2;57439:7;:11::i;:::-;57431:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;57513:19;:25;;;;;;;;;;;;;;;;;;;57549:21;57573:10;:8;:10::i;:::-;57549:34;;57625:1;57607:7;57601:21;:25;:109;;;;;;;;;;;;;;;;;57653:7;57662:19;:4;:8;57667:2;57662:8;;;;;;;;;;;;:17;:19::i;:::-;57683:5;57690:13;:2;:11;:13::i;:::-;57636:68;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57601:109;57594:116;;;;57337:381;;;:::o;54902:91::-;13207:12;:10;:12::i;:::-;13196:23;;:7;:5;:7::i;:::-;:23;;;13188:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54972:13:::1;;;;;;;;;;;54971:14;54955:13;;:30;;;;;;;;;;;;;;;;;;54902:91::o:0;58268:316::-;58317:14;58334:13;:11;:13::i;:::-;58317:30;;53471:4;58366:6;:19;58358:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;58436:22;58461:33;58480:13;:11;:13::i;:::-;58461:18;:33::i;:::-;58436:58;;58505:6;;;;;;;;;;;:11;;;58517:10;58529:14;58505:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58555:21;58565:10;58555:9;:21::i;:::-;58268:316;;:::o;54383:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56764:225::-;13207:12;:10;:12::i;:::-;13196:23;;:7;:5;:7::i;:::-;:23;;;13188:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56877:9:::1;56873:109;56892:9;;:16;;56888:1;:20;56873:109;;;56962:5;;56968:1;56962:8;;;;;;;;;;;;;;;;;;;;;56929:16;:30;56946:9;;56956:1;56946:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56929:30;;;;;;;;;;;;;;;:41;;;;56910:3;;;;;:::i;:::-;;;;56873:109;;;;56764:225:::0;;;;:::o;54766:100::-;13207:12;:10;:12::i;:::-;13196:23;;:7;:5;:7::i;:::-;:23;;;13188:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54842:16:::1;;;;;;;;;;;54841:17;54822:16;;:36;;;;;;;;;;;;;;;;;;54766:100::o:0;36146:164::-;36243:4;36267:18;:25;36286:5;36267:25;;;;;;;;;;;;;;;:35;36293:8;36267:35;;;;;;;;;;;;;;;;;;;;;;;;;36260:42;;36146:164;;;;:::o;54110:52::-;;;;;;;;;;;;;;;;;:::o;53968:50::-;;;;;;;;;;;;;;;;;:::o;13876:192::-;13207:12;:10;:12::i;:::-;13196:23;;:7;:5;:7::i;:::-;:23;;;13188:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13985:1:::1;13965:22;;:8;:22;;;;13957:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14041:19;14051:8;14041:9;:19::i;:::-;13876:192:::0;:::o;53712:80::-;53750:42;53712:80;:::o;46745:224::-;46847:4;46886:35;46871:50;;;:11;:50;;;;:90;;;;46925:36;46949:11;46925:23;:36::i;:::-;46871:90;46864:97;;46745:224;;;:::o;38881:127::-;38946:4;38998:1;38970:30;;:7;:16;38978:7;38970:16;;;;;;;;;;;;;;;;;;;;;:30;;;;38963:37;;38881:127;;;:::o;11764:98::-;11817:7;11844:10;11837:17;;11764:98;:::o;42863:174::-;42965:2;42938:15;:24;42954:7;42938:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43021:7;43017:2;42983:46;;42992:23;43007:7;42992:14;:23::i;:::-;42983:46;;;;;;;;;;;;42863:174;;:::o;39175:348::-;39268:4;39293:16;39301:7;39293;:16::i;:::-;39285:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39369:13;39385:23;39400:7;39385:14;:23::i;:::-;39369:39;;39438:5;39427:16;;:7;:16;;;:51;;;;39471:7;39447:31;;:20;39459:7;39447:11;:20::i;:::-;:31;;;39427:51;:87;;;;39482:32;39499:5;39506:7;39482:16;:32::i;:::-;39427:87;39419:96;;;39175:348;;;;:::o;42167:578::-;42326:4;42299:31;;:23;42314:7;42299:14;:23::i;:::-;:31;;;42291:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;42409:1;42395:16;;:2;:16;;;;42387:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42465:39;42486:4;42492:2;42496:7;42465:20;:39::i;:::-;42569:29;42586:1;42590:7;42569:8;:29::i;:::-;42630:1;42611:9;:15;42621:4;42611:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;42659:1;42642:9;:13;42652:2;42642:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42690:2;42671:7;:16;42679:7;42671:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42729:7;42725:2;42710:27;;42719:4;42710:27;;;;;;;;;;;;42167:578;;;:::o;5642:98::-;5700:7;5731:1;5727;:5;;;;:::i;:::-;5720:12;;5642:98;;;;:::o;41470:360::-;41530:13;41546:23;41561:7;41546:14;:23::i;:::-;41530:39;;41582:48;41603:5;41618:1;41622:7;41582:20;:48::i;:::-;41671:29;41688:1;41692:7;41671:8;:29::i;:::-;41733:1;41713:9;:16;41723:5;41713:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;41752:7;:16;41760:7;41752:16;;;;;;;;;;;;41745:23;;;;;;;;;;;41814:7;41810:1;41786:36;;41795:5;41786:36;;;;;;;;;;;;41470:360;;:::o;59277:1338::-;59348:10;59333:25;;:11;59341:2;59333:7;:11::i;:::-;:25;;;59325:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59412:7;;;;;;;;;;;59404:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;59479:1;59465:6;:10;59472:2;59465:10;;;;;;;;;;;;:15;59462:998;;;59496:23;59635:6;59627:5;59565:16;;59542:15;:19;59558:2;59542:19;;;;;;;;;;;;:39;;:80;;59606:16;;59542:80;;;59584:15;:19;59600:2;59584:19;;;;;;;;;;;;59542:80;59523:15;:100;;;;:::i;:::-;59522:110;;;;:::i;:::-;:119;;;;:::i;:::-;59496:145;;59656:21;59705:15;59680:18;:22;59699:2;59680:22;;;;;;;;;;;;:40;;;;:::i;:::-;59656:64;;59776:5;59760:13;:21;;;;:::i;:::-;59735:18;:22;59754:2;59735:22;;;;;;;;;;;:46;;;;59796:16;59858:5;59832:18;:22;59851:2;59832:22;;;;;;;;;;;;59816:13;:38;;;;:::i;:::-;59815:48;;;;:::i;:::-;59796:67;;53423:4;59896:2;:23;59893:504;;;53646:2;59954:8;59943:4;:8;59948:2;59943:8;;;;;;;;;;;;:19;;;;:::i;:::-;:39;59940:198;;60018:8;60006:4;:8;60011:2;60006:8;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;59940:198;;;53646:2;60091:4;:8;60096:2;60091:8;;;;;;;;;;;:27;;;;59940:198;59893:504;;;53701:2;60192:8;60181:4;:8;60186:2;60181:8;;;;;;;;;;;;:19;;;;:::i;:::-;:42;60178:204;;60259:8;60247:4;:8;60252:2;60247:8;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;60178:204;;;53701:2;60332:4;:8;60337:2;60332:8;;;;;;;;;;;:30;;;;60178:204;59893:504;60433:15;60411;:19;60427:2;60411:19;;;;;;;;;;;:37;;;;59462:998;;;;60487:1;60473:6;:10;60480:2;60473:10;;;;;;;;;;;;:15;60470:138;;;60504:6;;;;;;;;;;;:11;;;60516:10;60528:15;60540:2;60528:11;:15::i;:::-;60504:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60581:15;60559;:19;60575:2;60559:19;;;;;;;;;;;:37;;;;60470:138;59277:1338;:::o;14076:173::-;14132:16;14151:6;;;;;;;;;;;14132:25;;14177:8;14168:6;;:17;;;;;;;;;;;;;;;;;;14232:8;14201:40;;14222:8;14201:40;;;;;;;;;;;;14076:173;;:::o;55028:104::-;55075:4;55099:25;:15;:23;:25::i;:::-;55092:32;;55028:104;:::o;56444:280::-;56495:7;56505:14;:12;:14::i;:::-;56495:24;;56530:27;:15;:25;:27::i;:::-;56568:18;56578:3;56583:2;56568:9;:18::i;:::-;56608:15;:13;:15::i;:::-;56597:4;:8;56602:2;56597:8;;;;;;;;;;;:26;;;;56647:1;56634:6;:10;56641:2;56634:10;;;;;;;;;;;:14;;;;56684:1;56659:18;:22;56678:2;56659:22;;;;;;;;;;;:26;;;;56713:2;56701:15;;;;;;;;;;56444:280;;:::o;6041:98::-;6099:7;6130:1;6126;:5;;;;:::i;:::-;6119:12;;6041:98;;;;:::o;62920:180::-;62994:12;63012:8;:13;;63033:7;63012:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62993:52;;;63064:7;63056:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;62920:180;;;:::o;38253:315::-;38410:28;38420:4;38426:2;38430:7;38410:9;:28::i;:::-;38457:48;38480:4;38486:2;38490:7;38499:5;38457:22;:48::i;:::-;38449:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;38253:315;;;;:::o;61263:289::-;61357:10;61342:25;;:11;61350:2;61342:7;:11::i;:::-;:25;;;61334:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61435:9;61421:6;:10;61428:2;61421:10;;;;;;;;;;;;:23;;61413:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;61501:10;61508:2;61501:6;:10::i;:::-;61535:9;61522:6;:10;61529:2;61522:10;;;;;;;;;;;:22;;;;61263:289;;:::o;57170:113::-;57230:13;57263:12;57256:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57170:113;:::o;9380:723::-;9436:13;9666:1;9657:5;:10;9653:53;;;9684:10;;;;;;;;;;;;;;;;;;;;;9653:53;9716:12;9731:5;9716:20;;9747:14;9772:78;9787:1;9779:4;:9;9772:78;;9805:8;;;;;:::i;:::-;;;;9836:2;9828:10;;;;;:::i;:::-;;;9772:78;;;9860:19;9892:6;9882:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9860:39;;9910:154;9926:1;9917:5;:10;9910:154;;9954:1;9944:11;;;;;:::i;:::-;;;10021:2;10013:5;:10;;;;:::i;:::-;10000:2;:24;;;;:::i;:::-;9987:39;;9970:6;9977;9970:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;10050:2;10041:11;;;;;:::i;:::-;;;9910:154;;;10088:6;10074:21;;;;;9380:723;;;;:::o;58596:455::-;58663:7;58696:4;58687:6;:13;58683:35;;;58710:8;58702:16;;;;58683:35;58742:4;58733:6;:13;58729:36;;;58756:9;58748:17;;;;58729:36;58789:4;58780:6;:13;58776:36;;;58803:9;58795:17;;;;58776:36;58836:4;58827:6;:13;58823:37;;;58850:10;58842:18;;;;58823:37;58884:4;58875:6;:13;58871:37;;;58898:10;58890:18;;;;58871:37;58932:4;58923:6;:13;58919:38;;;58946:11;58938:19;;;;58919:38;58981:4;58972:6;:13;58968:75;;;58995:12;58987:20;;;;58968:75;59031:12;59023:20;;58596:455;;;;:::o;32983:305::-;33085:4;33137:25;33122:40;;;:11;:40;;;;:105;;;;33194:33;33179:48;;;:11;:48;;;;33122:105;:158;;;;33244:36;33268:11;33244:23;:36::i;:::-;33122:158;33102:178;;32983:305;;;:::o;63112:223::-;63282:45;63309:4;63315:2;63319:7;63282:26;:45::i;:::-;63112:223;;;:::o;60819:229::-;60874:7;61034:6;61024:7;60962:16;;60939:15;:19;60955:2;60939:19;;;;;;;;;;;;:39;;:80;;61003:16;;60939:80;;;60981:15;:19;60997:2;60981:19;;;;;;;;;;;;60939:80;60920:15;:100;;;;:::i;:::-;60914:1;60902:4;:8;60907:2;60902:8;;;;;;;;;;;;:13;;;;:::i;:::-;60901:120;;;;:::i;:::-;:130;;;;:::i;:::-;:139;;;;:::i;:::-;60894:146;;60819:229;;;:::o;1519:114::-;1584:7;1611;:14;;;1604:21;;1519:114;;;:::o;1641:127::-;1748:1;1730:7;:14;;;:19;;;;;;;;;;;1641:127;:::o;39865:110::-;39941:26;39951:2;39955:7;39941:26;;;;;;;;;;;;:9;:26::i;:::-;39865:110;;:::o;62275:275::-;62322:4;62339:9;62351:12;:10;:12::i;:::-;62339:24;;62374:12;62389:1;62374:16;;62413:2;62405:4;:10;62401:53;;62441:1;62431:11;;62401:53;62476:2;62468:4;:10;62464:54;;62505:1;62495:11;;62464:54;62535:7;62528:14;;;;62275:275;:::o;43602:799::-;43757:4;43778:15;:2;:13;;;:15::i;:::-;43774:620;;;43830:2;43814:36;;;43851:12;:10;:12::i;:::-;43865:4;43871:7;43880:5;43814:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43810:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44073:1;44056:6;:13;:18;44052:272;;;44099:60;;;;;;;;;;:::i;:::-;;;;;;;;44052:272;44274:6;44268:13;44259:6;44255:2;44251:15;44244:38;43810:529;43947:41;;;43937:51;;;:6;:51;;;;43930:58;;;;;43774:620;44378:4;44371:11;;43602:799;;;;;;;:::o;24962:157::-;25047:4;25086:25;25071:40;;;:11;:40;;;;25064:47;;24962:157;;;:::o;48421:589::-;48565:45;48592:4;48598:2;48602:7;48565:26;:45::i;:::-;48643:1;48627:18;;:4;:18;;;48623:187;;;48662:40;48694:7;48662:31;:40::i;:::-;48623:187;;;48732:2;48724:10;;:4;:10;;;48720:90;;48751:47;48784:4;48790:7;48751:32;:47::i;:::-;48720:90;48623:187;48838:1;48824:16;;:2;:16;;;48820:183;;;48857:45;48894:7;48857:36;:45::i;:::-;48820:183;;;48930:4;48924:10;;:2;:10;;;48920:83;;48951:40;48979:2;48983:7;48951:27;:40::i;:::-;48920:83;48820:183;48421:589;;;:::o;40202:321::-;40332:18;40338:2;40342:7;40332:5;:18::i;:::-;40383:54;40414:1;40418:2;40422:7;40431:5;40383:22;:54::i;:::-;40361:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;40202:321;;;:::o;62026:189::-;62070:4;62087:15;62137:16;62155:15;62120:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62110:62;;;;;;62105:68;;62087:86;;62204:3;62191:10;:16;;;;:::i;:::-;62184:23;;;62026:189;:::o;15022:387::-;15082:4;15290:12;15357:7;15345:20;15337:28;;15400:1;15393:4;:8;15386:15;;;15022:387;;;:::o;44973:126::-;;;;:::o;49733:164::-;49837:10;:17;;;;49810:15;:24;49826:7;49810:24;;;;;;;;;;;:44;;;;49865:10;49881:7;49865:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49733:164;:::o;50524:988::-;50790:22;50840:1;50815:22;50832:4;50815:16;:22::i;:::-;:26;;;;:::i;:::-;50790:51;;50852:18;50873:17;:26;50891:7;50873:26;;;;;;;;;;;;50852:47;;51020:14;51006:10;:28;51002:328;;51051:19;51073:12;:18;51086:4;51073:18;;;;;;;;;;;;;;;:34;51092:14;51073:34;;;;;;;;;;;;51051:56;;51157:11;51124:12;:18;51137:4;51124:18;;;;;;;;;;;;;;;:30;51143:10;51124:30;;;;;;;;;;;:44;;;;51274:10;51241:17;:30;51259:11;51241:30;;;;;;;;;;;:43;;;;51002:328;;51426:17;:26;51444:7;51426:26;;;;;;;;;;;51419:33;;;51470:12;:18;51483:4;51470:18;;;;;;;;;;;;;;;:34;51489:14;51470:34;;;;;;;;;;;51463:41;;;50524:988;;;;:::o;51807:1079::-;52060:22;52105:1;52085:10;:17;;;;:21;;;;:::i;:::-;52060:46;;52117:18;52138:15;:24;52154:7;52138:24;;;;;;;;;;;;52117:45;;52489:19;52511:10;52522:14;52511:26;;;;;;;;;;;;;;;;;;;;;;;;52489:48;;52575:11;52550:10;52561;52550:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;52686:10;52655:15;:28;52671:11;52655:28;;;;;;;;;;;:41;;;;52827:15;:24;52843:7;52827:24;;;;;;;;;;;52820:31;;;52862:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51807:1079;;;;:::o;49311:221::-;49396:14;49413:20;49430:2;49413:16;:20::i;:::-;49396:37;;49471:7;49444:12;:16;49457:2;49444:16;;;;;;;;;;;;;;;:24;49461:6;49444:24;;;;;;;;;;;:34;;;;49518:6;49489:17;:26;49507:7;49489:26;;;;;;;;;;;:35;;;;49311:221;;;:::o;40859:382::-;40953:1;40939:16;;:2;:16;;;;40931:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;41012:16;41020:7;41012;:16::i;:::-;41011:17;41003:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41074:45;41103:1;41107:2;41111:7;41074:20;:45::i;:::-;41149:1;41132:9;:13;41142:2;41132:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41180:2;41161:7;:16;41169:7;41161:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41225:7;41221:2;41200:33;;41217:1;41200:33;;;;;;;;;;;;40859:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;867:367::-;;;1000:3;993:4;985:6;981:17;977:27;967:2;;1018:1;1015;1008:12;967:2;1054:6;1041:20;1031:30;;1084:18;1076:6;1073:30;1070:2;;;1116:1;1113;1106:12;1070:2;1153:4;1145:6;1141:17;1129:29;;1207:3;1199:4;1191:6;1187:17;1177:8;1173:32;1170:41;1167:2;;;1224:1;1221;1214:12;1167:2;957:277;;;;;:::o;1257:367::-;;;1390:3;1383:4;1375:6;1371:17;1367:27;1357:2;;1408:1;1405;1398:12;1357:2;1444:6;1431:20;1421:30;;1474:18;1466:6;1463:30;1460:2;;;1506:1;1503;1496:12;1460:2;1543:4;1535:6;1531:17;1519:29;;1597:3;1589:4;1581:6;1577:17;1567:8;1563:32;1560:41;1557:2;;;1614:1;1611;1604:12;1557:2;1347:277;;;;;:::o;1630:133::-;;1711:6;1698:20;1689:29;;1727:30;1751:5;1727:30;:::i;:::-;1679:84;;;;:::o;1769:137::-;;1852:6;1839:20;1830:29;;1868:32;1894:5;1868:32;:::i;:::-;1820:86;;;;:::o;1912:141::-;;1999:6;1993:13;1984:22;;2015:32;2041:5;2015:32;:::i;:::-;1974:79;;;;:::o;2072:271::-;;2176:3;2169:4;2161:6;2157:17;2153:27;2143:2;;2194:1;2191;2184:12;2143:2;2234:6;2221:20;2259:78;2333:3;2325:6;2318:4;2310:6;2306:17;2259:78;:::i;:::-;2250:87;;2133:210;;;;;:::o;2363:273::-;;2468:3;2461:4;2453:6;2449:17;2445:27;2435:2;;2486:1;2483;2476:12;2435:2;2526:6;2513:20;2551:79;2626:3;2618:6;2611:4;2603:6;2599:17;2551:79;:::i;:::-;2542:88;;2425:211;;;;;:::o;2642:139::-;;2726:6;2713:20;2704:29;;2742:33;2769:5;2742:33;:::i;:::-;2694:87;;;;:::o;2787:262::-;;2895:2;2883:9;2874:7;2870:23;2866:32;2863:2;;;2911:1;2908;2901:12;2863:2;2954:1;2979:53;3024:7;3015:6;3004:9;3000:22;2979:53;:::i;:::-;2969:63;;2925:117;2853:196;;;;:::o;3055:407::-;;;3180:2;3168:9;3159:7;3155:23;3151:32;3148:2;;;3196:1;3193;3186:12;3148:2;3239:1;3264:53;3309:7;3300:6;3289:9;3285:22;3264:53;:::i;:::-;3254:63;;3210:117;3366:2;3392:53;3437:7;3428:6;3417:9;3413:22;3392:53;:::i;:::-;3382:63;;3337:118;3138:324;;;;;:::o;3468:552::-;;;;3610:2;3598:9;3589:7;3585:23;3581:32;3578:2;;;3626:1;3623;3616:12;3578:2;3669:1;3694:53;3739:7;3730:6;3719:9;3715:22;3694:53;:::i;:::-;3684:63;;3640:117;3796:2;3822:53;3867:7;3858:6;3847:9;3843:22;3822:53;:::i;:::-;3812:63;;3767:118;3924:2;3950:53;3995:7;3986:6;3975:9;3971:22;3950:53;:::i;:::-;3940:63;;3895:118;3568:452;;;;;:::o;4026:809::-;;;;;4194:3;4182:9;4173:7;4169:23;4165:33;4162:2;;;4211:1;4208;4201:12;4162:2;4254:1;4279:53;4324:7;4315:6;4304:9;4300:22;4279:53;:::i;:::-;4269:63;;4225:117;4381:2;4407:53;4452:7;4443:6;4432:9;4428:22;4407:53;:::i;:::-;4397:63;;4352:118;4509:2;4535:53;4580:7;4571:6;4560:9;4556:22;4535:53;:::i;:::-;4525:63;;4480:118;4665:2;4654:9;4650:18;4637:32;4696:18;4688:6;4685:30;4682:2;;;4728:1;4725;4718:12;4682:2;4756:62;4810:7;4801:6;4790:9;4786:22;4756:62;:::i;:::-;4746:72;;4608:220;4152:683;;;;;;;:::o;4841:401::-;;;4963:2;4951:9;4942:7;4938:23;4934:32;4931:2;;;4979:1;4976;4969:12;4931:2;5022:1;5047:53;5092:7;5083:6;5072:9;5068:22;5047:53;:::i;:::-;5037:63;;4993:117;5149:2;5175:50;5217:7;5208:6;5197:9;5193:22;5175:50;:::i;:::-;5165:60;;5120:115;4921:321;;;;;:::o;5248:407::-;;;5373:2;5361:9;5352:7;5348:23;5344:32;5341:2;;;5389:1;5386;5379:12;5341:2;5432:1;5457:53;5502:7;5493:6;5482:9;5478:22;5457:53;:::i;:::-;5447:63;;5403:117;5559:2;5585:53;5630:7;5621:6;5610:9;5606:22;5585:53;:::i;:::-;5575:63;;5530:118;5331:324;;;;;:::o;5661:733::-;;;;;5856:2;5844:9;5835:7;5831:23;5827:32;5824:2;;;5872:1;5869;5862:12;5824:2;5943:1;5932:9;5928:17;5915:31;5973:18;5965:6;5962:30;5959:2;;;6005:1;6002;5995:12;5959:2;6041:80;6113:7;6104:6;6093:9;6089:22;6041:80;:::i;:::-;6023:98;;;;5886:245;6198:2;6187:9;6183:18;6170:32;6229:18;6221:6;6218:30;6215:2;;;6261:1;6258;6251:12;6215:2;6297:80;6369:7;6360:6;6349:9;6345:22;6297:80;:::i;:::-;6279:98;;;;6141:246;5814:580;;;;;;;:::o;6400:425::-;;;6543:2;6531:9;6522:7;6518:23;6514:32;6511:2;;;6559:1;6556;6549:12;6511:2;6630:1;6619:9;6615:17;6602:31;6660:18;6652:6;6649:30;6646:2;;;6692:1;6689;6682:12;6646:2;6728:80;6800:7;6791:6;6780:9;6776:22;6728:80;:::i;:::-;6710:98;;;;6573:245;6501:324;;;;;:::o;6831:570::-;;;;6991:2;6979:9;6970:7;6966:23;6962:32;6959:2;;;7007:1;7004;6997:12;6959:2;7078:1;7067:9;7063:17;7050:31;7108:18;7100:6;7097:30;7094:2;;;7140:1;7137;7130:12;7094:2;7176:80;7248:7;7239:6;7228:9;7224:22;7176:80;:::i;:::-;7158:98;;;;7021:245;7305:2;7331:53;7376:7;7367:6;7356:9;7352:22;7331:53;:::i;:::-;7321:63;;7276:118;6949:452;;;;;:::o;7407:260::-;;7514:2;7502:9;7493:7;7489:23;7485:32;7482:2;;;7530:1;7527;7520:12;7482:2;7573:1;7598:52;7642:7;7633:6;7622:9;7618:22;7598:52;:::i;:::-;7588:62;;7544:116;7472:195;;;;:::o;7673:282::-;;7791:2;7779:9;7770:7;7766:23;7762:32;7759:2;;;7807:1;7804;7797:12;7759:2;7850:1;7875:63;7930:7;7921:6;7910:9;7906:22;7875:63;:::i;:::-;7865:73;;7821:127;7749:206;;;;:::o;7961:375::-;;8079:2;8067:9;8058:7;8054:23;8050:32;8047:2;;;8095:1;8092;8085:12;8047:2;8166:1;8155:9;8151:17;8138:31;8196:18;8188:6;8185:30;8182:2;;;8228:1;8225;8218:12;8182:2;8256:63;8311:7;8302:6;8291:9;8287:22;8256:63;:::i;:::-;8246:73;;8109:220;8037:299;;;;:::o;8342:262::-;;8450:2;8438:9;8429:7;8425:23;8421:32;8418:2;;;8466:1;8463;8456:12;8418:2;8509:1;8534:53;8579:7;8570:6;8559:9;8555:22;8534:53;:::i;:::-;8524:63;;8480:117;8408:196;;;;:::o;8610:118::-;8697:24;8715:5;8697:24;:::i;:::-;8692:3;8685:37;8675:53;;:::o;8734:109::-;8815:21;8830:5;8815:21;:::i;:::-;8810:3;8803:34;8793:50;;:::o;8849:360::-;;8963:38;8995:5;8963:38;:::i;:::-;9017:70;9080:6;9075:3;9017:70;:::i;:::-;9010:77;;9096:52;9141:6;9136:3;9129:4;9122:5;9118:16;9096:52;:::i;:::-;9173:29;9195:6;9173:29;:::i;:::-;9168:3;9164:39;9157:46;;8939:270;;;;;:::o;9215:163::-;9318:53;9365:5;9318:53;:::i;:::-;9313:3;9306:66;9296:82;;:::o;9384:364::-;;9500:39;9533:5;9500:39;:::i;:::-;9555:71;9619:6;9614:3;9555:71;:::i;:::-;9548:78;;9635:52;9680:6;9675:3;9668:4;9661:5;9657:16;9635:52;:::i;:::-;9712:29;9734:6;9712:29;:::i;:::-;9707:3;9703:39;9696:46;;9476:272;;;;;:::o;9754:377::-;;9888:39;9921:5;9888:39;:::i;:::-;9943:89;10025:6;10020:3;9943:89;:::i;:::-;9936:96;;10041:52;10086:6;10081:3;10074:4;10067:5;10063:16;10041:52;:::i;:::-;10118:6;10113:3;10109:16;10102:23;;9864:267;;;;;:::o;10137:328::-;;10300:67;10364:2;10359:3;10300:67;:::i;:::-;10293:74;;10397:32;10393:1;10388:3;10384:11;10377:53;10456:2;10451:3;10447:12;10440:19;;10283:182;;;:::o;10471:375::-;;10634:67;10698:2;10693:3;10634:67;:::i;:::-;10627:74;;10731:34;10727:1;10722:3;10718:11;10711:55;10797:13;10792:2;10787:3;10783:12;10776:35;10837:2;10832:3;10828:12;10821:19;;10617:229;;;:::o;10852:382::-;;11015:67;11079:2;11074:3;11015:67;:::i;:::-;11008:74;;11112:34;11108:1;11103:3;11099:11;11092:55;11178:20;11173:2;11168:3;11164:12;11157:42;11225:2;11220:3;11216:12;11209:19;;10998:236;;;:::o;11240:370::-;;11403:67;11467:2;11462:3;11403:67;:::i;:::-;11396:74;;11500:34;11496:1;11491:3;11487:11;11480:55;11566:8;11561:2;11556:3;11552:12;11545:30;11601:2;11596:3;11592:12;11585:19;;11386:224;;;:::o;11616:326::-;;11779:67;11843:2;11838:3;11779:67;:::i;:::-;11772:74;;11876:30;11872:1;11867:3;11863:11;11856:51;11933:2;11928:3;11924:12;11917:19;;11762:180;;;:::o;11948:371::-;;12111:67;12175:2;12170:3;12111:67;:::i;:::-;12104:74;;12208:34;12204:1;12199:3;12195:11;12188:55;12274:9;12269:2;12264:3;12260:12;12253:31;12310:2;12305:3;12301:12;12294:19;;12094:225;;;:::o;12325:374::-;;12488:67;12552:2;12547:3;12488:67;:::i;:::-;12481:74;;12585:34;12581:1;12576:3;12572:11;12565:55;12651:12;12646:2;12641:3;12637:12;12630:34;12690:2;12685:3;12681:12;12674:19;;12471:228;;;:::o;12705:323::-;;12868:67;12932:2;12927:3;12868:67;:::i;:::-;12861:74;;12965:27;12961:1;12956:3;12952:11;12945:48;13019:2;13014:3;13010:12;13003:19;;12851:177;;;:::o;13034:368::-;;13197:67;13261:2;13256:3;13197:67;:::i;:::-;13190:74;;13294:34;13290:1;13285:3;13281:11;13274:55;13360:6;13355:2;13350:3;13346:12;13339:28;13393:2;13388:3;13384:12;13377:19;;13180:222;;;:::o;13408:323::-;;13571:67;13635:2;13630:3;13571:67;:::i;:::-;13564:74;;13668:27;13664:1;13659:3;13655:11;13648:48;13722:2;13717:3;13713:12;13706:19;;13554:177;;;:::o;13737:376::-;;13900:67;13964:2;13959:3;13900:67;:::i;:::-;13893:74;;13997:34;13993:1;13988:3;13984:11;13977:55;14063:14;14058:2;14053:3;14049:12;14042:36;14104:2;14099:3;14095:12;14088:19;;13883:230;;;:::o;14119:388::-;;14282:67;14346:2;14341:3;14282:67;:::i;:::-;14275:74;;14379:34;14375:1;14370:3;14366:11;14359:55;14445:26;14440:2;14435:3;14431:12;14424:48;14498:2;14493:3;14489:12;14482:19;;14265:242;;;:::o;14513:374::-;;14676:67;14740:2;14735:3;14676:67;:::i;:::-;14669:74;;14773:34;14769:1;14764:3;14760:11;14753:55;14839:12;14834:2;14829:3;14825:12;14818:34;14878:2;14873:3;14869:12;14862:19;;14659:228;;;:::o;14893:373::-;;15056:67;15120:2;15115:3;15056:67;:::i;:::-;15049:74;;15153:34;15149:1;15144:3;15140:11;15133:55;15219:11;15214:2;15209:3;15205:12;15198:33;15257:2;15252:3;15248:12;15241:19;;15039:227;;;:::o;15272:324::-;;15435:67;15499:2;15494:3;15435:67;:::i;:::-;15428:74;;15532:28;15528:1;15523:3;15519:11;15512:49;15587:2;15582:3;15578:12;15571:19;;15418:178;;;:::o;15602:330::-;;15765:67;15829:2;15824:3;15765:67;:::i;:::-;15758:74;;15862:34;15858:1;15853:3;15849:11;15842:55;15923:2;15918:3;15914:12;15907:19;;15748:184;;;:::o;15938:376::-;;16101:67;16165:2;16160:3;16101:67;:::i;:::-;16094:74;;16198:34;16194:1;16189:3;16185:11;16178:55;16264:14;16259:2;16254:3;16250:12;16243:36;16305:2;16300:3;16296:12;16289:19;;16084:230;;;:::o;16320:330::-;;16483:67;16547:2;16542:3;16483:67;:::i;:::-;16476:74;;16580:34;16576:1;16571:3;16567:11;16560:55;16641:2;16636:3;16632:12;16625:19;;16466:184;;;:::o;16656:373::-;;16819:67;16883:2;16878:3;16819:67;:::i;:::-;16812:74;;16916:34;16912:1;16907:3;16903:11;16896:55;16982:11;16977:2;16972:3;16968:12;16961:33;17020:2;17015:3;17011:12;17004:19;;16802:227;;;:::o;17035:317::-;;17198:67;17262:2;17257:3;17198:67;:::i;:::-;17191:74;;17295:21;17291:1;17286:3;17282:11;17275:42;17343:2;17338:3;17334:12;17327:19;;17181:171;;;:::o;17358:379::-;;17521:67;17585:2;17580:3;17521:67;:::i;:::-;17514:74;;17618:34;17614:1;17609:3;17605:11;17598:55;17684:17;17679:2;17674:3;17670:12;17663:39;17728:2;17723:3;17719:12;17712:19;;17504:233;;;:::o;17743:365::-;;17906:67;17970:2;17965:3;17906:67;:::i;:::-;17899:74;;18003:34;17999:1;17994:3;17990:11;17983:55;18069:3;18064:2;18059:3;18055:12;18048:25;18099:2;18094:3;18090:12;18083:19;;17889:219;;;:::o;18114:310::-;;18277:67;18341:2;18336:3;18277:67;:::i;:::-;18270:74;;18374:14;18370:1;18365:3;18361:11;18354:35;18415:2;18410:3;18406:12;18399:19;;18260:164;;;:::o;18430:329::-;;18593:67;18657:2;18652:3;18593:67;:::i;:::-;18586:74;;18690:33;18686:1;18681:3;18677:11;18670:54;18750:2;18745:3;18741:12;18734:19;;18576:183;;;:::o;18765:297::-;;18945:83;19026:1;19021:3;18945:83;:::i;:::-;18938:90;;19054:1;19049:3;19045:11;19038:18;;18928:134;;;:::o;19068:314::-;;19231:67;19295:2;19290:3;19231:67;:::i;:::-;19224:74;;19328:18;19324:1;19319:3;19315:11;19308:39;19373:2;19368:3;19364:12;19357:19;;19214:168;;;:::o;19388:381::-;;19551:67;19615:2;19610:3;19551:67;:::i;:::-;19544:74;;19648:34;19644:1;19639:3;19635:11;19628:55;19714:19;19709:2;19704:3;19700:12;19693:41;19760:2;19755:3;19751:12;19744:19;;19534:235;;;:::o;19775:376::-;;19938:67;20002:2;19997:3;19938:67;:::i;:::-;19931:74;;20035:34;20031:1;20026:3;20022:11;20015:55;20101:14;20096:2;20091:3;20087:12;20080:36;20142:2;20137:3;20133:12;20126:19;;19921:230;;;:::o;20157:324::-;;20320:67;20384:2;20379:3;20320:67;:::i;:::-;20313:74;;20417:28;20413:1;20408:3;20404:11;20397:49;20472:2;20467:3;20463:12;20456:19;;20303:178;;;:::o;20487:367::-;;20650:67;20714:2;20709:3;20650:67;:::i;:::-;20643:74;;20747:34;20743:1;20738:3;20734:11;20727:55;20813:5;20808:2;20803:3;20799:12;20792:27;20845:2;20840:3;20836:12;20829:19;;20633:221;;;:::o;20860:380::-;;21023:67;21087:2;21082:3;21023:67;:::i;:::-;21016:74;;21120:34;21116:1;21111:3;21107:11;21100:55;21186:18;21181:2;21176:3;21172:12;21165:40;21231:2;21226:3;21222:12;21215:19;;21006:234;;;:::o;21246:118::-;21333:24;21351:5;21333:24;:::i;:::-;21328:3;21321:37;21311:53;;:::o;21370:157::-;21475:45;21495:24;21513:5;21495:24;:::i;:::-;21475:45;:::i;:::-;21470:3;21463:58;21453:74;;:::o;21533:755::-;;21831:95;21922:3;21913:6;21831:95;:::i;:::-;21824:102;;21943:95;22034:3;22025:6;21943:95;:::i;:::-;21936:102;;22055:95;22146:3;22137:6;22055:95;:::i;:::-;22048:102;;22167:95;22258:3;22249:6;22167:95;:::i;:::-;22160:102;;22279:3;22272:10;;21813:475;;;;;;;:::o;22294:379::-;;22500:147;22643:3;22500:147;:::i;:::-;22493:154;;22664:3;22657:10;;22482:191;;;:::o;22679:397::-;;22834:75;22905:3;22896:6;22834:75;:::i;:::-;22934:2;22929:3;22925:12;22918:19;;22947:75;23018:3;23009:6;22947:75;:::i;:::-;23047:2;23042:3;23038:12;23031:19;;23067:3;23060:10;;22823:253;;;;;:::o;23082:222::-;;23213:2;23202:9;23198:18;23190:26;;23226:71;23294:1;23283:9;23279:17;23270:6;23226:71;:::i;:::-;23180:124;;;;:::o;23310:640::-;;23543:3;23532:9;23528:19;23520:27;;23557:71;23625:1;23614:9;23610:17;23601:6;23557:71;:::i;:::-;23638:72;23706:2;23695:9;23691:18;23682:6;23638:72;:::i;:::-;23720;23788:2;23777:9;23773:18;23764:6;23720:72;:::i;:::-;23839:9;23833:4;23829:20;23824:2;23813:9;23809:18;23802:48;23867:76;23938:4;23929:6;23867:76;:::i;:::-;23859:84;;23510:440;;;;;;;:::o;23956:332::-;;24115:2;24104:9;24100:18;24092:26;;24128:71;24196:1;24185:9;24181:17;24172:6;24128:71;:::i;:::-;24209:72;24277:2;24266:9;24262:18;24253:6;24209:72;:::i;:::-;24082:206;;;;;:::o;24294:210::-;;24419:2;24408:9;24404:18;24396:26;;24432:65;24494:1;24483:9;24479:17;24470:6;24432:65;:::i;:::-;24386:118;;;;:::o;24510:254::-;;24657:2;24646:9;24642:18;24634:26;;24670:87;24754:1;24743:9;24739:17;24730:6;24670:87;:::i;:::-;24624:140;;;;:::o;24770:313::-;;24921:2;24910:9;24906:18;24898:26;;24970:9;24964:4;24960:20;24956:1;24945:9;24941:17;24934:47;24998:78;25071:4;25062:6;24998:78;:::i;:::-;24990:86;;24888:195;;;;:::o;25089:419::-;;25293:2;25282:9;25278:18;25270:26;;25342:9;25336:4;25332:20;25328:1;25317:9;25313:17;25306:47;25370:131;25496:4;25370:131;:::i;:::-;25362:139;;25260:248;;;:::o;25514:419::-;;25718:2;25707:9;25703:18;25695:26;;25767:9;25761:4;25757:20;25753:1;25742:9;25738:17;25731:47;25795:131;25921:4;25795:131;:::i;:::-;25787:139;;25685:248;;;:::o;25939:419::-;;26143:2;26132:9;26128:18;26120:26;;26192:9;26186:4;26182:20;26178:1;26167:9;26163:17;26156:47;26220:131;26346:4;26220:131;:::i;:::-;26212:139;;26110:248;;;:::o;26364:419::-;;26568:2;26557:9;26553:18;26545:26;;26617:9;26611:4;26607:20;26603:1;26592:9;26588:17;26581:47;26645:131;26771:4;26645:131;:::i;:::-;26637:139;;26535:248;;;:::o;26789:419::-;;26993:2;26982:9;26978:18;26970:26;;27042:9;27036:4;27032:20;27028:1;27017:9;27013:17;27006:47;27070:131;27196:4;27070:131;:::i;:::-;27062:139;;26960:248;;;:::o;27214:419::-;;27418:2;27407:9;27403:18;27395:26;;27467:9;27461:4;27457:20;27453:1;27442:9;27438:17;27431:47;27495:131;27621:4;27495:131;:::i;:::-;27487:139;;27385:248;;;:::o;27639:419::-;;27843:2;27832:9;27828:18;27820:26;;27892:9;27886:4;27882:20;27878:1;27867:9;27863:17;27856:47;27920:131;28046:4;27920:131;:::i;:::-;27912:139;;27810:248;;;:::o;28064:419::-;;28268:2;28257:9;28253:18;28245:26;;28317:9;28311:4;28307:20;28303:1;28292:9;28288:17;28281:47;28345:131;28471:4;28345:131;:::i;:::-;28337:139;;28235:248;;;:::o;28489:419::-;;28693:2;28682:9;28678:18;28670:26;;28742:9;28736:4;28732:20;28728:1;28717:9;28713:17;28706:47;28770:131;28896:4;28770:131;:::i;:::-;28762:139;;28660:248;;;:::o;28914:419::-;;29118:2;29107:9;29103:18;29095:26;;29167:9;29161:4;29157:20;29153:1;29142:9;29138:17;29131:47;29195:131;29321:4;29195:131;:::i;:::-;29187:139;;29085:248;;;:::o;29339:419::-;;29543:2;29532:9;29528:18;29520:26;;29592:9;29586:4;29582:20;29578:1;29567:9;29563:17;29556:47;29620:131;29746:4;29620:131;:::i;:::-;29612:139;;29510:248;;;:::o;29764:419::-;;29968:2;29957:9;29953:18;29945:26;;30017:9;30011:4;30007:20;30003:1;29992:9;29988:17;29981:47;30045:131;30171:4;30045:131;:::i;:::-;30037:139;;29935:248;;;:::o;30189:419::-;;30393:2;30382:9;30378:18;30370:26;;30442:9;30436:4;30432:20;30428:1;30417:9;30413:17;30406:47;30470:131;30596:4;30470:131;:::i;:::-;30462:139;;30360:248;;;:::o;30614:419::-;;30818:2;30807:9;30803:18;30795:26;;30867:9;30861:4;30857:20;30853:1;30842:9;30838:17;30831:47;30895:131;31021:4;30895:131;:::i;:::-;30887:139;;30785:248;;;:::o;31039:419::-;;31243:2;31232:9;31228:18;31220:26;;31292:9;31286:4;31282:20;31278:1;31267:9;31263:17;31256:47;31320:131;31446:4;31320:131;:::i;:::-;31312:139;;31210:248;;;:::o;31464:419::-;;31668:2;31657:9;31653:18;31645:26;;31717:9;31711:4;31707:20;31703:1;31692:9;31688:17;31681:47;31745:131;31871:4;31745:131;:::i;:::-;31737:139;;31635:248;;;:::o;31889:419::-;;32093:2;32082:9;32078:18;32070:26;;32142:9;32136:4;32132:20;32128:1;32117:9;32113:17;32106:47;32170:131;32296:4;32170:131;:::i;:::-;32162:139;;32060:248;;;:::o;32314:419::-;;32518:2;32507:9;32503:18;32495:26;;32567:9;32561:4;32557:20;32553:1;32542:9;32538:17;32531:47;32595:131;32721:4;32595:131;:::i;:::-;32587:139;;32485:248;;;:::o;32739:419::-;;32943:2;32932:9;32928:18;32920:26;;32992:9;32986:4;32982:20;32978:1;32967:9;32963:17;32956:47;33020:131;33146:4;33020:131;:::i;:::-;33012:139;;32910:248;;;:::o;33164:419::-;;33368:2;33357:9;33353:18;33345:26;;33417:9;33411:4;33407:20;33403:1;33392:9;33388:17;33381:47;33445:131;33571:4;33445:131;:::i;:::-;33437:139;;33335:248;;;:::o;33589:419::-;;33793:2;33782:9;33778:18;33770:26;;33842:9;33836:4;33832:20;33828:1;33817:9;33813:17;33806:47;33870:131;33996:4;33870:131;:::i;:::-;33862:139;;33760:248;;;:::o;34014:419::-;;34218:2;34207:9;34203:18;34195:26;;34267:9;34261:4;34257:20;34253:1;34242:9;34238:17;34231:47;34295:131;34421:4;34295:131;:::i;:::-;34287:139;;34185:248;;;:::o;34439:419::-;;34643:2;34632:9;34628:18;34620:26;;34692:9;34686:4;34682:20;34678:1;34667:9;34663:17;34656:47;34720:131;34846:4;34720:131;:::i;:::-;34712:139;;34610:248;;;:::o;34864:419::-;;35068:2;35057:9;35053:18;35045:26;;35117:9;35111:4;35107:20;35103:1;35092:9;35088:17;35081:47;35145:131;35271:4;35145:131;:::i;:::-;35137:139;;35035:248;;;:::o;35289:419::-;;35493:2;35482:9;35478:18;35470:26;;35542:9;35536:4;35532:20;35528:1;35517:9;35513:17;35506:47;35570:131;35696:4;35570:131;:::i;:::-;35562:139;;35460:248;;;:::o;35714:419::-;;35918:2;35907:9;35903:18;35895:26;;35967:9;35961:4;35957:20;35953:1;35942:9;35938:17;35931:47;35995:131;36121:4;35995:131;:::i;:::-;35987:139;;35885:248;;;:::o;36139:419::-;;36343:2;36332:9;36328:18;36320:26;;36392:9;36386:4;36382:20;36378:1;36367:9;36363:17;36356:47;36420:131;36546:4;36420:131;:::i;:::-;36412:139;;36310:248;;;:::o;36564:419::-;;36768:2;36757:9;36753:18;36745:26;;36817:9;36811:4;36807:20;36803:1;36792:9;36788:17;36781:47;36845:131;36971:4;36845:131;:::i;:::-;36837:139;;36735:248;;;:::o;36989:419::-;;37193:2;37182:9;37178:18;37170:26;;37242:9;37236:4;37232:20;37228:1;37217:9;37213:17;37206:47;37270:131;37396:4;37270:131;:::i;:::-;37262:139;;37160:248;;;:::o;37414:419::-;;37618:2;37607:9;37603:18;37595:26;;37667:9;37661:4;37657:20;37653:1;37642:9;37638:17;37631:47;37695:131;37821:4;37695:131;:::i;:::-;37687:139;;37585:248;;;:::o;37839:222::-;;37970:2;37959:9;37955:18;37947:26;;37983:71;38051:1;38040:9;38036:17;38027:6;37983:71;:::i;:::-;37937:124;;;;:::o;38067:283::-;;38133:2;38127:9;38117:19;;38175:4;38167:6;38163:17;38282:6;38270:10;38267:22;38246:18;38234:10;38231:34;38228:62;38225:2;;;38293:18;;:::i;:::-;38225:2;38333:10;38329:2;38322:22;38107:243;;;;:::o;38356:331::-;;38507:18;38499:6;38496:30;38493:2;;;38529:18;;:::i;:::-;38493:2;38614:4;38610:9;38603:4;38595:6;38591:17;38587:33;38579:41;;38675:4;38669;38665:15;38657:23;;38422:265;;;:::o;38693:332::-;;38845:18;38837:6;38834:30;38831:2;;;38867:18;;:::i;:::-;38831:2;38952:4;38948:9;38941:4;38933:6;38929:17;38925:33;38917:41;;39013:4;39007;39003:15;38995:23;;38760:265;;;:::o;39031:98::-;;39116:5;39110:12;39100:22;;39089:40;;;:::o;39135:99::-;;39221:5;39215:12;39205:22;;39194:40;;;:::o;39240:168::-;;39357:6;39352:3;39345:19;39397:4;39392:3;39388:14;39373:29;;39335:73;;;;:::o;39414:147::-;;39552:3;39537:18;;39527:34;;;;:::o;39567:169::-;;39685:6;39680:3;39673:19;39725:4;39720:3;39716:14;39701:29;;39663:73;;;;:::o;39742:148::-;;39881:3;39866:18;;39856:34;;;;:::o;39896:305::-;;39955:20;39973:1;39955:20;:::i;:::-;39950:25;;39989:20;40007:1;39989:20;:::i;:::-;39984:25;;40143:1;40075:66;40071:74;40068:1;40065:81;40062:2;;;40149:18;;:::i;:::-;40062:2;40193:1;40190;40186:9;40179:16;;39940:261;;;;:::o;40207:185::-;;40264:20;40282:1;40264:20;:::i;:::-;40259:25;;40298:20;40316:1;40298:20;:::i;:::-;40293:25;;40337:1;40327:2;;40342:18;;:::i;:::-;40327:2;40384:1;40381;40377:9;40372:14;;40249:143;;;;:::o;40398:848::-;;;40490:6;40481:15;;40514:5;40505:14;;40528:712;40549:1;40539:8;40536:15;40528:712;;;40644:4;40639:3;40635:14;40629:4;40626:24;40623:2;;;40653:18;;:::i;:::-;40623:2;40703:1;40693:8;40689:16;40686:2;;;41118:4;41111:5;41107:16;41098:25;;40686:2;41168:4;41162;41158:15;41150:23;;41198:32;41221:8;41198:32;:::i;:::-;41186:44;;40528:712;;;40471:775;;;;;;;:::o;41252:281::-;;41334:23;41352:4;41334:23;:::i;:::-;41326:31;;41378:25;41394:8;41378:25;:::i;:::-;41366:37;;41422:104;41459:66;41449:8;41443:4;41422:104;:::i;:::-;41413:113;;41316:217;;;;:::o;41539:1073::-;;41784:8;41774:2;;41805:1;41796:10;;41807:5;;41774:2;41833:4;41823:2;;41850:1;41841:10;;41852:5;;41823:2;41919:4;41967:1;41962:27;;;;42003:1;41998:191;;;;41912:277;;41962:27;41980:1;41971:10;;41982:5;;;41998:191;42043:3;42033:8;42030:17;42027:2;;;42050:18;;:::i;:::-;42027:2;42099:8;42096:1;42092:16;42083:25;;42134:3;42127:5;42124:14;42121:2;;;42141:18;;:::i;:::-;42121:2;42174:5;;;41912:277;;42298:2;42288:8;42285:16;42279:3;42273:4;42270:13;42266:36;42248:2;42238:8;42235:16;42230:2;42224:4;42221:12;42217:35;42201:111;42198:2;;;42354:8;42348:4;42344:19;42335:28;;42389:3;42382:5;42379:14;42376:2;;;42396:18;;:::i;:::-;42376:2;42429:5;;42198:2;42469:42;42507:3;42497:8;42491:4;42488:1;42469:42;:::i;:::-;42454:57;;;;42543:4;42538:3;42534:14;42527:5;42524:25;42521:2;;;42552:18;;:::i;:::-;42521:2;42601:4;42594:5;42590:16;42581:25;;41599:1013;;;;;;:::o;42618:348::-;;42681:20;42699:1;42681:20;:::i;:::-;42676:25;;42715:20;42733:1;42715:20;:::i;:::-;42710:25;;42903:1;42835:66;42831:74;42828:1;42825:81;42820:1;42813:9;42806:17;42802:105;42799:2;;;42910:18;;:::i;:::-;42799:2;42958:1;42955;42951:9;42940:20;;42666:300;;;;:::o;42972:191::-;;43032:20;43050:1;43032:20;:::i;:::-;43027:25;;43066:20;43084:1;43066:20;:::i;:::-;43061:25;;43105:1;43102;43099:8;43096:2;;;43110:18;;:::i;:::-;43096:2;43155:1;43152;43148:9;43140:17;;43017:146;;;;:::o;43169:96::-;;43235:24;43253:5;43235:24;:::i;:::-;43224:35;;43214:51;;;:::o;43271:90::-;;43348:5;43341:13;43334:21;43323:32;;43313:48;;;:::o;43367:149::-;;43443:66;43436:5;43432:78;43421:89;;43411:105;;;:::o;43522:126::-;;43599:42;43592:5;43588:54;43577:65;;43567:81;;;:::o;43654:77::-;;43720:5;43709:16;;43699:32;;;:::o;43737:86::-;;43812:4;43805:5;43801:16;43790:27;;43780:43;;;:::o;43829:158::-;;43928:53;43975:5;43928:53;:::i;:::-;43915:66;;43905:82;;;:::o;43993:129::-;;44092:24;44110:5;44092:24;:::i;:::-;44079:37;;44069:53;;;:::o;44128:154::-;44212:6;44207:3;44202;44189:30;44274:1;44265:6;44260:3;44256:16;44249:27;44179:103;;;:::o;44288:307::-;44356:1;44366:113;44380:6;44377:1;44374:13;44366:113;;;44465:1;44460:3;44456:11;44450:18;44446:1;44441:3;44437:11;44430:39;44402:2;44399:1;44395:10;44390:15;;44366:113;;;44497:6;44494:1;44491:13;44488:2;;;44577:1;44568:6;44563:3;44559:16;44552:27;44488:2;44337:258;;;;:::o;44601:320::-;;44682:1;44676:4;44672:12;44662:22;;44729:1;44723:4;44719:12;44750:18;44740:2;;44806:4;44798:6;44794:17;44784:27;;44740:2;44868;44860:6;44857:14;44837:18;44834:38;44831:2;;;44887:18;;:::i;:::-;44831:2;44652:269;;;;:::o;44927:233::-;;44989:24;45007:5;44989:24;:::i;:::-;44980:33;;45035:66;45028:5;45025:77;45022:2;;;45105:18;;:::i;:::-;45022:2;45152:1;45145:5;45141:13;45134:20;;44970:190;;;:::o;45166:79::-;;45234:5;45223:16;;45213:32;;;:::o;45251:176::-;;45300:20;45318:1;45300:20;:::i;:::-;45295:25;;45334:20;45352:1;45334:20;:::i;:::-;45329:25;;45373:1;45363:2;;45378:18;;:::i;:::-;45363:2;45419:1;45416;45412:9;45407:14;;45285:142;;;;:::o;45433:180::-;45481:77;45478:1;45471:88;45578:4;45575:1;45568:15;45602:4;45599:1;45592:15;45619:180;45667:77;45664:1;45657:88;45764:4;45761:1;45754:15;45788:4;45785:1;45778:15;45805:180;45853:77;45850:1;45843:88;45950:4;45947:1;45940:15;45974:4;45971:1;45964:15;45991:180;46039:77;46036:1;46029:88;46136:4;46133:1;46126:15;46160:4;46157:1;46150:15;46177:102;;46269:2;46265:7;46260:2;46253:5;46249:14;46245:28;46235:38;;46225:54;;;:::o;46285:102::-;;46374:5;46371:1;46367:13;46346:34;;46336:51;;;:::o;46393:122::-;46466:24;46484:5;46466:24;:::i;:::-;46459:5;46456:35;46446:2;;46505:1;46502;46495:12;46446:2;46436:79;:::o;46521:116::-;46591:21;46606:5;46591:21;:::i;:::-;46584:5;46581:32;46571:2;;46627:1;46624;46617:12;46571:2;46561:76;:::o;46643:120::-;46715:23;46732:5;46715:23;:::i;:::-;46708:5;46705:34;46695:2;;46753:1;46750;46743:12;46695:2;46685:78;:::o;46769:122::-;46842:24;46860:5;46842:24;:::i;:::-;46835:5;46832:35;46822:2;;46881:1;46878;46871:12;46822:2;46812:79;:::o

Swarm Source

ipfs://9d1b88e2beeae8b61118cac747706258734cd1b526efbc10885d648e5b5c6559
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.