Contract Overview
Balance:
0 AVAX
AVAX Value:
$0.00
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0xee634a96917b52e8dfb85fb9e925e43c1ae44b8f7a497b849e4e4d56f20ac9c4 | Set Start Time W... | 14691104 | 7 days 15 hrs ago | 0x25321311cd7034140a7416c62ae4f32fbcaa4242 | IN | 0x40945195a79d7dc0613a2815029a8552a8652b20 | 0 AVAX | 0.001152825 | |
0xae8d8a221c2153c2c4065bef1dc7eefae28a840ea3e8ea13bdfbab6cc0541b3b | 0x60806040 | 14691043 | 7 days 15 hrs ago | 0x25321311cd7034140a7416c62ae4f32fbcaa4242 | IN | Create: SpaceHoe | 0 AVAX | 0.155976711999 |
[ Download CSV Export ]
Contract Name:
SpaceHoe
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at snowtrace.io on 2022-05-14 */ // 0x78483B2Adf05EdF3210E90d911A5D1E3ab57D15c // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } } // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // OpenZeppelin Contracts v4.4.1 (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens 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 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } pragma solidity ^0.8.4; contract SpaceHoe is ERC721Enumerable, Ownable, Pausable { using SafeERC20 for IERC20; using Strings for uint256; struct HoeInfo { uint256 tokenId; } // CONSTANTS uint256 public constant HOE_PRICE_WHITELIST = 1 ether; uint256 public constant HOE_PRICE_AVAX = 1.5 ether; uint256 public constant WHITELIST_HOES = 2000; uint256 public constant NUM_HOES = 6969; // metadata URI string public BASE_URI; // mint tracking uint256 public hoesMintedWithAVAX; uint256 public hoesMintedWhitelist; uint256 public hoesMinted = 0; // mint control timestamps uint256 public startTimeWhitelist; uint256 public startTimeAVAX; address payable public DAO; // whitelist bytes32 public merkleRoot; mapping(address => uint256) public whitelistClaimed; // EVENTS event onHoeCreated(uint256 tokenId); constructor(address payable _DAO) ERC721("Space Hoes", "SPACE-HOE") { DAO = _DAO; } // VIEWS // minting status function mintingStartedWhitelist() public view returns (bool) { return startTimeWhitelist != 0 && block.timestamp >= startTimeWhitelist; } function mintingStartedAVAX() public view returns (bool) { return startTimeAVAX != 0 && block.timestamp >= startTimeAVAX; } // metadata function _baseURI() internal view virtual override returns (string memory) { return BASE_URI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require (_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return string(abi.encodePacked(_baseURI(), "/", tokenId.toString(), ".json")); } // ADMIN function setStartTimeWhitelist(uint256 _startTime) external onlyOwner { require (_startTime >= block.timestamp, "startTime cannot be in the past"); startTimeWhitelist = _startTime; } function setStartTimeAVAX(uint256 _startTime) external onlyOwner { require (_startTime >= block.timestamp, "startTime cannot be in the past"); startTimeAVAX = _startTime; } function setBaseURI(string calldata _BASE_URI) external onlyOwner { BASE_URI = _BASE_URI; } /** * @dev merkle root for WL wallets */ function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner { merkleRoot = _merkleRoot; } /** * @dev allows owner to send ERC20s held by this contract to target */ function forwardERC20s(IERC20 _token, uint256 _amount, address target) external onlyOwner { _token.safeTransfer(target, _amount); } /** * @dev allows owner to withdraw AVAX */ function withdrawAVAX(uint256 _amount) external { require(address(this).balance >= _amount, "not enough AVAX"); (bool sent, ) = DAO.call{value: _amount}(""); require(sent, "Failed to send AVAX"); } // MINTING function _createHoe(address to, uint256 tokenId) internal { require (hoesMinted <= NUM_HOES, "cannot mint anymore hoes"); _safeMint(to, tokenId); emit onHoeCreated(tokenId); } function _createHoes(uint256 qty, address to) internal { for (uint256 i = 0; i < qty; i++) { hoesMinted += 1; _createHoe(to, hoesMinted); } } /** * @dev Whitelist minting * We implement a hard limit on the whitelist hoes. */ function mintWhitelist(bytes32[] calldata _merkleProof, uint256 qty) external payable whenNotPaused { // check most basic requirements require(merkleRoot != 0, "missing root"); require(mintingStartedWhitelist(), "cannot mint right now"); require (!mintingStartedAVAX(), "whitelist minting is closed"); // check if address belongs in whitelist bytes32 leaf = keccak256(abi.encodePacked(_msgSender())); require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "this address does not have permission"); // check more advanced requirements require((hoesMintedWhitelist + qty) <= WHITELIST_HOES, "you can't mint that many right now"); // check price require(msg.value >= HOE_PRICE_WHITELIST * qty, "not enough AVAX"); hoesMintedWhitelist += qty; whitelistClaimed[_msgSender()] += qty; // mint hoes _createHoes(qty, _msgSender()); } /** * @dev minting */ function mintHoeWithAVAX(uint256 qty) external payable whenNotPaused { require (mintingStartedAVAX(), "cannot mint right now"); require ((hoesMintedWithAVAX + qty) <= (NUM_HOES - hoesMintedWhitelist), "you can't mint that many right now"); // calculate the transaction cost uint256 transactionCost = HOE_PRICE_AVAX * qty; require (msg.value >= transactionCost, "not enough AVAX"); hoesMintedWithAVAX += qty; // mint hoes _createHoes(qty, _msgSender()); } // Returns information for multiples hoes function batchedHoesOfOwner(address _owner, uint256 _offset, uint256 _maxSize) public view returns (HoeInfo[] memory) { if (_offset >= balanceOf(_owner)) { return new HoeInfo[](0); } uint256 outputSize = _maxSize; if (_offset + _maxSize >= balanceOf(_owner)) { outputSize = balanceOf(_owner) - _offset; } HoeInfo[] memory hoes = new HoeInfo[](outputSize); for (uint256 i = 0; i < outputSize; i++) { uint256 tokenId = tokenOfOwnerByIndex(_owner, _offset + i); // tokenOfOwnerByIndex comes from IERC721Enumerable hoes[i] = HoeInfo({ tokenId: tokenId }); } return hoes; } }
[{"inputs":[{"internalType":"address payable","name":"_DAO","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"onHoeCreated","type":"event"},{"inputs":[],"name":"BASE_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAO","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOE_PRICE_AVAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOE_PRICE_WHITELIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NUM_HOES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_HOES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"uint256","name":"_maxSize","type":"uint256"}],"name":"batchedHoesOfOwner","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"internalType":"struct SpaceHoe.HoeInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"target","type":"address"}],"name":"forwardERC20s","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":[],"name":"hoesMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hoesMintedWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hoesMintedWithAVAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mintHoeWithAVAX","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintingStartedAVAX","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingStartedWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","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":"_BASE_URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"setStartTimeAVAX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"setStartTimeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTimeAVAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTimeWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawAVAX","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600e553480156200001657600080fd5b5060405162005af138038062005af183398181016040528101906200003c9190620002f4565b6040518060400160405280600a81526020017f537061636520486f6573000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f53504143452d484f4500000000000000000000000000000000000000000000008152508160009080519060200190620000c09291906200022d565b508060019080519060200190620000d99291906200022d565b505050620000fc620000f06200015f60201b60201c565b6200016760201b60201c565b6000600a60146101000a81548160ff02191690831515021790555080601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620003de565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200023b906200035a565b90600052602060002090601f0160209004810192826200025f5760008555620002ab565b82601f106200027a57805160ff1916838001178555620002ab565b82800160010185558215620002ab579182015b82811115620002aa5782518255916020019190600101906200028d565b5b509050620002ba9190620002be565b5090565b5b80821115620002d9576000816000905550600101620002bf565b5090565b600081519050620002ee81620003c4565b92915050565b6000602082840312156200030d576200030c620003bf565b5b60006200031d84828501620002dd565b91505092915050565b600062000333826200033a565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200037357607f821691505b602082108114156200038a576200038962000390565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b620003cf8162000326565b8114620003db57600080fd5b50565b61570380620003ee6000396000f3fe6080604052600436106102675760003560e01c80637d26407a11610144578063aeb5cd5e116100b6578063dbddb26a1161007a578063dbddb26a14610939578063e985e9c514610964578063eb41903a146109a1578063eb464c4c146109ca578063efe0d7ce146109e6578063f2fde38b14610a1157610267565b8063aeb5cd5e14610842578063b88d4fde1461086b578063c1e20cdd14610894578063c87b56dd146108bf578063db4bec44146108fc57610267565b806395d89b411161010857806395d89b411461075157806398fabd3a1461077c578063a22cb465146107a7578063a377d7ef146107d0578063a682f862146107fb578063a6d612f91461082657610267565b80637d26407a146106685780637d85cbc6146106935780638268bd8a146106d0578063854f7b1d146106fb5780638da5cb5b1461072657610267565b806342842e0e116101dd5780636352211e116101a15780636352211e1461055857806369eac28c1461059557806370a08231146105c0578063715018a6146105fd578063734566c2146106145780637cb647591461063f57610267565b806342842e0e1461047557806343f37b981461049e5780634f6ccce7146104c757806355f804b3146105045780635c975abb1461052d57610267565b80631be20ded1161022f5780631be20ded1461036557806323b872dd146103905780632476703e146103b95780632eb4a7ab146103e45780632f745c591461040f5780633c1d4de71461044c57610267565b806301ffc9a71461026c57806306fdde03146102a9578063081812fc146102d4578063095ea7b31461031157806318160ddd1461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613b8c565b610a3a565b6040516102a091906144c1565b60405180910390f35b3480156102b557600080fd5b506102be610ab4565b6040516102cb91906144f7565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f69190613c86565b610b46565b60405161030891906143f4565b60405180910390f35b34801561031d57600080fd5b5061033860048036038101906103339190613a3f565b610bcb565b005b34801561034657600080fd5b5061034f610ce3565b60405161035c91906148f9565b60405180910390f35b34801561037157600080fd5b5061037a610cf0565b60405161038791906148f9565b60405180910390f35b34801561039c57600080fd5b506103b760048036038101906103b29190613929565b610cf6565b005b3480156103c557600080fd5b506103ce610d56565b6040516103db91906148f9565b60405180910390f35b3480156103f057600080fd5b506103f9610d5c565b60405161040691906144dc565b60405180910390f35b34801561041b57600080fd5b5061043660048036038101906104319190613a3f565b610d62565b60405161044391906148f9565b60405180910390f35b34801561045857600080fd5b50610473600480360381019061046e9190613c86565b610e07565b005b34801561048157600080fd5b5061049c60048036038101906104979190613929565b610ed0565b005b3480156104aa57600080fd5b506104c560048036038101906104c09190613be6565b610ef0565b005b3480156104d357600080fd5b506104ee60048036038101906104e99190613c86565b610f9c565b6040516104fb91906148f9565b60405180910390f35b34801561051057600080fd5b5061052b60048036038101906105269190613c39565b61100d565b005b34801561053957600080fd5b5061054261109f565b60405161054f91906144c1565b60405180910390f35b34801561056457600080fd5b5061057f600480360381019061057a9190613c86565b6110b6565b60405161058c91906143f4565b60405180910390f35b3480156105a157600080fd5b506105aa611168565b6040516105b791906148f9565b60405180910390f35b3480156105cc57600080fd5b506105e760048036038101906105e291906138bc565b61116e565b6040516105f491906148f9565b60405180910390f35b34801561060957600080fd5b50610612611226565b005b34801561062057600080fd5b506106296112ae565b60405161063691906148f9565b60405180910390f35b34801561064b57600080fd5b5061066660048036038101906106619190613b5f565b6112ba565b005b34801561067457600080fd5b5061067d611340565b60405161068a91906148f9565b60405180910390f35b34801561069f57600080fd5b506106ba60048036038101906106b59190613a7f565b611346565b6040516106c7919061449f565b60405180910390f35b3480156106dc57600080fd5b506106e56114b4565b6040516106f291906148f9565b60405180910390f35b34801561070757600080fd5b506107106114c0565b60405161071d91906148f9565b60405180910390f35b34801561073257600080fd5b5061073b6114c6565b60405161074891906143f4565b60405180910390f35b34801561075d57600080fd5b506107666114f0565b60405161077391906144f7565b60405180910390f35b34801561078857600080fd5b50610791611582565b60405161079e919061440f565b60405180910390f35b3480156107b357600080fd5b506107ce60048036038101906107c991906139ff565b6115a8565b005b3480156107dc57600080fd5b506107e56115be565b6040516107f291906144c1565b60405180910390f35b34801561080757600080fd5b506108106115d9565b60405161081d91906148f9565b60405180910390f35b610840600480360381019061083b9190613ad2565b6115df565b005b34801561084e57600080fd5b5061086960048036038101906108649190613c86565b6118f2565b005b34801561087757600080fd5b50610892600480360381019061088d919061397c565b611a07565b005b3480156108a057600080fd5b506108a9611a69565b6040516108b691906148f9565b60405180910390f35b3480156108cb57600080fd5b506108e660048036038101906108e19190613c86565b611a6f565b6040516108f391906144f7565b60405180910390f35b34801561090857600080fd5b50610923600480360381019061091e91906138bc565b611af1565b60405161093091906148f9565b60405180910390f35b34801561094557600080fd5b5061094e611b09565b60405161095b91906144f7565b60405180910390f35b34801561097057600080fd5b5061098b600480360381019061098691906138e9565b611b97565b60405161099891906144c1565b60405180910390f35b3480156109ad57600080fd5b506109c860048036038101906109c39190613c86565b611c2b565b005b6109e460048036038101906109df9190613c86565b611cf4565b005b3480156109f257600080fd5b506109fb611e6b565b604051610a0891906144c1565b60405180910390f35b348015610a1d57600080fd5b50610a386004803603810190610a3391906138bc565b611e86565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aad5750610aac82611f7e565b5b9050919050565b606060008054610ac390614bea565b80601f0160208091040260200160405190810160405280929190818152602001828054610aef90614bea565b8015610b3c5780601f10610b1157610100808354040283529160200191610b3c565b820191906000526020600020905b815481529060010190602001808311610b1f57829003601f168201915b5050505050905090565b6000610b5182612060565b610b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8790614799565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bd6826110b6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90614839565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c666120cc565b73ffffffffffffffffffffffffffffffffffffffff161480610c955750610c9481610c8f6120cc565b611b97565b5b610cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccb906146d9565b60405180910390fd5b610cde83836120d4565b505050565b6000600880549050905090565b600c5481565b610d07610d016120cc565b8261218d565b610d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3d90614859565b60405180910390fd5b610d5183838361226b565b505050565b600f5481565b60125481565b6000610d6d8361116e565b8210610dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da590614579565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e0f6120cc565b73ffffffffffffffffffffffffffffffffffffffff16610e2d6114c6565b73ffffffffffffffffffffffffffffffffffffffff1614610e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7a906147b9565b60405180910390fd5b42811015610ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebd906146f9565b60405180910390fd5b8060108190555050565b610eeb83838360405180602001604052806000815250611a07565b505050565b610ef86120cc565b73ffffffffffffffffffffffffffffffffffffffff16610f166114c6565b73ffffffffffffffffffffffffffffffffffffffff1614610f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f63906147b9565b60405180910390fd5b610f9781838573ffffffffffffffffffffffffffffffffffffffff166124c79092919063ffffffff16565b505050565b6000610fa6610ce3565b8210610fe7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fde90614899565b60405180910390fd5b60088281548110610ffb57610ffa614db1565b5b90600052602060002001549050919050565b6110156120cc565b73ffffffffffffffffffffffffffffffffffffffff166110336114c6565b73ffffffffffffffffffffffffffffffffffffffff1614611089576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611080906147b9565b60405180910390fd5b8181600b919061109a929190613642565b505050565b6000600a60149054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561115f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115690614739565b60405180910390fd5b80915050919050565b611b3981565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d690614719565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61122e6120cc565b73ffffffffffffffffffffffffffffffffffffffff1661124c6114c6565b73ffffffffffffffffffffffffffffffffffffffff16146112a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611299906147b9565b60405180910390fd5b6112ac600061254d565b565b670de0b6b3a764000081565b6112c26120cc565b73ffffffffffffffffffffffffffffffffffffffff166112e06114c6565b73ffffffffffffffffffffffffffffffffffffffff1614611336576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132d906147b9565b60405180910390fd5b8060128190555050565b600e5481565b60606113518461116e565b83106113b357600067ffffffffffffffff81111561137257611371614de0565b5b6040519080825280602002602001820160405280156113ab57816020015b6113986136c8565b8152602001906001900390816113905790505b5090506114ad565b60008290506113c18561116e565b83856113cd91906149f1565b106113e957836113dc8661116e565b6113e69190614ad2565b90505b60008167ffffffffffffffff81111561140557611404614de0565b5b60405190808252806020026020018201604052801561143e57816020015b61142b6136c8565b8152602001906001900390816114235790505b50905060005b828110156114a657600061146388838961145e91906149f1565b610d62565b905060405180602001604052808281525083838151811061148757611486614db1565b5b602002602001018190525050808061149e90614c4d565b915050611444565b5080925050505b9392505050565b6714d1120d7b16000081565b600d5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546114ff90614bea565b80601f016020809104026020016040519081016040528092919081815260200182805461152b90614bea565b80156115785780601f1061154d57610100808354040283529160200191611578565b820191906000526020600020905b81548152906001019060200180831161155b57829003601f168201915b5050505050905090565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6115ba6115b36120cc565b8383612613565b5050565b600080601054141580156115d457506010544210155b905090565b60105481565b6115e761109f565b15611627576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161e906146b9565b60405180910390fd5b6000801b601254141561166f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166690614659565b60405180910390fd5b611677611e6b565b6116b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ad906145f9565b60405180910390fd5b6116be6115be565b156116fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f590614519565b60405180910390fd5b60006117086120cc565b6040516020016117189190614347565b60405160208183030381529060405280519060200120905061177e848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060125483612780565b6117bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b4906148d9565b60405180910390fd5b6107d082600d546117ce91906149f1565b111561180f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180690614559565b60405180910390fd5b81670de0b6b3a76400006118239190614a78565b341015611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c90614539565b60405180910390fd5b81600d600082825461187791906149f1565b92505081905550816013600061188b6120cc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118d491906149f1565b925050819055506118ec826118e76120cc565b612797565b50505050565b80471015611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192c90614539565b60405180910390fd5b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161197d906143df565b60006040518083038185875af1925050503d80600081146119ba576040519150601f19603f3d011682016040523d82523d6000602084013e6119bf565b606091505b5050905080611a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fa90614759565b60405180910390fd5b5050565b611a18611a126120cc565b8361218d565b611a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4e90614859565b60405180910390fd5b611a63848484846127e0565b50505050565b6107d081565b6060611a7a82612060565b611ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab090614819565b60405180910390fd5b611ac161283c565b611aca836128ce565b604051602001611adb9291906143a5565b6040516020818303038152906040529050919050565b60136020528060005260406000206000915090505481565b600b8054611b1690614bea565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4290614bea565b8015611b8f5780601f10611b6457610100808354040283529160200191611b8f565b820191906000526020600020905b815481529060010190602001808311611b7257829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c336120cc565b73ffffffffffffffffffffffffffffffffffffffff16611c516114c6565b73ffffffffffffffffffffffffffffffffffffffff1614611ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9e906147b9565b60405180910390fd5b42811015611cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce1906146f9565b60405180910390fd5b80600f8190555050565b611cfc61109f565b15611d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d33906146b9565b60405180910390fd5b611d446115be565b611d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7a906145f9565b60405180910390fd5b600d54611b39611d939190614ad2565b81600c54611da191906149f1565b1115611de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd990614559565b60405180910390fd5b6000816714d1120d7b160000611df89190614a78565b905080341015611e3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3490614539565b60405180910390fd5b81600c6000828254611e4f91906149f1565b92505081905550611e6782611e626120cc565b612797565b5050565b600080600f5414158015611e815750600f544210155b905090565b611e8e6120cc565b73ffffffffffffffffffffffffffffffffffffffff16611eac6114c6565b73ffffffffffffffffffffffffffffffffffffffff1614611f02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef9906147b9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f69906145b9565b60405180910390fd5b611f7b8161254d565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061204957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612059575061205882612a2f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612147836110b6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061219882612060565b6121d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ce90614699565b60405180910390fd5b60006121e2836110b6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061225157508373ffffffffffffffffffffffffffffffffffffffff1661223984610b46565b73ffffffffffffffffffffffffffffffffffffffff16145b8061226257506122618185611b97565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661228b826110b6565b73ffffffffffffffffffffffffffffffffffffffff16146122e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d8906147f9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234890614619565b60405180910390fd5b61235c838383612a99565b6123676000826120d4565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123b79190614ad2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461240e91906149f1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6125488363a9059cbb60e01b84846040516024016124e6929190614476565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612bad565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267990614639565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161277391906144c1565b60405180910390a3505050565b60008261278d8584612c74565b1490509392505050565b60005b828110156127db576001600e60008282546127b591906149f1565b925050819055506127c882600e54612d27565b80806127d390614c4d565b91505061279a565b505050565b6127eb84848461226b565b6127f784848484612db3565b612836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282d90614599565b60405180910390fd5b50505050565b6060600b805461284b90614bea565b80601f016020809104026020016040519081016040528092919081815260200182805461287790614bea565b80156128c45780601f10612899576101008083540402835291602001916128c4565b820191906000526020600020905b8154815290600101906020018083116128a757829003601f168201915b5050505050905090565b60606000821415612916576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a2a565b600082905060005b6000821461294857808061293190614c4d565b915050600a826129419190614a47565b915061291e565b60008167ffffffffffffffff81111561296457612963614de0565b5b6040519080825280601f01601f1916602001820160405280156129965781602001600182028036833780820191505090505b5090505b60008514612a23576001826129af9190614ad2565b9150600a856129be9190614cc4565b60306129ca91906149f1565b60f81b8183815181106129e0576129df614db1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a1c9190614a47565b945061299a565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612aa4838383612f4a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ae757612ae281612f4f565b612b26565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612b2557612b248382612f98565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b6957612b6481613105565b612ba8565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ba757612ba682826131d6565b5b5b505050565b6000612c0f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166132559092919063ffffffff16565b9050600081511115612c6f5780806020019051810190612c2f9190613b32565b612c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c65906148b9565b60405180910390fd5b5b505050565b60008082905060005b8451811015612d1c576000858281518110612c9b57612c9a614db1565b5b60200260200101519050808311612cdc578281604051602001612cbf929190614362565b604051602081830303815290604052805190602001209250612d08565b8083604051602001612cef929190614362565b6040516020818303038152906040528051906020012092505b508080612d1490614c4d565b915050612c7d565b508091505092915050565b611b39600e541115612d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d65906147d9565b60405180910390fd5b612d78828261326d565b7fcd49fe78c956bbd23729648935727fbc93719b63039433ede7e6a21a2d157eb681604051612da791906148f9565b60405180910390a15050565b6000612dd48473ffffffffffffffffffffffffffffffffffffffff1661328b565b15612f3d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612dfd6120cc565b8786866040518563ffffffff1660e01b8152600401612e1f949392919061442a565b602060405180830381600087803b158015612e3957600080fd5b505af1925050508015612e6a57506040513d601f19601f82011682018060405250810190612e679190613bb9565b60015b612eed573d8060008114612e9a576040519150601f19603f3d011682016040523d82523d6000602084013e612e9f565b606091505b50600081511415612ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612edc90614599565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f42565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612fa58461116e565b612faf9190614ad2565b9050600060076000848152602001908152602001600020549050818114613094576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506131199190614ad2565b905060006009600084815260200190815260200160002054905060006008838154811061314957613148614db1565b5b90600052602060002001549050806008838154811061316b5761316a614db1565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806131ba576131b9614d82565b5b6001900381819060005260206000200160009055905550505050565b60006131e18361116e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6060613264848460008561329e565b90509392505050565b6132878282604051806020016040528060008152506133b2565b5050565b600080823b905060008111915050919050565b6060824710156132e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132da90614679565b60405180910390fd5b6132ec8561328b565b61332b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332290614879565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613354919061438e565b60006040518083038185875af1925050503d8060008114613391576040519150601f19603f3d011682016040523d82523d6000602084013e613396565b606091505b50915091506133a682828661340d565b92505050949350505050565b6133bc8383613474565b6133c96000848484612db3565b613408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ff90614599565b60405180910390fd5b505050565b6060831561341d5782905061346d565b6000835111156134305782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346491906144f7565b60405180910390fd5b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134db90614779565b60405180910390fd5b6134ed81612060565b1561352d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613524906145d9565b60405180910390fd5b61353960008383612a99565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461358991906149f1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461364e90614bea565b90600052602060002090601f01602090048101928261367057600085556136b7565b82601f1061368957803560ff19168380011785556136b7565b828001600101855582156136b7579182015b828111156136b657823582559160200191906001019061369b565b5b5090506136c491906136db565b5090565b6040518060200160405280600081525090565b5b808211156136f45760008160009055506001016136dc565b5090565b600061370b61370684614939565b614914565b90508281526020810184848401111561372757613726614e1e565b5b613732848285614ba8565b509392505050565b60008135905061374981615643565b92915050565b60008083601f84011261376557613764614e14565b5b8235905067ffffffffffffffff81111561378257613781614e0f565b5b60208301915083602082028301111561379e5761379d614e19565b5b9250929050565b6000813590506137b48161565a565b92915050565b6000815190506137c98161565a565b92915050565b6000813590506137de81615671565b92915050565b6000813590506137f381615688565b92915050565b60008151905061380881615688565b92915050565b600082601f83011261382357613822614e14565b5b81356138338482602086016136f8565b91505092915050565b60008135905061384b8161569f565b92915050565b60008083601f84011261386757613866614e14565b5b8235905067ffffffffffffffff81111561388457613883614e0f565b5b6020830191508360018202830111156138a05761389f614e19565b5b9250929050565b6000813590506138b6816156b6565b92915050565b6000602082840312156138d2576138d1614e28565b5b60006138e08482850161373a565b91505092915050565b60008060408385031215613900576138ff614e28565b5b600061390e8582860161373a565b925050602061391f8582860161373a565b9150509250929050565b60008060006060848603121561394257613941614e28565b5b60006139508682870161373a565b93505060206139618682870161373a565b9250506040613972868287016138a7565b9150509250925092565b6000806000806080858703121561399657613995614e28565b5b60006139a48782880161373a565b94505060206139b58782880161373a565b93505060406139c6878288016138a7565b925050606085013567ffffffffffffffff8111156139e7576139e6614e23565b5b6139f38782880161380e565b91505092959194509250565b60008060408385031215613a1657613a15614e28565b5b6000613a248582860161373a565b9250506020613a35858286016137a5565b9150509250929050565b60008060408385031215613a5657613a55614e28565b5b6000613a648582860161373a565b9250506020613a75858286016138a7565b9150509250929050565b600080600060608486031215613a9857613a97614e28565b5b6000613aa68682870161373a565b9350506020613ab7868287016138a7565b9250506040613ac8868287016138a7565b9150509250925092565b600080600060408486031215613aeb57613aea614e28565b5b600084013567ffffffffffffffff811115613b0957613b08614e23565b5b613b158682870161374f565b93509350506020613b28868287016138a7565b9150509250925092565b600060208284031215613b4857613b47614e28565b5b6000613b56848285016137ba565b91505092915050565b600060208284031215613b7557613b74614e28565b5b6000613b83848285016137cf565b91505092915050565b600060208284031215613ba257613ba1614e28565b5b6000613bb0848285016137e4565b91505092915050565b600060208284031215613bcf57613bce614e28565b5b6000613bdd848285016137f9565b91505092915050565b600080600060608486031215613bff57613bfe614e28565b5b6000613c0d8682870161383c565b9350506020613c1e868287016138a7565b9250506040613c2f8682870161373a565b9150509250925092565b60008060208385031215613c5057613c4f614e28565b5b600083013567ffffffffffffffff811115613c6e57613c6d614e23565b5b613c7a85828601613851565b92509250509250929050565b600060208284031215613c9c57613c9b614e28565b5b6000613caa848285016138a7565b91505092915050565b6000613cbf838361430d565b60208301905092915050565b613cd481614b18565b82525050565b613ce381614b06565b82525050565b613cfa613cf582614b06565b614c96565b82525050565b6000613d0b8261497a565b613d1581856149a8565b9350613d208361496a565b8060005b83811015613d51578151613d388882613cb3565b9750613d438361499b565b925050600181019050613d24565b5085935050505092915050565b613d6781614b2a565b82525050565b613d7681614b36565b82525050565b613d8d613d8882614b36565b614ca8565b82525050565b6000613d9e82614985565b613da881856149b9565b9350613db8818560208601614bb7565b613dc181614e2d565b840191505092915050565b6000613dd782614985565b613de181856149ca565b9350613df1818560208601614bb7565b80840191505092915050565b6000613e0882614990565b613e1281856149d5565b9350613e22818560208601614bb7565b613e2b81614e2d565b840191505092915050565b6000613e4182614990565b613e4b81856149e6565b9350613e5b818560208601614bb7565b80840191505092915050565b6000613e74601b836149d5565b9150613e7f82614e4b565b602082019050919050565b6000613e97600f836149d5565b9150613ea282614e74565b602082019050919050565b6000613eba6022836149d5565b9150613ec582614e9d565b604082019050919050565b6000613edd602b836149d5565b9150613ee882614eec565b604082019050919050565b6000613f006032836149d5565b9150613f0b82614f3b565b604082019050919050565b6000613f236026836149d5565b9150613f2e82614f8a565b604082019050919050565b6000613f46601c836149d5565b9150613f5182614fd9565b602082019050919050565b6000613f696015836149d5565b9150613f7482615002565b602082019050919050565b6000613f8c6024836149d5565b9150613f978261502b565b604082019050919050565b6000613faf6019836149d5565b9150613fba8261507a565b602082019050919050565b6000613fd2600c836149d5565b9150613fdd826150a3565b602082019050919050565b6000613ff56026836149d5565b9150614000826150cc565b604082019050919050565b6000614018602c836149d5565b91506140238261511b565b604082019050919050565b600061403b6010836149d5565b91506140468261516a565b602082019050919050565b600061405e6038836149d5565b915061406982615193565b604082019050919050565b6000614081601f836149d5565b915061408c826151e2565b602082019050919050565b60006140a4602a836149d5565b91506140af8261520b565b604082019050919050565b60006140c76029836149d5565b91506140d28261525a565b604082019050919050565b60006140ea6013836149d5565b91506140f5826152a9565b602082019050919050565b600061410d6020836149d5565b9150614118826152d2565b602082019050919050565b6000614130602c836149d5565b915061413b826152fb565b604082019050919050565b60006141536005836149e6565b915061415e8261534a565b600582019050919050565b60006141766020836149d5565b915061418182615373565b602082019050919050565b60006141996018836149d5565b91506141a48261539c565b602082019050919050565b60006141bc6029836149d5565b91506141c7826153c5565b604082019050919050565b60006141df602f836149d5565b91506141ea82615414565b604082019050919050565b60006142026021836149d5565b915061420d82615463565b604082019050919050565b60006142256000836149ca565b9150614230826154b2565b600082019050919050565b60006142486031836149d5565b9150614253826154b5565b604082019050919050565b600061426b601d836149d5565b915061427682615504565b602082019050919050565b600061428e602c836149d5565b91506142998261552d565b604082019050919050565b60006142b1602a836149d5565b91506142bc8261557c565b604082019050919050565b60006142d46025836149d5565b91506142df826155cb565b604082019050919050565b60006142f76001836149e6565b91506143028261561a565b600182019050919050565b6020820160008201516143236000850182614329565b50505050565b61433281614b9e565b82525050565b61434181614b9e565b82525050565b60006143538284613ce9565b60148201915081905092915050565b600061436e8285613d7c565b60208201915061437e8284613d7c565b6020820191508190509392505050565b600061439a8284613dcc565b915081905092915050565b60006143b18285613e36565b91506143bc826142ea565b91506143c88284613e36565b91506143d382614146565b91508190509392505050565b60006143ea82614218565b9150819050919050565b60006020820190506144096000830184613cda565b92915050565b60006020820190506144246000830184613ccb565b92915050565b600060808201905061443f6000830187613cda565b61444c6020830186613cda565b6144596040830185614338565b818103606083015261446b8184613d93565b905095945050505050565b600060408201905061448b6000830185613cda565b6144986020830184614338565b9392505050565b600060208201905081810360008301526144b98184613d00565b905092915050565b60006020820190506144d66000830184613d5e565b92915050565b60006020820190506144f16000830184613d6d565b92915050565b600060208201905081810360008301526145118184613dfd565b905092915050565b6000602082019050818103600083015261453281613e67565b9050919050565b6000602082019050818103600083015261455281613e8a565b9050919050565b6000602082019050818103600083015261457281613ead565b9050919050565b6000602082019050818103600083015261459281613ed0565b9050919050565b600060208201905081810360008301526145b281613ef3565b9050919050565b600060208201905081810360008301526145d281613f16565b9050919050565b600060208201905081810360008301526145f281613f39565b9050919050565b6000602082019050818103600083015261461281613f5c565b9050919050565b6000602082019050818103600083015261463281613f7f565b9050919050565b6000602082019050818103600083015261465281613fa2565b9050919050565b6000602082019050818103600083015261467281613fc5565b9050919050565b6000602082019050818103600083015261469281613fe8565b9050919050565b600060208201905081810360008301526146b28161400b565b9050919050565b600060208201905081810360008301526146d28161402e565b9050919050565b600060208201905081810360008301526146f281614051565b9050919050565b6000602082019050818103600083015261471281614074565b9050919050565b6000602082019050818103600083015261473281614097565b9050919050565b60006020820190508181036000830152614752816140ba565b9050919050565b60006020820190508181036000830152614772816140dd565b9050919050565b6000602082019050818103600083015261479281614100565b9050919050565b600060208201905081810360008301526147b281614123565b9050919050565b600060208201905081810360008301526147d281614169565b9050919050565b600060208201905081810360008301526147f28161418c565b9050919050565b60006020820190508181036000830152614812816141af565b9050919050565b60006020820190508181036000830152614832816141d2565b9050919050565b60006020820190508181036000830152614852816141f5565b9050919050565b600060208201905081810360008301526148728161423b565b9050919050565b600060208201905081810360008301526148928161425e565b9050919050565b600060208201905081810360008301526148b281614281565b9050919050565b600060208201905081810360008301526148d2816142a4565b9050919050565b600060208201905081810360008301526148f2816142c7565b9050919050565b600060208201905061490e6000830184614338565b92915050565b600061491e61492f565b905061492a8282614c1c565b919050565b6000604051905090565b600067ffffffffffffffff82111561495457614953614de0565b5b61495d82614e2d565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006149fc82614b9e565b9150614a0783614b9e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a3c57614a3b614cf5565b5b828201905092915050565b6000614a5282614b9e565b9150614a5d83614b9e565b925082614a6d57614a6c614d24565b5b828204905092915050565b6000614a8382614b9e565b9150614a8e83614b9e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ac757614ac6614cf5565b5b828202905092915050565b6000614add82614b9e565b9150614ae883614b9e565b925082821015614afb57614afa614cf5565b5b828203905092915050565b6000614b1182614b7e565b9050919050565b6000614b2382614b7e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614b7782614b06565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614bd5578082015181840152602081019050614bba565b83811115614be4576000848401525b50505050565b60006002820490506001821680614c0257607f821691505b60208210811415614c1657614c15614d53565b5b50919050565b614c2582614e2d565b810181811067ffffffffffffffff82111715614c4457614c43614de0565b5b80604052505050565b6000614c5882614b9e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c8b57614c8a614cf5565b5b600182019050919050565b6000614ca182614cb2565b9050919050565b6000819050919050565b6000614cbd82614e3e565b9050919050565b6000614ccf82614b9e565b9150614cda83614b9e565b925082614cea57614ce9614d24565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f77686974656c697374206d696e74696e6720697320636c6f7365640000000000600082015250565b7f6e6f7420656e6f75676820415641580000000000000000000000000000000000600082015250565b7f796f752063616e2774206d696e742074686174206d616e79207269676874206e60008201527f6f77000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f63616e6e6f74206d696e74207269676874206e6f770000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f6d697373696e6720726f6f740000000000000000000000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f737461727454696d652063616e6e6f7420626520696e20746865207061737400600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f2073656e64204156415800000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f63616e6e6f74206d696e7420616e796d6f726520686f65730000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f74686973206164647265737320646f6573206e6f742068617665207065726d6960008201527f7373696f6e000000000000000000000000000000000000000000000000000000602082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b61564c81614b06565b811461565757600080fd5b50565b61566381614b2a565b811461566e57600080fd5b50565b61567a81614b36565b811461568557600080fd5b50565b61569181614b40565b811461569c57600080fd5b50565b6156a881614b6c565b81146156b357600080fd5b50565b6156bf81614b9e565b81146156ca57600080fd5b5056fea26469706673582212206738557770c37425863bcbec59a18a2da04ce0eb6b65ebc0509f77b7560d0d5c64736f6c63430008070033000000000000000000000000fed3445457f57a3fe4d50b3ecbfb523a049045a0
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000fed3445457f57a3fe4d50b3ecbfb523a049045a0
-----Decoded View---------------
Arg [0] : _DAO (address): 0xfed3445457f57a3fe4d50b3ecbfb523a049045a0
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000fed3445457f57a3fe4d50b3ecbfb523a049045a0
Deployed ByteCode Sourcemap
67470:5966:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61295:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48876:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50435:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49958:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61935:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67974:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51185:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68125:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68255:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61603:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69504:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51595:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70083:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62125:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69707:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16472:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48570:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67852:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48300:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14585:103;;;;;;;;;;;;;:::i;:::-;;67678:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69878:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68055:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72689:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67738:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68014:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13934:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49045:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68202:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50728:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68714:137;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68165:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71071:979;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70297:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51851:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67797:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68995:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68287:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67921:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50954:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69291:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72097:537;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68554:152;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14843:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61295:224;61397:4;61436:35;61421:50;;;:11;:50;;;;:90;;;;61475:36;61499:11;61475:23;:36::i;:::-;61421:90;61414:97;;61295:224;;;:::o;48876:100::-;48930:13;48963:5;48956:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48876:100;:::o;50435:221::-;50511:7;50539:16;50547:7;50539;:16::i;:::-;50531:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50624:15;:24;50640:7;50624:24;;;;;;;;;;;;;;;;;;;;;50617:31;;50435:221;;;:::o;49958:411::-;50039:13;50055:23;50070:7;50055:14;:23::i;:::-;50039:39;;50103:5;50097:11;;:2;:11;;;;50089:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50197:5;50181:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;50206:37;50223:5;50230:12;:10;:12::i;:::-;50206:16;:37::i;:::-;50181:62;50159:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;50340:21;50349:2;50353:7;50340:8;:21::i;:::-;50028:341;49958:411;;:::o;61935:113::-;61996:7;62023:10;:17;;;;62016:24;;61935:113;:::o;67974:33::-;;;;:::o;51185:339::-;51380:41;51399:12;:10;:12::i;:::-;51413:7;51380:18;:41::i;:::-;51372:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;51488:28;51498:4;51504:2;51508:7;51488:9;:28::i;:::-;51185:339;;;:::o;68125:33::-;;;;:::o;68255:25::-;;;;:::o;61603:256::-;61700:7;61736:23;61753:5;61736:16;:23::i;:::-;61728:5;:31;61720:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;61825:12;:19;61838:5;61825:19;;;;;;;;;;;;;;;:26;61845:5;61825:26;;;;;;;;;;;;61818:33;;61603:256;;;;:::o;69504:195::-;14165:12;:10;:12::i;:::-;14154:23;;:7;:5;:7::i;:::-;:23;;;14146:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69603:15:::1;69589:10;:29;;69580:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;69681:10;69665:13;:26;;;;69504:195:::0;:::o;51595:185::-;51733:39;51750:4;51756:2;51760:7;51733:39;;;;;;;;;;;;:16;:39::i;:::-;51595:185;;;:::o;70083:145::-;14165:12;:10;:12::i;:::-;14154:23;;:7;:5;:7::i;:::-;:23;;;14146:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70184:36:::1;70204:6;70212:7;70184:6;:19;;;;:36;;;;;:::i;:::-;70083:145:::0;;;:::o;62125:233::-;62200:7;62236:30;:28;:30::i;:::-;62228:5;:38;62220:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;62333:10;62344:5;62333:17;;;;;;;;:::i;:::-;;;;;;;;;;62326:24;;62125:233;;;:::o;69707:105::-;14165:12;:10;:12::i;:::-;14154:23;;:7;:5;:7::i;:::-;:23;;;14146:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69795:9:::1;;69784:8;:20;;;;;;;:::i;:::-;;69707:105:::0;;:::o;16472:86::-;16519:4;16543:7;;;;;;;;;;;16536:14;;16472:86;:::o;48570:239::-;48642:7;48662:13;48678:7;:16;48686:7;48678:16;;;;;;;;;;;;;;;;;;;;;48662:32;;48730:1;48713:19;;:5;:19;;;;48705:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48796:5;48789:12;;;48570:239;;;:::o;67852:39::-;67887:4;67852:39;:::o;48300:208::-;48372:7;48417:1;48400:19;;:5;:19;;;;48392:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;48484:9;:16;48494:5;48484:16;;;;;;;;;;;;;;;;48477:23;;48300:208;;;:::o;14585:103::-;14165:12;:10;:12::i;:::-;14154:23;;:7;:5;:7::i;:::-;:23;;;14146:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14650:30:::1;14677:1;14650:18;:30::i;:::-;14585:103::o:0;67678:53::-;67724:7;67678:53;:::o;69878:106::-;14165:12;:10;:12::i;:::-;14154:23;;:7;:5;:7::i;:::-;:23;;;14146:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69965:11:::1;69952:10;:24;;;;69878:106:::0;:::o;68055:29::-;;;;:::o;72689:744::-;72789:16;72833:17;72843:6;72833:9;:17::i;:::-;72822:7;:28;72818:84;;72888:1;72874:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;72867:23;;;;72818:84;72914:18;72935:8;72914:29;;72980:17;72990:6;72980:9;:17::i;:::-;72968:8;72958:7;:18;;;;:::i;:::-;:39;72954:112;;73047:7;73027:17;73037:6;73027:9;:17::i;:::-;:27;;;;:::i;:::-;73014:40;;72954:112;73076:21;73114:10;73100:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;73076:49;;73143:9;73138:264;73162:10;73158:1;:14;73138:264;;;73194:15;73212:40;73232:6;73250:1;73240:7;:11;;;;:::i;:::-;73212:19;:40::i;:::-;73194:58;;73331:59;;;;;;;;73367:7;73331:59;;;73321:4;73326:1;73321:7;;;;;;;;:::i;:::-;;;;;;;:69;;;;73179:223;73174:3;;;;;:::i;:::-;;;;73138:264;;;;73421:4;73414:11;;;;72689:744;;;;;;:::o;67738:50::-;67779:9;67738:50;:::o;68014:34::-;;;;:::o;13934:87::-;13980:7;14007:6;;;;;;;;;;;14000:13;;13934:87;:::o;49045:104::-;49101:13;49134:7;49127:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49045:104;:::o;68202:26::-;;;;;;;;;;;;;:::o;50728:155::-;50823:52;50842:12;:10;:12::i;:::-;50856:8;50866;50823:18;:52::i;:::-;50728:155;;:::o;68714:137::-;68765:4;68806:1;68789:13;;:18;;:54;;;;;68830:13;;68811:15;:32;;68789:54;68782:61;;68714:137;:::o;68165:28::-;;;;:::o;71071:979::-;16798:8;:6;:8::i;:::-;16797:9;16789:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;71246:1:::1;71232:15:::0;::::1;:10;;:15;;71224:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;71283:25;:23;:25::i;:::-;71275:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;71355:20;:18;:20::i;:::-;71354:21;71345:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;71470:12;71512;:10;:12::i;:::-;71495:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;71485:41;;;;;;71470:56;;71545:50;71564:12;;71545:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71578:10;;71590:4;71545:18;:50::i;:::-;71537:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;67838:4;71726:3;71704:19;;:25;;;;:::i;:::-;71703:45;;71695:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;71867:3;67724:7;71845:25;;;;:::i;:::-;71832:9;:38;;71824:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;71926:3;71903:19;;:26;;;;;;;:::i;:::-;;;;;;;;71974:3;71940:16;:30;71957:12;:10;:12::i;:::-;71940:30;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;72012:30;72024:3;72029:12;:10;:12::i;:::-;72012:11;:30::i;:::-;71171:879;71071:979:::0;;;:::o;70297:229::-;70389:7;70364:21;:32;;70356:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;70428:9;70443:3;;;;;;;;;;;:8;;70459:7;70443:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70427:44;;;70490:4;70482:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;70345:181;70297:229;:::o;51851:328::-;52026:41;52045:12;:10;:12::i;:::-;52059:7;52026:18;:41::i;:::-;52018:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;52132:39;52146:4;52152:2;52156:7;52165:5;52132:13;:39::i;:::-;51851:328;;;;:::o;67797:45::-;67838:4;67797:45;:::o;68995:272::-;69068:13;69103:16;69111:7;69103;:16::i;:::-;69094:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;69213:10;:8;:10::i;:::-;69230:18;:7;:16;:18::i;:::-;69196:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69182:77;;68995:272;;;:::o;68287:51::-;;;;;;;;;;;;;;;;;:::o;67921:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50954:164::-;51051:4;51075:18;:25;51094:5;51075:25;;;;;;;;;;;;;;;:35;51101:8;51075:35;;;;;;;;;;;;;;;;;;;;;;;;;51068:42;;50954:164;;;;:::o;69291:205::-;14165:12;:10;:12::i;:::-;14154:23;;:7;:5;:7::i;:::-;:23;;;14146:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69395:15:::1;69381:10;:29;;69372:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;69478:10;69457:18;:31;;;;69291:205:::0;:::o;72097:537::-;16798:8;:6;:8::i;:::-;16797:9;16789:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;72186:20:::1;:18;:20::i;:::-;72177:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;72294:19;;67887:4;72283:30;;;;:::i;:::-;72274:3;72253:18;;:24;;;;:::i;:::-;72252:62;;72243:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;72409:23;72452:3;67779:9;72435:20;;;;:::i;:::-;72409:46;;72488:15;72475:9;:28;;72466:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;72558:3;72536:18;;:25;;;;;;;:::i;:::-;;;;;;;;72596:30;72608:3;72613:12;:10;:12::i;:::-;72596:11;:30::i;:::-;72166:468;72097:537:::0;:::o;68554:152::-;68610:4;68656:1;68634:18;;:23;;:64;;;;;68680:18;;68661:15;:37;;68634:64;68627:71;;68554:152;:::o;14843:201::-;14165:12;:10;:12::i;:::-;14154:23;;:7;:5;:7::i;:::-;:23;;;14146:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14952:1:::1;14932:22;;:8;:22;;;;14924:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15008:28;15027:8;15008:18;:28::i;:::-;14843:201:::0;:::o;47931:305::-;48033:4;48085:25;48070:40;;;:11;:40;;;;:105;;;;48142:33;48127:48;;;:11;:48;;;;48070:105;:158;;;;48192:36;48216:11;48192:23;:36::i;:::-;48070:158;48050:178;;47931:305;;;:::o;53689:127::-;53754:4;53806:1;53778:30;;:7;:16;53786:7;53778:16;;;;;;;;;;;;;;;;;;;;;:30;;;;53771:37;;53689:127;;;:::o;703:98::-;756:7;783:10;776:17;;703:98;:::o;57671:174::-;57773:2;57746:15;:24;57762:7;57746:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;57829:7;57825:2;57791:46;;57800:23;57815:7;57800:14;:23::i;:::-;57791:46;;;;;;;;;;;;57671:174;;:::o;53983:348::-;54076:4;54101:16;54109:7;54101;:16::i;:::-;54093:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54177:13;54193:23;54208:7;54193:14;:23::i;:::-;54177:39;;54246:5;54235:16;;:7;:16;;;:51;;;;54279:7;54255:31;;:20;54267:7;54255:11;:20::i;:::-;:31;;;54235:51;:87;;;;54290:32;54307:5;54314:7;54290:16;:32::i;:::-;54235:87;54227:96;;;53983:348;;;;:::o;56975:578::-;57134:4;57107:31;;:23;57122:7;57107:14;:23::i;:::-;:31;;;57099:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;57217:1;57203:16;;:2;:16;;;;57195:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;57273:39;57294:4;57300:2;57304:7;57273:20;:39::i;:::-;57377:29;57394:1;57398:7;57377:8;:29::i;:::-;57438:1;57419:9;:15;57429:4;57419:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;57467:1;57450:9;:13;57460:2;57450:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;57498:2;57479:7;:16;57487:7;57479:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;57537:7;57533:2;57518:27;;57527:4;57518:27;;;;;;;;;;;;56975:578;;;:::o;9637:211::-;9754:86;9774:5;9804:23;;;9829:2;9833:5;9781:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9754:19;:86::i;:::-;9637:211;;;:::o;15204:191::-;15278:16;15297:6;;;;;;;;;;;15278:25;;15323:8;15314:6;;:17;;;;;;;;;;;;;;;;;;15378:8;15347:40;;15368:8;15347:40;;;;;;;;;;;;15267:128;15204:191;:::o;57987:315::-;58142:8;58133:17;;:5;:17;;;;58125:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;58229:8;58191:18;:25;58210:5;58191:25;;;;;;;;;;;;;;;:35;58217:8;58191:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;58275:8;58253:41;;58268:5;58253:41;;;58285:8;58253:41;;;;;;:::i;:::-;;;;;;;;57987:315;;;:::o;20561:190::-;20686:4;20739;20710:25;20723:5;20730:4;20710:12;:25::i;:::-;:33;20703:40;;20561:190;;;;;:::o;70769:::-;70840:9;70835:117;70859:3;70855:1;:7;70835:117;;;70898:1;70884:10;;:15;;;;;;;:::i;:::-;;;;;;;;70914:26;70925:2;70929:10;;70914;:26::i;:::-;70864:3;;;;;:::i;:::-;;;;70835:117;;;;70769:190;;:::o;53061:315::-;53218:28;53228:4;53234:2;53238:7;53218:9;:28::i;:::-;53265:48;53288:4;53294:2;53298:7;53307:5;53265:22;:48::i;:::-;53257:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;53061:315;;;;:::o;68878:109::-;68938:13;68971:8;68964:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68878:109;:::o;17967:723::-;18023:13;18253:1;18244:5;:10;18240:53;;;18271:10;;;;;;;;;;;;;;;;;;;;;18240:53;18303:12;18318:5;18303:20;;18334:14;18359:78;18374:1;18366:4;:9;18359:78;;18392:8;;;;;:::i;:::-;;;;18423:2;18415:10;;;;;:::i;:::-;;;18359:78;;;18447:19;18479:6;18469:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18447:39;;18497:154;18513:1;18504:5;:10;18497:154;;18541:1;18531:11;;;;;:::i;:::-;;;18608:2;18600:5;:10;;;;:::i;:::-;18587:2;:24;;;;:::i;:::-;18574:39;;18557:6;18564;18557:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18637:2;18628:11;;;;;:::i;:::-;;;18497:154;;;18675:6;18661:21;;;;;17967:723;;;;:::o;39938:157::-;40023:4;40062:25;40047:40;;;:11;:40;;;;40040:47;;39938:157;;;:::o;62971:589::-;63115:45;63142:4;63148:2;63152:7;63115:26;:45::i;:::-;63193:1;63177:18;;:4;:18;;;63173:187;;;63212:40;63244:7;63212:31;:40::i;:::-;63173:187;;;63282:2;63274:10;;:4;:10;;;63270:90;;63301:47;63334:4;63340:7;63301:32;:47::i;:::-;63270:90;63173:187;63388:1;63374:16;;:2;:16;;;63370:183;;;63407:45;63444:7;63407:36;:45::i;:::-;63370:183;;;63480:4;63474:10;;:2;:10;;;63470:83;;63501:40;63529:2;63533:7;63501:27;:40::i;:::-;63470:83;63370:183;62971:589;;;:::o;12210:716::-;12634:23;12660:69;12688:4;12660:69;;;;;;;;;;;;;;;;;12668:5;12660:27;;;;:69;;;;;:::i;:::-;12634:95;;12764:1;12744:10;:17;:21;12740:179;;;12841:10;12830:30;;;;;;;;;;;;:::i;:::-;12822:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;12740:179;12280:646;12210:716;;:::o;21113:701::-;21196:7;21216:20;21239:4;21216:27;;21259:9;21254:523;21278:5;:12;21274:1;:16;21254:523;;;21312:20;21335:5;21341:1;21335:8;;;;;;;;:::i;:::-;;;;;;;;21312:31;;21378:12;21362;:28;21358:408;;21532:12;21546;21515:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21505:55;;;;;;21490:70;;21358:408;;;21722:12;21736;21705:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21695:55;;;;;;21680:70;;21358:408;21297:480;21292:3;;;;;:::i;:::-;;;;21254:523;;;;21794:12;21787:19;;;21113:701;;;;:::o;70552:209::-;67887:4;70630:10;;:22;;70621:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;70692:22;70702:2;70706:7;70692:9;:22::i;:::-;70732:21;70745:7;70732:21;;;;;;:::i;:::-;;;;;;;;70552:209;;:::o;58867:799::-;59022:4;59043:15;:2;:13;;;:15::i;:::-;59039:620;;;59095:2;59079:36;;;59116:12;:10;:12::i;:::-;59130:4;59136:7;59145:5;59079:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;59075:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59338:1;59321:6;:13;:18;59317:272;;;59364:60;;;;;;;;;;:::i;:::-;;;;;;;;59317:272;59539:6;59533:13;59524:6;59520:2;59516:15;59509:38;59075:529;59212:41;;;59202:51;;;:6;:51;;;;59195:58;;;;;59039:620;59643:4;59636:11;;58867:799;;;;;;;:::o;60238:126::-;;;;:::o;64283:164::-;64387:10;:17;;;;64360:15;:24;64376:7;64360:24;;;;;;;;;;;:44;;;;64415:10;64431:7;64415:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64283:164;:::o;65074:988::-;65340:22;65390:1;65365:22;65382:4;65365:16;:22::i;:::-;:26;;;;:::i;:::-;65340:51;;65402:18;65423:17;:26;65441:7;65423:26;;;;;;;;;;;;65402:47;;65570:14;65556:10;:28;65552:328;;65601:19;65623:12;:18;65636:4;65623:18;;;;;;;;;;;;;;;:34;65642:14;65623:34;;;;;;;;;;;;65601:56;;65707:11;65674:12;:18;65687:4;65674:18;;;;;;;;;;;;;;;:30;65693:10;65674:30;;;;;;;;;;;:44;;;;65824:10;65791:17;:30;65809:11;65791:30;;;;;;;;;;;:43;;;;65586:294;65552:328;65976:17;:26;65994:7;65976:26;;;;;;;;;;;65969:33;;;66020:12;:18;66033:4;66020:18;;;;;;;;;;;;;;;:34;66039:14;66020:34;;;;;;;;;;;66013:41;;;65155:907;;65074:988;;:::o;66357:1079::-;66610:22;66655:1;66635:10;:17;;;;:21;;;;:::i;:::-;66610:46;;66667:18;66688:15;:24;66704:7;66688:24;;;;;;;;;;;;66667:45;;67039:19;67061:10;67072:14;67061:26;;;;;;;;:::i;:::-;;;;;;;;;;67039:48;;67125:11;67100:10;67111;67100:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;67236:10;67205:15;:28;67221:11;67205:28;;;;;;;;;;;:41;;;;67377:15;:24;67393:7;67377:24;;;;;;;;;;;67370:31;;;67412:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;66428:1008;;;66357:1079;:::o;63861:221::-;63946:14;63963:20;63980:2;63963:16;:20::i;:::-;63946:37;;64021:7;63994:12;:16;64007:2;63994:16;;;;;;;;;;;;;;;:24;64011:6;63994:24;;;;;;;;;;;:34;;;;64068:6;64039:17;:26;64057:7;64039:26;;;;;;;;;;;:35;;;;63935:147;63861:221;;:::o;4487:229::-;4624:12;4656:52;4678:6;4686:4;4692:1;4695:12;4656:21;:52::i;:::-;4649:59;;4487:229;;;;;:::o;54673:110::-;54749:26;54759:2;54763:7;54749:26;;;;;;;;;;;;:9;:26::i;:::-;54673:110;;:::o;1681:387::-;1741:4;1949:12;2016:7;2004:20;1996:28;;2059:1;2052:4;:8;2045:15;;;1681:387;;;:::o;5607:510::-;5777:12;5835:5;5810:21;:30;;5802:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;5902:18;5913:6;5902:10;:18::i;:::-;5894:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5968:12;5982:23;6009:6;:11;;6028:5;6035:4;6009:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5967:73;;;;6058:51;6075:7;6084:10;6096:12;6058:16;:51::i;:::-;6051:58;;;;5607:510;;;;;;:::o;55010:321::-;55140:18;55146:2;55150:7;55140:5;:18::i;:::-;55191:54;55222:1;55226:2;55230:7;55239:5;55191:22;:54::i;:::-;55169:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;55010:321;;;:::o;8293:712::-;8443:12;8472:7;8468:530;;;8503:10;8496:17;;;;8468:530;8637:1;8617:10;:17;:21;8613:374;;;8815:10;8809:17;8876:15;8863:10;8859:2;8855:19;8848:44;8613:374;8958:12;8951:20;;;;;;;;;;;:::i;:::-;;;;;;;;8293:712;;;;;;:::o;55667:382::-;55761:1;55747:16;;:2;:16;;;;55739:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;55820:16;55828:7;55820;:16::i;:::-;55819:17;55811:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;55882:45;55911:1;55915:2;55919:7;55882:20;:45::i;:::-;55957:1;55940:9;:13;55950:2;55940:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;55988:2;55969:7;:16;55977:7;55969:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;56033:7;56029:2;56008:33;;56025:1;56008:33;;;;;;;;;;;;55667:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:122;;726:79;;:::i;:::-;685:122;839:6;826:20;816:30;;869:18;861:6;858:30;855:117;;;891:79;;:::i;:::-;855:117;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:128;;;1066:79;;:::i;:::-;1019:128;585:568;;;;;:::o;1159:133::-;1202:5;1240:6;1227:20;1218:29;;1256:30;1280:5;1256:30;:::i;:::-;1159:133;;;;:::o;1298:137::-;1352:5;1383:6;1377:13;1368:22;;1399:30;1423:5;1399:30;:::i;:::-;1298:137;;;;:::o;1441:139::-;1487:5;1525:6;1512:20;1503:29;;1541:33;1568:5;1541:33;:::i;:::-;1441:139;;;;:::o;1586:137::-;1631:5;1669:6;1656:20;1647:29;;1685:32;1711:5;1685:32;:::i;:::-;1586:137;;;;:::o;1729:141::-;1785:5;1816:6;1810:13;1801:22;;1832:32;1858:5;1832:32;:::i;:::-;1729:141;;;;:::o;1889:338::-;1944:5;1993:3;1986:4;1978:6;1974:17;1970:27;1960:122;;2001:79;;:::i;:::-;1960:122;2118:6;2105:20;2143:78;2217:3;2209:6;2202:4;2194:6;2190:17;2143:78;:::i;:::-;2134:87;;1950:277;1889:338;;;;:::o;2233:169::-;2294:5;2332:6;2319:20;2310:29;;2348:48;2390:5;2348:48;:::i;:::-;2233:169;;;;:::o;2422:553::-;2480:8;2490:6;2540:3;2533:4;2525:6;2521:17;2517:27;2507:122;;2548:79;;:::i;:::-;2507:122;2661:6;2648:20;2638:30;;2691:18;2683:6;2680:30;2677:117;;;2713:79;;:::i;:::-;2677:117;2827:4;2819:6;2815:17;2803:29;;2881:3;2873:4;2865:6;2861:17;2851:8;2847:32;2844:41;2841:128;;;2888:79;;:::i;:::-;2841:128;2422:553;;;;;:::o;2981:139::-;3027:5;3065:6;3052:20;3043:29;;3081:33;3108:5;3081:33;:::i;:::-;2981:139;;;;:::o;3126:329::-;3185:6;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3126:329;;;;:::o;3461:474::-;3529:6;3537;3586:2;3574:9;3565:7;3561:23;3557:32;3554:119;;;3592:79;;:::i;:::-;3554:119;3712:1;3737:53;3782:7;3773:6;3762:9;3758:22;3737:53;:::i;:::-;3727:63;;3683:117;3839:2;3865:53;3910:7;3901:6;3890:9;3886:22;3865:53;:::i;:::-;3855:63;;3810:118;3461:474;;;;;:::o;3941:619::-;4018:6;4026;4034;4083:2;4071:9;4062:7;4058:23;4054:32;4051:119;;;4089:79;;:::i;:::-;4051:119;4209:1;4234:53;4279:7;4270:6;4259:9;4255:22;4234:53;:::i;:::-;4224:63;;4180:117;4336:2;4362:53;4407:7;4398:6;4387:9;4383:22;4362:53;:::i;:::-;4352:63;;4307:118;4464:2;4490:53;4535:7;4526:6;4515:9;4511:22;4490:53;:::i;:::-;4480:63;;4435:118;3941:619;;;;;:::o;4566:943::-;4661:6;4669;4677;4685;4734:3;4722:9;4713:7;4709:23;4705:33;4702:120;;;4741:79;;:::i;:::-;4702:120;4861:1;4886:53;4931:7;4922:6;4911:9;4907:22;4886:53;:::i;:::-;4876:63;;4832:117;4988:2;5014:53;5059:7;5050:6;5039:9;5035:22;5014:53;:::i;:::-;5004:63;;4959:118;5116:2;5142:53;5187:7;5178:6;5167:9;5163:22;5142:53;:::i;:::-;5132:63;;5087:118;5272:2;5261:9;5257:18;5244:32;5303:18;5295:6;5292:30;5289:117;;;5325:79;;:::i;:::-;5289:117;5430:62;5484:7;5475:6;5464:9;5460:22;5430:62;:::i;:::-;5420:72;;5215:287;4566:943;;;;;;;:::o;5515:468::-;5580:6;5588;5637:2;5625:9;5616:7;5612:23;5608:32;5605:119;;;5643:79;;:::i;:::-;5605:119;5763:1;5788:53;5833:7;5824:6;5813:9;5809:22;5788:53;:::i;:::-;5778:63;;5734:117;5890:2;5916:50;5958:7;5949:6;5938:9;5934:22;5916:50;:::i;:::-;5906:60;;5861:115;5515:468;;;;;:::o;5989:474::-;6057:6;6065;6114:2;6102:9;6093:7;6089:23;6085:32;6082:119;;;6120:79;;:::i;:::-;6082:119;6240:1;6265:53;6310:7;6301:6;6290:9;6286:22;6265:53;:::i;:::-;6255:63;;6211:117;6367:2;6393:53;6438:7;6429:6;6418:9;6414:22;6393:53;:::i;:::-;6383:63;;6338:118;5989:474;;;;;:::o;6469:619::-;6546:6;6554;6562;6611:2;6599:9;6590:7;6586:23;6582:32;6579:119;;;6617:79;;:::i;:::-;6579:119;6737:1;6762:53;6807:7;6798:6;6787:9;6783:22;6762:53;:::i;:::-;6752:63;;6708:117;6864:2;6890:53;6935:7;6926:6;6915:9;6911:22;6890:53;:::i;:::-;6880:63;;6835:118;6992:2;7018:53;7063:7;7054:6;7043:9;7039:22;7018:53;:::i;:::-;7008:63;;6963:118;6469:619;;;;;:::o;7094:704::-;7189:6;7197;7205;7254:2;7242:9;7233:7;7229:23;7225:32;7222:119;;;7260:79;;:::i;:::-;7222:119;7408:1;7397:9;7393:17;7380:31;7438:18;7430:6;7427:30;7424:117;;;7460:79;;:::i;:::-;7424:117;7573:80;7645:7;7636:6;7625:9;7621:22;7573:80;:::i;:::-;7555:98;;;;7351:312;7702:2;7728:53;7773:7;7764:6;7753:9;7749:22;7728:53;:::i;:::-;7718:63;;7673:118;7094:704;;;;;:::o;7804:345::-;7871:6;7920:2;7908:9;7899:7;7895:23;7891:32;7888:119;;;7926:79;;:::i;:::-;7888:119;8046:1;8071:61;8124:7;8115:6;8104:9;8100:22;8071:61;:::i;:::-;8061:71;;8017:125;7804:345;;;;:::o;8155:329::-;8214:6;8263:2;8251:9;8242:7;8238:23;8234:32;8231:119;;;8269:79;;:::i;:::-;8231:119;8389:1;8414:53;8459:7;8450:6;8439:9;8435:22;8414:53;:::i;:::-;8404:63;;8360:117;8155:329;;;;:::o;8490:327::-;8548:6;8597:2;8585:9;8576:7;8572:23;8568:32;8565:119;;;8603:79;;:::i;:::-;8565:119;8723:1;8748:52;8792:7;8783:6;8772:9;8768:22;8748:52;:::i;:::-;8738:62;;8694:116;8490:327;;;;:::o;8823:349::-;8892:6;8941:2;8929:9;8920:7;8916:23;8912:32;8909:119;;;8947:79;;:::i;:::-;8909:119;9067:1;9092:63;9147:7;9138:6;9127:9;9123:22;9092:63;:::i;:::-;9082:73;;9038:127;8823:349;;;;:::o;9178:649::-;9270:6;9278;9286;9335:2;9323:9;9314:7;9310:23;9306:32;9303:119;;;9341:79;;:::i;:::-;9303:119;9461:1;9486:68;9546:7;9537:6;9526:9;9522:22;9486:68;:::i;:::-;9476:78;;9432:132;9603:2;9629:53;9674:7;9665:6;9654:9;9650:22;9629:53;:::i;:::-;9619:63;;9574:118;9731:2;9757:53;9802:7;9793:6;9782:9;9778:22;9757:53;:::i;:::-;9747:63;;9702:118;9178:649;;;;;:::o;9833:529::-;9904:6;9912;9961:2;9949:9;9940:7;9936:23;9932:32;9929:119;;;9967:79;;:::i;:::-;9929:119;10115:1;10104:9;10100:17;10087:31;10145:18;10137:6;10134:30;10131:117;;;10167:79;;:::i;:::-;10131:117;10280:65;10337:7;10328:6;10317:9;10313:22;10280:65;:::i;:::-;10262:83;;;;10058:297;9833:529;;;;;:::o;10368:329::-;10427:6;10476:2;10464:9;10455:7;10451:23;10447:32;10444:119;;;10482:79;;:::i;:::-;10444:119;10602:1;10627:53;10672:7;10663:6;10652:9;10648:22;10627:53;:::i;:::-;10617:63;;10573:117;10368:329;;;;:::o;10703:279::-;10822:10;10843:96;10935:3;10927:6;10843:96;:::i;:::-;10971:4;10966:3;10962:14;10948:28;;10703:279;;;;:::o;10988:142::-;11091:32;11117:5;11091:32;:::i;:::-;11086:3;11079:45;10988:142;;:::o;11136:118::-;11223:24;11241:5;11223:24;:::i;:::-;11218:3;11211:37;11136:118;;:::o;11260:157::-;11365:45;11385:24;11403:5;11385:24;:::i;:::-;11365:45;:::i;:::-;11360:3;11353:58;11260:157;;:::o;11485:932::-;11654:3;11683:79;11756:5;11683:79;:::i;:::-;11778:111;11882:6;11877:3;11778:111;:::i;:::-;11771:118;;11913:81;11988:5;11913:81;:::i;:::-;12017:7;12048:1;12033:359;12058:6;12055:1;12052:13;12033:359;;;12134:6;12128:13;12161:113;12270:3;12255:13;12161:113;:::i;:::-;12154:120;;12297:85;12375:6;12297:85;:::i;:::-;12287:95;;12093:299;12080:1;12077;12073:9;12068:14;;12033:359;;;12037:14;12408:3;12401:10;;11659:758;;;11485:932;;;;:::o;12423:109::-;12504:21;12519:5;12504:21;:::i;:::-;12499:3;12492:34;12423:109;;:::o;12538:118::-;12625:24;12643:5;12625:24;:::i;:::-;12620:3;12613:37;12538:118;;:::o;12662:157::-;12767:45;12787:24;12805:5;12787:24;:::i;:::-;12767:45;:::i;:::-;12762:3;12755:58;12662:157;;:::o;12825:360::-;12911:3;12939:38;12971:5;12939:38;:::i;:::-;12993:70;13056:6;13051:3;12993:70;:::i;:::-;12986:77;;13072:52;13117:6;13112:3;13105:4;13098:5;13094:16;13072:52;:::i;:::-;13149:29;13171:6;13149:29;:::i;:::-;13144:3;13140:39;13133:46;;12915:270;12825:360;;;;:::o;13191:373::-;13295:3;13323:38;13355:5;13323:38;:::i;:::-;13377:88;13458:6;13453:3;13377:88;:::i;:::-;13370:95;;13474:52;13519:6;13514:3;13507:4;13500:5;13496:16;13474:52;:::i;:::-;13551:6;13546:3;13542:16;13535:23;;13299:265;13191:373;;;;:::o;13570:364::-;13658:3;13686:39;13719:5;13686:39;:::i;:::-;13741:71;13805:6;13800:3;13741:71;:::i;:::-;13734:78;;13821:52;13866:6;13861:3;13854:4;13847:5;13843:16;13821:52;:::i;:::-;13898:29;13920:6;13898:29;:::i;:::-;13893:3;13889:39;13882:46;;13662:272;13570:364;;;;:::o;13940:377::-;14046:3;14074:39;14107:5;14074:39;:::i;:::-;14129:89;14211:6;14206:3;14129:89;:::i;:::-;14122:96;;14227:52;14272:6;14267:3;14260:4;14253:5;14249:16;14227:52;:::i;:::-;14304:6;14299:3;14295:16;14288:23;;14050:267;13940:377;;;;:::o;14323:366::-;14465:3;14486:67;14550:2;14545:3;14486:67;:::i;:::-;14479:74;;14562:93;14651:3;14562:93;:::i;:::-;14680:2;14675:3;14671:12;14664:19;;14323:366;;;:::o;14695:::-;14837:3;14858:67;14922:2;14917:3;14858:67;:::i;:::-;14851:74;;14934:93;15023:3;14934:93;:::i;:::-;15052:2;15047:3;15043:12;15036:19;;14695:366;;;:::o;15067:::-;15209:3;15230:67;15294:2;15289:3;15230:67;:::i;:::-;15223:74;;15306:93;15395:3;15306:93;:::i;:::-;15424:2;15419:3;15415:12;15408:19;;15067:366;;;:::o;15439:::-;15581:3;15602:67;15666:2;15661:3;15602:67;:::i;:::-;15595:74;;15678:93;15767:3;15678:93;:::i;:::-;15796:2;15791:3;15787:12;15780:19;;15439:366;;;:::o;15811:::-;15953:3;15974:67;16038:2;16033:3;15974:67;:::i;:::-;15967:74;;16050:93;16139:3;16050:93;:::i;:::-;16168:2;16163:3;16159:12;16152:19;;15811:366;;;:::o;16183:::-;16325:3;16346:67;16410:2;16405:3;16346:67;:::i;:::-;16339:74;;16422:93;16511:3;16422:93;:::i;:::-;16540:2;16535:3;16531:12;16524:19;;16183:366;;;:::o;16555:::-;16697:3;16718:67;16782:2;16777:3;16718:67;:::i;:::-;16711:74;;16794:93;16883:3;16794:93;:::i;:::-;16912:2;16907:3;16903:12;16896:19;;16555:366;;;:::o;16927:::-;17069:3;17090:67;17154:2;17149:3;17090:67;:::i;:::-;17083:74;;17166:93;17255:3;17166:93;:::i;:::-;17284:2;17279:3;17275:12;17268:19;;16927:366;;;:::o;17299:::-;17441:3;17462:67;17526:2;17521:3;17462:67;:::i;:::-;17455:74;;17538:93;17627:3;17538:93;:::i;:::-;17656:2;17651:3;17647:12;17640:19;;17299:366;;;:::o;17671:::-;17813:3;17834:67;17898:2;17893:3;17834:67;:::i;:::-;17827:74;;17910:93;17999:3;17910:93;:::i;:::-;18028:2;18023:3;18019:12;18012:19;;17671:366;;;:::o;18043:::-;18185:3;18206:67;18270:2;18265:3;18206:67;:::i;:::-;18199:74;;18282:93;18371:3;18282:93;:::i;:::-;18400:2;18395:3;18391:12;18384:19;;18043:366;;;:::o;18415:::-;18557:3;18578:67;18642:2;18637:3;18578:67;:::i;:::-;18571:74;;18654:93;18743:3;18654:93;:::i;:::-;18772:2;18767:3;18763:12;18756:19;;18415:366;;;:::o;18787:::-;18929:3;18950:67;19014:2;19009:3;18950:67;:::i;:::-;18943:74;;19026:93;19115:3;19026:93;:::i;:::-;19144:2;19139:3;19135:12;19128:19;;18787:366;;;:::o;19159:::-;19301:3;19322:67;19386:2;19381:3;19322:67;:::i;:::-;19315:74;;19398:93;19487:3;19398:93;:::i;:::-;19516:2;19511:3;19507:12;19500:19;;19159:366;;;:::o;19531:::-;19673:3;19694:67;19758:2;19753:3;19694:67;:::i;:::-;19687:74;;19770:93;19859:3;19770:93;:::i;:::-;19888:2;19883:3;19879:12;19872:19;;19531:366;;;:::o;19903:::-;20045:3;20066:67;20130:2;20125:3;20066:67;:::i;:::-;20059:74;;20142:93;20231:3;20142:93;:::i;:::-;20260:2;20255:3;20251:12;20244:19;;19903:366;;;:::o;20275:::-;20417:3;20438:67;20502:2;20497:3;20438:67;:::i;:::-;20431:74;;20514:93;20603:3;20514:93;:::i;:::-;20632:2;20627:3;20623:12;20616:19;;20275:366;;;:::o;20647:::-;20789:3;20810:67;20874:2;20869:3;20810:67;:::i;:::-;20803:74;;20886:93;20975:3;20886:93;:::i;:::-;21004:2;20999:3;20995:12;20988:19;;20647:366;;;:::o;21019:::-;21161:3;21182:67;21246:2;21241:3;21182:67;:::i;:::-;21175:74;;21258:93;21347:3;21258:93;:::i;:::-;21376:2;21371:3;21367:12;21360:19;;21019:366;;;:::o;21391:::-;21533:3;21554:67;21618:2;21613:3;21554:67;:::i;:::-;21547:74;;21630:93;21719:3;21630:93;:::i;:::-;21748:2;21743:3;21739:12;21732:19;;21391:366;;;:::o;21763:::-;21905:3;21926:67;21990:2;21985:3;21926:67;:::i;:::-;21919:74;;22002:93;22091:3;22002:93;:::i;:::-;22120:2;22115:3;22111:12;22104:19;;21763:366;;;:::o;22135:400::-;22295:3;22316:84;22398:1;22393:3;22316:84;:::i;:::-;22309:91;;22409:93;22498:3;22409:93;:::i;:::-;22527:1;22522:3;22518:11;22511:18;;22135:400;;;:::o;22541:366::-;22683:3;22704:67;22768:2;22763:3;22704:67;:::i;:::-;22697:74;;22780:93;22869:3;22780:93;:::i;:::-;22898:2;22893:3;22889:12;22882:19;;22541:366;;;:::o;22913:::-;23055:3;23076:67;23140:2;23135:3;23076:67;:::i;:::-;23069:74;;23152:93;23241:3;23152:93;:::i;:::-;23270:2;23265:3;23261:12;23254:19;;22913:366;;;:::o;23285:::-;23427:3;23448:67;23512:2;23507:3;23448:67;:::i;:::-;23441:74;;23524:93;23613:3;23524:93;:::i;:::-;23642:2;23637:3;23633:12;23626:19;;23285:366;;;:::o;23657:::-;23799:3;23820:67;23884:2;23879:3;23820:67;:::i;:::-;23813:74;;23896:93;23985:3;23896:93;:::i;:::-;24014:2;24009:3;24005:12;23998:19;;23657:366;;;:::o;24029:::-;24171:3;24192:67;24256:2;24251:3;24192:67;:::i;:::-;24185:74;;24268:93;24357:3;24268:93;:::i;:::-;24386:2;24381:3;24377:12;24370:19;;24029:366;;;:::o;24401:398::-;24560:3;24581:83;24662:1;24657:3;24581:83;:::i;:::-;24574:90;;24673:93;24762:3;24673:93;:::i;:::-;24791:1;24786:3;24782:11;24775:18;;24401:398;;;:::o;24805:366::-;24947:3;24968:67;25032:2;25027:3;24968:67;:::i;:::-;24961:74;;25044:93;25133:3;25044:93;:::i;:::-;25162:2;25157:3;25153:12;25146:19;;24805:366;;;:::o;25177:::-;25319:3;25340:67;25404:2;25399:3;25340:67;:::i;:::-;25333:74;;25416:93;25505:3;25416:93;:::i;:::-;25534:2;25529:3;25525:12;25518:19;;25177:366;;;:::o;25549:::-;25691:3;25712:67;25776:2;25771:3;25712:67;:::i;:::-;25705:74;;25788:93;25877:3;25788:93;:::i;:::-;25906:2;25901:3;25897:12;25890:19;;25549:366;;;:::o;25921:::-;26063:3;26084:67;26148:2;26143:3;26084:67;:::i;:::-;26077:74;;26160:93;26249:3;26160:93;:::i;:::-;26278:2;26273:3;26269:12;26262:19;;25921:366;;;:::o;26293:::-;26435:3;26456:67;26520:2;26515:3;26456:67;:::i;:::-;26449:74;;26532:93;26621:3;26532:93;:::i;:::-;26650:2;26645:3;26641:12;26634:19;;26293:366;;;:::o;26665:400::-;26825:3;26846:84;26928:1;26923:3;26846:84;:::i;:::-;26839:91;;26939:93;27028:3;26939:93;:::i;:::-;27057:1;27052:3;27048:11;27041:18;;26665:400;;;:::o;27129:326::-;27266:4;27261:3;27257:14;27356:4;27349:5;27345:16;27339:23;27375:63;27432:4;27427:3;27423:14;27409:12;27375:63;:::i;:::-;27281:167;27235:220;27129:326;;:::o;27461:108::-;27538:24;27556:5;27538:24;:::i;:::-;27533:3;27526:37;27461:108;;:::o;27575:118::-;27662:24;27680:5;27662:24;:::i;:::-;27657:3;27650:37;27575:118;;:::o;27699:256::-;27811:3;27826:75;27897:3;27888:6;27826:75;:::i;:::-;27926:2;27921:3;27917:12;27910:19;;27946:3;27939:10;;27699:256;;;;:::o;27961:397::-;28101:3;28116:75;28187:3;28178:6;28116:75;:::i;:::-;28216:2;28211:3;28207:12;28200:19;;28229:75;28300:3;28291:6;28229:75;:::i;:::-;28329:2;28324:3;28320:12;28313:19;;28349:3;28342:10;;27961:397;;;;;:::o;28364:271::-;28494:3;28516:93;28605:3;28596:6;28516:93;:::i;:::-;28509:100;;28626:3;28619:10;;28364:271;;;;:::o;28641:967::-;29023:3;29045:95;29136:3;29127:6;29045:95;:::i;:::-;29038:102;;29157:148;29301:3;29157:148;:::i;:::-;29150:155;;29322:95;29413:3;29404:6;29322:95;:::i;:::-;29315:102;;29434:148;29578:3;29434:148;:::i;:::-;29427:155;;29599:3;29592:10;;28641:967;;;;;:::o;29614:379::-;29798:3;29820:147;29963:3;29820:147;:::i;:::-;29813:154;;29984:3;29977:10;;29614:379;;;:::o;29999:222::-;30092:4;30130:2;30119:9;30115:18;30107:26;;30143:71;30211:1;30200:9;30196:17;30187:6;30143:71;:::i;:::-;29999:222;;;;:::o;30227:254::-;30336:4;30374:2;30363:9;30359:18;30351:26;;30387:87;30471:1;30460:9;30456:17;30447:6;30387:87;:::i;:::-;30227:254;;;;:::o;30487:640::-;30682:4;30720:3;30709:9;30705:19;30697:27;;30734:71;30802:1;30791:9;30787:17;30778:6;30734:71;:::i;:::-;30815:72;30883:2;30872:9;30868:18;30859:6;30815:72;:::i;:::-;30897;30965:2;30954:9;30950:18;30941:6;30897:72;:::i;:::-;31016:9;31010:4;31006:20;31001:2;30990:9;30986:18;30979:48;31044:76;31115:4;31106:6;31044:76;:::i;:::-;31036:84;;30487:640;;;;;;;:::o;31133:332::-;31254:4;31292:2;31281:9;31277:18;31269:26;;31305:71;31373:1;31362:9;31358:17;31349:6;31305:71;:::i;:::-;31386:72;31454:2;31443:9;31439:18;31430:6;31386:72;:::i;:::-;31133:332;;;;;:::o;31471:473::-;31664:4;31702:2;31691:9;31687:18;31679:26;;31751:9;31745:4;31741:20;31737:1;31726:9;31722:17;31715:47;31779:158;31932:4;31923:6;31779:158;:::i;:::-;31771:166;;31471:473;;;;:::o;31950:210::-;32037:4;32075:2;32064:9;32060:18;32052:26;;32088:65;32150:1;32139:9;32135:17;32126:6;32088:65;:::i;:::-;31950:210;;;;:::o;32166:222::-;32259:4;32297:2;32286:9;32282:18;32274:26;;32310:71;32378:1;32367:9;32363:17;32354:6;32310:71;:::i;:::-;32166:222;;;;:::o;32394:313::-;32507:4;32545:2;32534:9;32530:18;32522:26;;32594:9;32588:4;32584:20;32580:1;32569:9;32565:17;32558:47;32622:78;32695:4;32686:6;32622:78;:::i;:::-;32614:86;;32394:313;;;;:::o;32713:419::-;32879:4;32917:2;32906:9;32902:18;32894:26;;32966:9;32960:4;32956:20;32952:1;32941:9;32937:17;32930:47;32994:131;33120:4;32994:131;:::i;:::-;32986:139;;32713:419;;;:::o;33138:::-;33304:4;33342:2;33331:9;33327:18;33319:26;;33391:9;33385:4;33381:20;33377:1;33366:9;33362:17;33355:47;33419:131;33545:4;33419:131;:::i;:::-;33411:139;;33138:419;;;:::o;33563:::-;33729:4;33767:2;33756:9;33752:18;33744:26;;33816:9;33810:4;33806:20;33802:1;33791:9;33787:17;33780:47;33844:131;33970:4;33844:131;:::i;:::-;33836:139;;33563:419;;;:::o;33988:::-;34154:4;34192:2;34181:9;34177:18;34169:26;;34241:9;34235:4;34231:20;34227:1;34216:9;34212:17;34205:47;34269:131;34395:4;34269:131;:::i;:::-;34261:139;;33988:419;;;:::o;34413:::-;34579:4;34617:2;34606:9;34602:18;34594:26;;34666:9;34660:4;34656:20;34652:1;34641:9;34637:17;34630:47;34694:131;34820:4;34694:131;:::i;:::-;34686:139;;34413:419;;;:::o;34838:::-;35004:4;35042:2;35031:9;35027:18;35019:26;;35091:9;35085:4;35081:20;35077:1;35066:9;35062:17;35055:47;35119:131;35245:4;35119:131;:::i;:::-;35111:139;;34838:419;;;:::o;35263:::-;35429:4;35467:2;35456:9;35452:18;35444:26;;35516:9;35510:4;35506:20;35502:1;35491:9;35487:17;35480:47;35544:131;35670:4;35544:131;:::i;:::-;35536:139;;35263:419;;;:::o;35688:::-;35854:4;35892:2;35881:9;35877:18;35869:26;;35941:9;35935:4;35931:20;35927:1;35916:9;35912:17;35905:47;35969:131;36095:4;35969:131;:::i;:::-;35961:139;;35688:419;;;:::o;36113:::-;36279:4;36317:2;36306:9;36302:18;36294:26;;36366:9;36360:4;36356:20;36352:1;36341:9;36337:17;36330:47;36394:131;36520:4;36394:131;:::i;:::-;36386:139;;36113:419;;;:::o;36538:::-;36704:4;36742:2;36731:9;36727:18;36719:26;;36791:9;36785:4;36781:20;36777:1;36766:9;36762:17;36755:47;36819:131;36945:4;36819:131;:::i;:::-;36811:139;;36538:419;;;:::o;36963:::-;37129:4;37167:2;37156:9;37152:18;37144:26;;37216:9;37210:4;37206:20;37202:1;37191:9;37187:17;37180:47;37244:131;37370:4;37244:131;:::i;:::-;37236:139;;36963:419;;;:::o;37388:::-;37554:4;37592:2;37581:9;37577:18;37569:26;;37641:9;37635:4;37631:20;37627:1;37616:9;37612:17;37605:47;37669:131;37795:4;37669:131;:::i;:::-;37661:139;;37388:419;;;:::o;37813:::-;37979:4;38017:2;38006:9;38002:18;37994:26;;38066:9;38060:4;38056:20;38052:1;38041:9;38037:17;38030:47;38094:131;38220:4;38094:131;:::i;:::-;38086:139;;37813:419;;;:::o;38238:::-;38404:4;38442:2;38431:9;38427:18;38419:26;;38491:9;38485:4;38481:20;38477:1;38466:9;38462:17;38455:47;38519:131;38645:4;38519:131;:::i;:::-;38511:139;;38238:419;;;:::o;38663:::-;38829:4;38867:2;38856:9;38852:18;38844:26;;38916:9;38910:4;38906:20;38902:1;38891:9;38887:17;38880:47;38944:131;39070:4;38944:131;:::i;:::-;38936:139;;38663:419;;;:::o;39088:::-;39254:4;39292:2;39281:9;39277:18;39269:26;;39341:9;39335:4;39331:20;39327:1;39316:9;39312:17;39305:47;39369:131;39495:4;39369:131;:::i;:::-;39361:139;;39088:419;;;:::o;39513:::-;39679:4;39717:2;39706:9;39702:18;39694:26;;39766:9;39760:4;39756:20;39752:1;39741:9;39737:17;39730:47;39794:131;39920:4;39794:131;:::i;:::-;39786:139;;39513:419;;;:::o;39938:::-;40104:4;40142:2;40131:9;40127:18;40119:26;;40191:9;40185:4;40181:20;40177:1;40166:9;40162:17;40155:47;40219:131;40345:4;40219:131;:::i;:::-;40211:139;;39938:419;;;:::o;40363:::-;40529:4;40567:2;40556:9;40552:18;40544:26;;40616:9;40610:4;40606:20;40602:1;40591:9;40587:17;40580:47;40644:131;40770:4;40644:131;:::i;:::-;40636:139;;40363:419;;;:::o;40788:::-;40954:4;40992:2;40981:9;40977:18;40969:26;;41041:9;41035:4;41031:20;41027:1;41016:9;41012:17;41005:47;41069:131;41195:4;41069:131;:::i;:::-;41061:139;;40788:419;;;:::o;41213:::-;41379:4;41417:2;41406:9;41402:18;41394:26;;41466:9;41460:4;41456:20;41452:1;41441:9;41437:17;41430:47;41494:131;41620:4;41494:131;:::i;:::-;41486:139;;41213:419;;;:::o;41638:::-;41804:4;41842:2;41831:9;41827:18;41819:26;;41891:9;41885:4;41881:20;41877:1;41866:9;41862:17;41855:47;41919:131;42045:4;41919:131;:::i;:::-;41911:139;;41638:419;;;:::o;42063:::-;42229:4;42267:2;42256:9;42252:18;42244:26;;42316:9;42310:4;42306:20;42302:1;42291:9;42287:17;42280:47;42344:131;42470:4;42344:131;:::i;:::-;42336:139;;42063:419;;;:::o;42488:::-;42654:4;42692:2;42681:9;42677:18;42669:26;;42741:9;42735:4;42731:20;42727:1;42716:9;42712:17;42705:47;42769:131;42895:4;42769:131;:::i;:::-;42761:139;;42488:419;;;:::o;42913:::-;43079:4;43117:2;43106:9;43102:18;43094:26;;43166:9;43160:4;43156:20;43152:1;43141:9;43137:17;43130:47;43194:131;43320:4;43194:131;:::i;:::-;43186:139;;42913:419;;;:::o;43338:::-;43504:4;43542:2;43531:9;43527:18;43519:26;;43591:9;43585:4;43581:20;43577:1;43566:9;43562:17;43555:47;43619:131;43745:4;43619:131;:::i;:::-;43611:139;;43338:419;;;:::o;43763:::-;43929:4;43967:2;43956:9;43952:18;43944:26;;44016:9;44010:4;44006:20;44002:1;43991:9;43987:17;43980:47;44044:131;44170:4;44044:131;:::i;:::-;44036:139;;43763:419;;;:::o;44188:::-;44354:4;44392:2;44381:9;44377:18;44369:26;;44441:9;44435:4;44431:20;44427:1;44416:9;44412:17;44405:47;44469:131;44595:4;44469:131;:::i;:::-;44461:139;;44188:419;;;:::o;44613:::-;44779:4;44817:2;44806:9;44802:18;44794:26;;44866:9;44860:4;44856:20;44852:1;44841:9;44837:17;44830:47;44894:131;45020:4;44894:131;:::i;:::-;44886:139;;44613:419;;;:::o;45038:::-;45204:4;45242:2;45231:9;45227:18;45219:26;;45291:9;45285:4;45281:20;45277:1;45266:9;45262:17;45255:47;45319:131;45445:4;45319:131;:::i;:::-;45311:139;;45038:419;;;:::o;45463:::-;45629:4;45667:2;45656:9;45652:18;45644:26;;45716:9;45710:4;45706:20;45702:1;45691:9;45687:17;45680:47;45744:131;45870:4;45744:131;:::i;:::-;45736:139;;45463:419;;;:::o;45888:222::-;45981:4;46019:2;46008:9;46004:18;45996:26;;46032:71;46100:1;46089:9;46085:17;46076:6;46032:71;:::i;:::-;45888:222;;;;:::o;46116:129::-;46150:6;46177:20;;:::i;:::-;46167:30;;46206:33;46234:4;46226:6;46206:33;:::i;:::-;46116:129;;;:::o;46251:75::-;46284:6;46317:2;46311:9;46301:19;;46251:75;:::o;46332:307::-;46393:4;46483:18;46475:6;46472:30;46469:56;;;46505:18;;:::i;:::-;46469:56;46543:29;46565:6;46543:29;:::i;:::-;46535:37;;46627:4;46621;46617:15;46609:23;;46332:307;;;:::o;46645:157::-;46737:4;46760:3;46752:11;;46790:4;46785:3;46781:14;46773:22;;46645:157;;;:::o;46808:139::-;46900:6;46934:5;46928:12;46918:22;;46808:139;;;:::o;46953:98::-;47004:6;47038:5;47032:12;47022:22;;46953:98;;;:::o;47057:99::-;47109:6;47143:5;47137:12;47127:22;;47057:99;;;:::o;47162:138::-;47257:4;47289;47284:3;47280:14;47272:22;;47162:138;;;:::o;47306:209::-;47430:11;47464:6;47459:3;47452:19;47504:4;47499:3;47495:14;47480:29;;47306:209;;;;:::o;47521:168::-;47604:11;47638:6;47633:3;47626:19;47678:4;47673:3;47669:14;47654:29;;47521:168;;;;:::o;47695:147::-;47796:11;47833:3;47818:18;;47695:147;;;;:::o;47848:169::-;47932:11;47966:6;47961:3;47954:19;48006:4;48001:3;47997:14;47982:29;;47848:169;;;;:::o;48023:148::-;48125:11;48162:3;48147:18;;48023:148;;;;:::o;48177:305::-;48217:3;48236:20;48254:1;48236:20;:::i;:::-;48231:25;;48270:20;48288:1;48270:20;:::i;:::-;48265:25;;48424:1;48356:66;48352:74;48349:1;48346:81;48343:107;;;48430:18;;:::i;:::-;48343:107;48474:1;48471;48467:9;48460:16;;48177:305;;;;:::o;48488:185::-;48528:1;48545:20;48563:1;48545:20;:::i;:::-;48540:25;;48579:20;48597:1;48579:20;:::i;:::-;48574:25;;48618:1;48608:35;;48623:18;;:::i;:::-;48608:35;48665:1;48662;48658:9;48653:14;;48488:185;;;;:::o;48679:348::-;48719:7;48742:20;48760:1;48742:20;:::i;:::-;48737:25;;48776:20;48794:1;48776:20;:::i;:::-;48771:25;;48964:1;48896:66;48892:74;48889:1;48886:81;48881:1;48874:9;48867:17;48863:105;48860:131;;;48971:18;;:::i;:::-;48860:131;49019:1;49016;49012:9;49001:20;;48679:348;;;;:::o;49033:191::-;49073:4;49093:20;49111:1;49093:20;:::i;:::-;49088:25;;49127:20;49145:1;49127:20;:::i;:::-;49122:25;;49166:1;49163;49160:8;49157:34;;;49171:18;;:::i;:::-;49157:34;49216:1;49213;49209:9;49201:17;;49033:191;;;;:::o;49230:96::-;49267:7;49296:24;49314:5;49296:24;:::i;:::-;49285:35;;49230:96;;;:::o;49332:104::-;49377:7;49406:24;49424:5;49406:24;:::i;:::-;49395:35;;49332:104;;;:::o;49442:90::-;49476:7;49519:5;49512:13;49505:21;49494:32;;49442:90;;;:::o;49538:77::-;49575:7;49604:5;49593:16;;49538:77;;;:::o;49621:149::-;49657:7;49697:66;49690:5;49686:78;49675:89;;49621:149;;;:::o;49776:111::-;49828:7;49857:24;49875:5;49857:24;:::i;:::-;49846:35;;49776:111;;;:::o;49893:126::-;49930:7;49970:42;49963:5;49959:54;49948:65;;49893:126;;;:::o;50025:77::-;50062:7;50091:5;50080:16;;50025:77;;;:::o;50108:154::-;50192:6;50187:3;50182;50169:30;50254:1;50245:6;50240:3;50236:16;50229:27;50108:154;;;:::o;50268:307::-;50336:1;50346:113;50360:6;50357:1;50354:13;50346:113;;;50445:1;50440:3;50436:11;50430:18;50426:1;50421:3;50417:11;50410:39;50382:2;50379:1;50375:10;50370:15;;50346:113;;;50477:6;50474:1;50471:13;50468:101;;;50557:1;50548:6;50543:3;50539:16;50532:27;50468:101;50317:258;50268:307;;;:::o;50581:320::-;50625:6;50662:1;50656:4;50652:12;50642:22;;50709:1;50703:4;50699:12;50730:18;50720:81;;50786:4;50778:6;50774:17;50764:27;;50720:81;50848:2;50840:6;50837:14;50817:18;50814:38;50811:84;;;50867:18;;:::i;:::-;50811:84;50632:269;50581:320;;;:::o;50907:281::-;50990:27;51012:4;50990:27;:::i;:::-;50982:6;50978:40;51120:6;51108:10;51105:22;51084:18;51072:10;51069:34;51066:62;51063:88;;;51131:18;;:::i;:::-;51063:88;51171:10;51167:2;51160:22;50950:238;50907:281;;:::o;51194:233::-;51233:3;51256:24;51274:5;51256:24;:::i;:::-;51247:33;;51302:66;51295:5;51292:77;51289:103;;;51372:18;;:::i;:::-;51289:103;51419:1;51412:5;51408:13;51401:20;;51194:233;;;:::o;51433:100::-;51472:7;51501:26;51521:5;51501:26;:::i;:::-;51490:37;;51433:100;;;:::o;51539:79::-;51578:7;51607:5;51596:16;;51539:79;;;:::o;51624:94::-;51663:7;51692:20;51706:5;51692:20;:::i;:::-;51681:31;;51624:94;;;:::o;51724:176::-;51756:1;51773:20;51791:1;51773:20;:::i;:::-;51768:25;;51807:20;51825:1;51807:20;:::i;:::-;51802:25;;51846:1;51836:35;;51851:18;;:::i;:::-;51836:35;51892:1;51889;51885:9;51880:14;;51724:176;;;;:::o;51906:180::-;51954:77;51951:1;51944:88;52051:4;52048:1;52041:15;52075:4;52072:1;52065:15;52092:180;52140:77;52137:1;52130:88;52237:4;52234:1;52227:15;52261:4;52258:1;52251:15;52278:180;52326:77;52323:1;52316:88;52423:4;52420:1;52413:15;52447:4;52444:1;52437:15;52464:180;52512:77;52509:1;52502:88;52609:4;52606:1;52599:15;52633:4;52630:1;52623:15;52650:180;52698:77;52695:1;52688:88;52795:4;52792:1;52785:15;52819:4;52816:1;52809:15;52836:180;52884:77;52881:1;52874:88;52981:4;52978:1;52971:15;53005:4;53002:1;52995:15;53022:117;53131:1;53128;53121:12;53145:117;53254:1;53251;53244:12;53268:117;53377:1;53374;53367:12;53391:117;53500:1;53497;53490:12;53514:117;53623:1;53620;53613:12;53637:117;53746:1;53743;53736:12;53760:102;53801:6;53852:2;53848:7;53843:2;53836:5;53832:14;53828:28;53818:38;;53760:102;;;:::o;53868:94::-;53901:8;53949:5;53945:2;53941:14;53920:35;;53868:94;;;:::o;53968:177::-;54108:29;54104:1;54096:6;54092:14;54085:53;53968:177;:::o;54151:165::-;54291:17;54287:1;54279:6;54275:14;54268:41;54151:165;:::o;54322:221::-;54462:34;54458:1;54450:6;54446:14;54439:58;54531:4;54526:2;54518:6;54514:15;54507:29;54322:221;:::o;54549:230::-;54689:34;54685:1;54677:6;54673:14;54666:58;54758:13;54753:2;54745:6;54741:15;54734:38;54549:230;:::o;54785:237::-;54925:34;54921:1;54913:6;54909:14;54902:58;54994:20;54989:2;54981:6;54977:15;54970:45;54785:237;:::o;55028:225::-;55168:34;55164:1;55156:6;55152:14;55145:58;55237:8;55232:2;55224:6;55220:15;55213:33;55028:225;:::o;55259:178::-;55399:30;55395:1;55387:6;55383:14;55376:54;55259:178;:::o;55443:171::-;55583:23;55579:1;55571:6;55567:14;55560:47;55443:171;:::o;55620:223::-;55760:34;55756:1;55748:6;55744:14;55737:58;55829:6;55824:2;55816:6;55812:15;55805:31;55620:223;:::o;55849:175::-;55989:27;55985:1;55977:6;55973:14;55966:51;55849:175;:::o;56030:162::-;56170:14;56166:1;56158:6;56154:14;56147:38;56030:162;:::o;56198:225::-;56338:34;56334:1;56326:6;56322:14;56315:58;56407:8;56402:2;56394:6;56390:15;56383:33;56198:225;:::o;56429:231::-;56569:34;56565:1;56557:6;56553:14;56546:58;56638:14;56633:2;56625:6;56621:15;56614:39;56429:231;:::o;56666:166::-;56806:18;56802:1;56794:6;56790:14;56783:42;56666:166;:::o;56838:243::-;56978:34;56974:1;56966:6;56962:14;56955:58;57047:26;57042:2;57034:6;57030:15;57023:51;56838:243;:::o;57087:181::-;57227:33;57223:1;57215:6;57211:14;57204:57;57087:181;:::o;57274:229::-;57414:34;57410:1;57402:6;57398:14;57391:58;57483:12;57478:2;57470:6;57466:15;57459:37;57274:229;:::o;57509:228::-;57649:34;57645:1;57637:6;57633:14;57626:58;57718:11;57713:2;57705:6;57701:15;57694:36;57509:228;:::o;57743:169::-;57883:21;57879:1;57871:6;57867:14;57860:45;57743:169;:::o;57918:182::-;58058:34;58054:1;58046:6;58042:14;58035:58;57918:182;:::o;58106:231::-;58246:34;58242:1;58234:6;58230:14;58223:58;58315:14;58310:2;58302:6;58298:15;58291:39;58106:231;:::o;58343:155::-;58483:7;58479:1;58471:6;58467:14;58460:31;58343:155;:::o;58504:182::-;58644:34;58640:1;58632:6;58628:14;58621:58;58504:182;:::o;58692:174::-;58832:26;58828:1;58820:6;58816:14;58809:50;58692:174;:::o;58872:228::-;59012:34;59008:1;59000:6;58996:14;58989:58;59081:11;59076:2;59068:6;59064:15;59057:36;58872:228;:::o;59106:234::-;59246:34;59242:1;59234:6;59230:14;59223:58;59315:17;59310:2;59302:6;59298:15;59291:42;59106:234;:::o;59346:220::-;59486:34;59482:1;59474:6;59470:14;59463:58;59555:3;59550:2;59542:6;59538:15;59531:28;59346:220;:::o;59572:114::-;;:::o;59692:236::-;59832:34;59828:1;59820:6;59816:14;59809:58;59901:19;59896:2;59888:6;59884:15;59877:44;59692:236;:::o;59934:179::-;60074:31;60070:1;60062:6;60058:14;60051:55;59934:179;:::o;60119:231::-;60259:34;60255:1;60247:6;60243:14;60236:58;60328:14;60323:2;60315:6;60311:15;60304:39;60119:231;:::o;60356:229::-;60496:34;60492:1;60484:6;60480:14;60473:58;60565:12;60560:2;60552:6;60548:15;60541:37;60356:229;:::o;60591:224::-;60731:34;60727:1;60719:6;60715:14;60708:58;60800:7;60795:2;60787:6;60783:15;60776:32;60591:224;:::o;60821:151::-;60961:3;60957:1;60949:6;60945:14;60938:27;60821:151;:::o;60978:122::-;61051:24;61069:5;61051:24;:::i;:::-;61044:5;61041:35;61031:63;;61090:1;61087;61080:12;61031:63;60978:122;:::o;61106:116::-;61176:21;61191:5;61176:21;:::i;:::-;61169:5;61166:32;61156:60;;61212:1;61209;61202:12;61156:60;61106:116;:::o;61228:122::-;61301:24;61319:5;61301:24;:::i;:::-;61294:5;61291:35;61281:63;;61340:1;61337;61330:12;61281:63;61228:122;:::o;61356:120::-;61428:23;61445:5;61428:23;:::i;:::-;61421:5;61418:34;61408:62;;61466:1;61463;61456:12;61408:62;61356:120;:::o;61482:152::-;61570:39;61603:5;61570:39;:::i;:::-;61563:5;61560:50;61550:78;;61624:1;61621;61614:12;61550:78;61482:152;:::o;61640:122::-;61713:24;61731:5;61713:24;:::i;:::-;61706:5;61703:35;61693:63;;61752:1;61749;61742:12;61693:63;61640:122;:::o
Swarm Source
ipfs://6738557770c37425863bcbec59a18a2da04ce0eb6b65ebc0509f77b7560d0d5c
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.