Contract
0x9ef76c1d7fcaa712596b782d767ed4531af3f57f
1
Contract Overview
Balance:
0 CRO
CRO Value:
$0.00
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
NFCMasterChef
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-11-01 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (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)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: NFCMasterChef/NFCMasterChef_main.sol pragma solidity ^0.8.1; interface INFCStore { function safeNFCTransfer(address to, uint256 amount) external; } interface INFCToken { function mint(address _to, uint256 _amount) external; } interface IBoostFarmsWithNFT { function getBoost(address _account, uint256 _pid) external view returns (uint256); function depositNFT(address _nft, uint256[] memory _tokenIds, uint256 _pid, address _account) external; function withdrawNFT(address _nft, uint256[] memory _tokenIds, uint256 _pid, address _account) external; } interface ITypeCommonFunctions { function deposit(uint256 _pid, uint256 _amount, uint256[] memory _tokenIds, address _account) external; function withdraw(uint256 _pid, uint256 _amount, uint256[] memory _tokenIds, address _account) external; } interface IType2NFTStaking { function withdrawForStaker(uint256 _pid, uint256 _tokenId) external returns (address); } interface IType3Tiers { function setBaseURI(address _sbtContract, string memory _newBaseURI) external; } contract NFCMasterChef is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; // How many tokens the user has provided. uint256 rewardDebt; // Reward debt. uint256 boostRewardDebt; // Boost Reward debt. bool isWhitelistedForQueueCut; // Wait Period is 0 for whitelisted users in NFT staking pools. } // Info of each pool. struct PoolInfo { uint256 poolType; // Type 1 farms, Type 2 NFT staking pools, Type 3 Tiers (pool 0), Type 4 SBT rewards (pool 1 to 5) IERC20 stakedToken; // Address of token contract. uint256 allocPoint; // How many allocation points assigned to this pool. uint256 lastRewardBlock; // Last block number where NFC distribution occured. uint256 accNFCPerShare; // Accumulated NFC per share, times 1e18. uint256 maxNFTinpool; // Max NFT slots for an NFT Staking pool (Type 2) uint256 roundsTierStart; // Start Timestamp for an NFT Staking pool (Type 2), can be restarted. uint256 limitNFTperUser; // Limit per user for staking NFT in a pool. } // Additionnal rewards in NFC can be added to a pool, those additionnal NFC are stored in an external contract. struct BoostInfo { uint256 boostNfcPerBlock; // NFC distributed per block. INFCStore boostTokenStore; // Where Boost reward tokens are stored. uint256 boostAccNFCPerShare; // Accumulated Boost NFC per share, times 1e18. uint256 boostMaxRewardAmount; // Max NFC tokens to distribute, can be increased. uint256 boostRewardDistributed; // Amount of already distributed NFC additionnal rewards. } struct Info { uint256[5] nfcPerBlock; // NFC distributed per block, index is poolType. Index 0 is never read. uint256[5] totalAllocPoint; // Total Alloction Point for a category of pool (poolType). Index 0 is never read. address[6] sbt; // Smart Contract addresses of SoulBond Tokens used for Tiers system. Index 0 is never read. uint256[6] requiredAmount; // Amount of NFC required to stake in pool 0 (Type 3) for upgrade Tier level. Index 0 is never read. uint256[6] feeAmount; // Amount of NFC user will need to pay to perform any actions. Index is tier level, index 0 is used for Tier 0 users. } struct ContractAddress { address boostFarmsWithNFT; // Contract Address who manage the deposit of NFT for boosting in Farms (PoolType 1) address[5] contractType; // Contracts Addresses who manage the logic of Deposit/Withdraw for each PoolType. Index 0 is never read. } INFCToken public immutable nfc; INFCStore public immutable nfcStore; ContractAddress public contractAddress; Info private info; PoolInfo[] public poolInfo; BoostInfo[] public boostInfo; address public treasury = 0x0f5c4B57B572bD6c81316E60ee73B5F17d981Bb3; mapping(uint256 => mapping(address => UserInfo)) public userInfo; mapping(IERC20 => bool) public poolExistence; mapping(address => bool) public isWhitelistedFeeAddress; event AddPoolType1(address indexed owner, address indexed stakedToken, uint256 allocPoint); event AddPoolType2(address indexed owner, address indexed stakedToken, uint256 maxNFTinpool, uint256 roundsTierStart, uint256 limitNFTperUser); event SetAllocPoint(address indexed owner, uint256 indexed pid, uint256 allocPoint); event SetPoolNFTConfig(address indexed owner, uint256 indexed pid, uint256 maxNFTinpool, uint256 roundsTierStart, uint256 limitNFTperUser); event SetWhitelistQueueCut(address indexed owner, uint256 indexed pid, address[] users, bool whitelisted); event SetPoolBoost(address indexed owner, uint256 indexed pid, uint256 boostNfcPerBlock, address boostTokenStore, uint256 boostMaxRewardAmount); event WithdrawForAll(address indexed owner, uint256 indexed pid, uint256[] tokenIds); event UpdateEmissionRate(address indexed owner, uint256 indexed poolType, uint256 nfcPerBlock); event SetBaseURI(address indexed owner, address indexed sbtContract, string newBaseURI); event SetTreasury(address indexed owner, address indexed treasury); event SetWhitelistFeeAddress(address indexed owner, address indexed contractAddress, bool isWhitelisted); event SetRequiredAmountTier(address indexed owner, uint256[6] requiredAmountTier); event SetFeeAmountTier(address indexed owner, uint256[6] feeAmountTier); event SetContractBoostFarmsWithNFT(address indexed owner, address contractBoostFarms); event SetContractType(address indexed owner, uint256 indexed poolType, address contractAddress); event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 withdrawAmount); constructor( address _nfc, address _nfcStore, uint256[5] memory _nfcPerBlock, address[6] memory _sbt, uint256[6] memory _requiredAmountTier, uint256[6] memory _feeAmountTier ){ nfc = INFCToken(_nfc); nfcStore = INFCStore(_nfcStore); info.nfcPerBlock = _nfcPerBlock; info.sbt = _sbt; info.requiredAmount = _requiredAmountTier; info.feeAmount = _feeAmountTier; addPool(1000, 3, IERC20(_nfc), 0, 0, 0); info.totalAllocPoint[3] = 1000; for (uint256 i = 1; i < 6; i++) { addPool(1000, 4, IERC20(_sbt[i]), 0, 0, 0); } info.totalAllocPoint[4] = 5000; } /* ========== Modifiers ========== */ modifier nonDuplicated(IERC20 _stakedToken) { require(poolExistence[_stakedToken] == false, "A pool for this token already exist"); _; } /* ========== Public View Functions ========== */ function getUserFee(address _user) public view returns (uint256) { UserInfo storage user = userInfo[0][_user]; uint256 userFee = info.feeAmount[0]; for (uint256 i = 1; i < info.requiredAmount.length; i++) { if(user.amount >= info.requiredAmount[i]){ userFee = info.feeAmount[i]; } } return userFee; } function getPoolType(uint256 _pid) public view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; return pool.poolType; } function getTotalAmountStaked(uint256 _pid) public view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; uint256 totalAmountStaked = 0; address contractStaking = contractAddress.contractType[pool.poolType]; if(contractStaking != address(0)){ totalAmountStaked = pool.stakedToken.balanceOf(contractStaking); } return totalAmountStaked; } /* ========== External View Functions ========== */ function getUserAmount(uint256 _pid, address _user) external view returns (uint256) { UserInfo storage user = userInfo[_pid][_user]; return user.amount; } function isWhitelistedForQueueCut(uint256 _pid, address _user) external view returns (bool) { UserInfo storage user = userInfo[_pid][_user]; return user.isWhitelistedForQueueCut; } function getPoolStakedToken(uint256 _pid) external view returns (address) { PoolInfo storage pool = poolInfo[_pid]; return address(pool.stakedToken); } function getPoolMaxNFT(uint256 _pid) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; return pool.maxNFTinpool; } function getPoolLimitNFTPerUser(uint256 _pid) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; return pool.limitNFTperUser; } function getPoolRoundsTierStart(uint256 _pid) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; return pool.roundsTierStart; } function getInfoRequiredAmount() external view returns (uint256[6] memory) { return info.requiredAmount; } function getInfoSBT() external view returns (address[6] memory) { return info.sbt; } function getInfoNfcPerBlock() external view returns (uint256[5] memory) { return info.nfcPerBlock; } function getInfoTotalAllocPoint() external view returns (uint256[5] memory) { return info.totalAllocPoint; } function getInfoFeeAmount() external view returns (uint256[6] memory) { return info.feeAmount; } function getUserTier(address _user) external view returns (uint256) { UserInfo storage user = userInfo[0][_user]; uint256 userTier = 0; for (uint256 i = 1; i < info.requiredAmount.length; i++) { if(user.amount >= info.requiredAmount[i]){ userTier = i; } } return userTier; } function poolLength() external view returns (uint256) { return poolInfo.length; } function pendingNFC(uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; BoostInfo storage boost = boostInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accNFCPerShare = pool.accNFCPerShare; uint256 boostAccNFCPerShare = boost.boostAccNFCPerShare; uint256 totalAmountStaked = getTotalAmountStaked(_pid); if (block.number > pool.lastRewardBlock && totalAmountStaked != 0) { uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 nfcReward = getNfcReward(multiplier, pool.poolType, pool.allocPoint, totalAmountStaked); uint256 boostNfcReward = multiplier * boost.boostNfcPerBlock; accNFCPerShare = accNFCPerShare + (nfcReward*1e18/totalAmountStaked); boostAccNFCPerShare = boostAccNFCPerShare + (boostNfcReward*1e18/totalAmountStaked); } return ((user.amount*accNFCPerShare/1e18) - user.rewardDebt) + ((user.amount*boostAccNFCPerShare/1e18) - user.boostRewardDebt); } /* ========== Owner External Functions ========== */ // Add a Pool Type 1 (Farms LP Token). function addPoolType1(uint256 _allocPoint, IERC20 _stakedToken, bool _withUpdate) external onlyOwner nonDuplicated(_stakedToken) { if (_withUpdate) massUpdatePools(); addPool(_allocPoint, 1, _stakedToken, 0, 0, 0); emit AddPoolType1(_msgSender(), address(_stakedToken), _allocPoint); } // Add a Pool Type 2 (NFT Staking). function addPoolType2(IERC20 _stakedToken, uint256 _maxNFTinpool, uint256 _roundsTierStart, uint256 _limitNFTperUser, bool _withUpdate) external onlyOwner nonDuplicated(_stakedToken) { if (_withUpdate) massUpdatePools(); addPool(0, 2, _stakedToken, _maxNFTinpool, _roundsTierStart, _limitNFTperUser); emit AddPoolType2(_msgSender(), address(_stakedToken), _maxNFTinpool, _roundsTierStart, _limitNFTperUser); } // Update the given pool's NFC allocation point. function setPoolAllocPoint(uint256 _pid, uint256 _allocPoint, bool _withUpdate) external onlyOwner { require(getPoolType(_pid) == 1); if (_withUpdate) massUpdatePools(); operatorTotalAllocpoint(poolInfo[_pid].poolType, poolInfo[_pid].allocPoint, _allocPoint); poolInfo[_pid].allocPoint = _allocPoint; emit SetAllocPoint(_msgSender(), _pid, _allocPoint); } // Update NFT Config parameters for a pool Type 2 (NFT Staking). function setPoolNFTConfig(uint256 _pid, uint256 _maxNFTinpool, uint256 _roundsTierStart, uint256 _limitNFTperUser, bool _withUpdate) external onlyOwner { require(getPoolType(_pid) == 2); if (_withUpdate) massUpdatePools(); operatorTotalAllocpoint(poolInfo[_pid].poolType, poolInfo[_pid].allocPoint, _maxNFTinpool); poolInfo[_pid].allocPoint = _maxNFTinpool; poolInfo[_pid].maxNFTinpool = _maxNFTinpool; poolInfo[_pid].roundsTierStart = _roundsTierStart; poolInfo[_pid].limitNFTperUser = _limitNFTperUser; emit SetPoolNFTConfig(_msgSender(), _pid, _maxNFTinpool, _roundsTierStart, _limitNFTperUser); } // Add users in whitelist for give them the possibily to stake in NFT pool (type 2) without wait period. function setWhitelistQueueCut(uint256 _pid, address[] memory _users, bool _whitelisted) external onlyOwner { uint256 nbUsers = _users.length; for (uint256 i = 0; i < nbUsers; i++) { UserInfo storage user = userInfo[_pid][_users[i]]; user.isWhitelistedForQueueCut = _whitelisted; } emit SetWhitelistQueueCut(_msgSender(), _pid, _users, _whitelisted); } // Add or Update Boost for a pool (Additionnal already minted NFC and stored in another contract). function setPoolBoost(uint256 _pid, uint256 _boostNfcPerBlock, address _boostTokenStore, uint256 _boostMaxRewardAmount, bool _withUpdate) external onlyOwner { if (_withUpdate) massUpdatePools(); boostInfo[_pid].boostNfcPerBlock = _boostNfcPerBlock; boostInfo[_pid].boostTokenStore = INFCStore(_boostTokenStore); boostInfo[_pid].boostMaxRewardAmount = _boostMaxRewardAmount; emit SetPoolBoost(_msgSender(), _pid, _boostNfcPerBlock, _boostTokenStore, _boostMaxRewardAmount); } // Withdraw all NFTs from a NFT Staking pool, to stakers and send rewards to them. // This function is used in case a pool need to decrease its MaxNFTinPool value. function withdrawForAll(uint256 _pid, uint256[] memory _tokenIds) external onlyOwner { uint256 nbTokenIds = _tokenIds.length; PoolInfo storage pool = poolInfo[_pid]; require(pool.poolType == 2); require(nbTokenIds <= 50, "Limited to 50 NFT per withdraw tx"); updatePool(_pid); for (uint256 i = 0; i < nbTokenIds; i++) { address staker = IType2NFTStaking(contractAddress.contractType[2]).withdrawForStaker(_pid, _tokenIds[i]); UserInfo storage user = userInfo[_pid][staker]; collectPending(_pid, staker); user.amount = 0; user.rewardDebt = 0; user.boostRewardDebt = 0; } emit WithdrawForAll(_msgSender(), _pid, _tokenIds); } // Update NFC Emission Rate for a given category (Pool Type). // Emission Rate for Type 2 (NFT Staking) is a value for 1 NFT staked. function updateEmissionRate(uint256 _type, uint256 _nfcPerBlock, bool _withUpdate) external onlyOwner { if (_withUpdate) massUpdatePools(); info.nfcPerBlock[_type] = _nfcPerBlock; emit UpdateEmissionRate(_msgSender(), _type, _nfcPerBlock); } // Update Base URI for a SoulBond Token. function setBaseURI(address _sbtContract, string memory _newBaseURI) external onlyOwner { IType3Tiers(contractAddress.contractType[3]).setBaseURI(_sbtContract, _newBaseURI); emit SetBaseURI(_msgSender(), _sbtContract, _newBaseURI); } // Update the address collecting NFC fees. function setTreasury(address _treasury) external onlyOwner { treasury = _treasury; emit SetTreasury(_msgSender(), _treasury); } // Add or Remove an address to whitelist to perform actions without the need to pay NFC fees (ex: auto-compound vault contracts). function setWhitelistFeeAddress(address _address, bool _bool) external onlyOwner { isWhitelistedFeeAddress[_address] = _bool; emit SetWhitelistFeeAddress(_msgSender(), _address, _bool); } // Update the amount of NFC required to stake for upgrade user Tiers. function setRequiredAmountTier(uint256[6] memory _requiredAmountTier) external onlyOwner { info.requiredAmount = _requiredAmountTier; emit SetRequiredAmountTier(_msgSender(), _requiredAmountTier); } // Update the NFC fees amount per Tier. function setFeeAmountTier(uint256[6] memory _feeAmountTier) external onlyOwner { info.feeAmount = _feeAmountTier; emit SetFeeAmountTier(_msgSender(), _feeAmountTier); } // Add the contract managing the logic for the NFT deposit required for boosting Farms (Type 1) and NFT Staking Pools (Type 2). function setContractBoostFarmsWithNFT(address _contractBoostFarms) external onlyOwner { require(contractAddress.boostFarmsWithNFT == address(0), "Contract can't be changed for security reasons"); contractAddress.boostFarmsWithNFT = _contractBoostFarms; emit SetContractBoostFarmsWithNFT(_msgSender(), _contractBoostFarms); } // Set contract address for managing pool's type logic. function setContractType(uint256 _type, address _contractAddress) external onlyOwner { require(contractAddress.contractType[_type] == address(0), "Contract can't be changed for security reasons"); contractAddress.contractType[_type] = _contractAddress; emit SetContractType(_msgSender(), _type, _contractAddress); } /* ========== Public Functions ========== */ // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; BoostInfo storage boost = boostInfo[_pid]; if (block.number <= pool.lastRewardBlock) { return; } uint256 totalAmountStaked = getTotalAmountStaked(_pid); if (totalAmountStaked == 0 || pool.allocPoint == 0) { pool.lastRewardBlock = block.number; return; } uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 nfcReward = getNfcReward(multiplier, pool.poolType, pool.allocPoint, totalAmountStaked); nfc.mint(address(nfcStore), nfcReward); pool.accNFCPerShare = pool.accNFCPerShare + (nfcReward*1e18/totalAmountStaked); //Rewards boosted uint256 boostNfcReward = multiplier * boost.boostNfcPerBlock; //Check boost rewards distributed if(boost.boostRewardDistributed + boostNfcReward < boost.boostMaxRewardAmount){ boost.boostAccNFCPerShare = boost.boostAccNFCPerShare + (boostNfcReward*1e18/totalAmountStaked); boost.boostRewardDistributed += boostNfcReward; }else { boost.boostNfcPerBlock = 0; } pool.lastRewardBlock = block.number; } /* ========== External Functions ========== */ // Deposit LP tokens OR NFTs to MasterChef for NFC allocation. function deposit(uint256 _pid, uint256 _amount, uint256[] memory _tokenIds) external nonReentrant { require (_pid < poolInfo.length, "Invalid pool Id"); updatePool(_pid); collectPending(_pid, _msgSender()); uint256 nbTokenIds = _tokenIds.length; uint256 amount = _amount; PoolInfo storage pool = poolInfo[_pid]; BoostInfo storage boost = boostInfo[_pid]; UserInfo storage user = userInfo[_pid][_msgSender()]; if (((pool.poolType == 1 || pool.poolType == 3) && _amount > 0) || ((pool.poolType == 2 || pool.poolType == 4) && nbTokenIds > 0)){ ITypeCommonFunctions(contractAddress.contractType[pool.poolType]).deposit(_pid, _amount, _tokenIds, _msgSender()); if (pool.poolType == 2 || pool.poolType == 4) amount = nbTokenIds; } payFee(_msgSender(), 1); user.amount = user.amount + amount; user.rewardDebt = user.amount*pool.accNFCPerShare/1e18; user.boostRewardDebt = user.amount*boost.boostAccNFCPerShare/1e18; emit Deposit(_msgSender(), _pid, amount); } // Withdraw LP tokens OR NFTs to MasterChef for NFC allocation. function withdraw(uint256 _pid, uint256 _amount, uint256[] memory _tokenIds) external nonReentrant { require (_pid < poolInfo.length, "Invalid pool Id"); updatePool(_pid); collectPending(_pid, _msgSender()); uint256 nbTokenIds = _tokenIds.length; uint256 amount = _amount; uint256 mulFee = 1; PoolInfo storage pool = poolInfo[_pid]; BoostInfo storage boost = boostInfo[_pid]; UserInfo storage user = userInfo[_pid][_msgSender()]; if (((pool.poolType == 1 || pool.poolType == 3) && _amount > 0) || ((pool.poolType == 2 || pool.poolType == 4) && nbTokenIds > 0)){ ITypeCommonFunctions(contractAddress.contractType[pool.poolType]).withdraw(_pid, _amount, _tokenIds, _msgSender()); if (pool.poolType == 2 || pool.poolType == 4){ amount = nbTokenIds; mulFee = nbTokenIds; } } payFee(_msgSender(), mulFee); user.amount = user.amount - amount; user.rewardDebt = user.amount*pool.accNFCPerShare/1e18; user.boostRewardDebt = user.amount*boost.boostAccNFCPerShare/1e18; emit Withdraw(_msgSender(), _pid, amount); } // Withdraw LP tokens or NTFs without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid, uint256[] memory _tokenIds) external nonReentrant { require (_pid < poolInfo.length, "Invalid pool Id"); PoolInfo storage pool = poolInfo[_pid]; BoostInfo storage boost = boostInfo[_pid]; UserInfo storage user = userInfo[_pid][_msgSender()]; uint256 withdrawAmount = user.amount; if (pool.poolType == 1 || pool.poolType == 3){ uint256[] memory emptyArray; ITypeCommonFunctions(contractAddress.contractType[pool.poolType]).withdraw(_pid, user.amount, emptyArray, _msgSender()); user.amount = 0; } else if ((pool.poolType == 2 || pool.poolType == 4) && _tokenIds.length > 0){ ITypeCommonFunctions(contractAddress.contractType[pool.poolType]).withdraw(_pid, 0, _tokenIds, _msgSender()); withdrawAmount = _tokenIds.length; user.amount = user.amount - withdrawAmount; } user.rewardDebt = user.amount*pool.accNFCPerShare/1e18; user.boostRewardDebt = user.amount*boost.boostAccNFCPerShare/1e18; emit EmergencyWithdraw(_msgSender(), _pid, withdrawAmount); } /* ========== NFT Boost Farms View Functions ========== */ function getBoost(address _account, uint256 _pid) public view returns (uint256) { if (contractAddress.boostFarmsWithNFT == address(0)) return 0; return IBoostFarmsWithNFT(contractAddress.boostFarmsWithNFT).getBoost(_account, _pid); } /* ========== NFT Boost Farms External Functions ========== */ // Depositing of NFTs Farms Boosting function depositNFT(address _nft, uint256[] memory _tokenIds, uint256 _pid) external nonReentrant{ IBoostFarmsWithNFT(contractAddress.boostFarmsWithNFT).depositNFT(_nft, _tokenIds, _pid, _msgSender()); payFee(_msgSender(), _tokenIds.length); } // Withdrawing of NFTs Farms Boosting function withdrawNFT(address _nft, uint256[] memory _tokenIds, uint256 _pid) external nonReentrant{ IBoostFarmsWithNFT(contractAddress.boostFarmsWithNFT).withdrawNFT(_nft, _tokenIds, _pid, _msgSender()); payFee(_msgSender(), _tokenIds.length); } /* ========== Internal Functions ========== */ // Pay Fee function payFee(address _account, uint256 _nb) internal { uint256 fee = getUserFee(_account); if(fee > 0 && !isWhitelistedFeeAddress[_account]){ IERC20(address(nfc)).safeTransferFrom(_account, address(treasury), fee * _nb); } } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) internal pure returns (uint256) { return _to - _from; } // Return reward amount. function getNfcReward(uint256 _multiplier, uint256 _poolType, uint256 _poolAllocPoint, uint256 _totalAmountStaked) internal view returns (uint256) { uint256 nfcReward = 0; if(_poolType == 1 || _poolType == 3 || _poolType == 4){ nfcReward = _multiplier * info.nfcPerBlock[_poolType] * _poolAllocPoint / info.totalAllocPoint[_poolType]; }else if (_poolType == 2){ nfcReward = _multiplier * info.nfcPerBlock[_poolType] * _totalAmountStaked; } return nfcReward; } // Operator TotalAllocPoint per type. function operatorTotalAllocpoint(uint256 _poolType, uint256 _sub, uint256 _add) internal { info.totalAllocPoint[_poolType] = info.totalAllocPoint[_poolType] - _sub + _add; } // Add a new pool function addPool(uint256 _allocPoint, uint256 _poolType, IERC20 _stakedToken, uint256 _maxNFTinpool, uint256 _roundsTierStart, uint256 _limitNFTperUser) internal { uint256 allocPoint = _allocPoint; if (_maxNFTinpool > 0) allocPoint = _maxNFTinpool; operatorTotalAllocpoint(_poolType, 0, allocPoint); poolExistence[_stakedToken] = true; poolInfo.push(PoolInfo({ poolType : _poolType, stakedToken : _stakedToken, allocPoint : allocPoint, lastRewardBlock : block.number, accNFCPerShare : 0, maxNFTinpool : _maxNFTinpool, roundsTierStart : _roundsTierStart, limitNFTperUser : _limitNFTperUser })); boostInfo.push(BoostInfo({ boostNfcPerBlock : 0, boostTokenStore : INFCStore(0x0000000000000000000000000000000000000000), boostAccNFCPerShare : 0, boostMaxRewardAmount : 0, boostRewardDistributed : 0 })); } // Safe NFC transfer function, just in case if rounding error causes pool to not have enough NFC. function safeNFCTransfer(address _to, uint256 _amount, uint256 _pid) internal { nfcStore.safeNFCTransfer(_to, _amount); if(getPoolType(_pid) == 1 || getPoolType(_pid) == 2){ uint256 boost = getBoost(_to, _pid) * _amount / 1000; if (boost > 0) nfc.mint(_to, boost); } } // Safe NFC transfer function from tokenStore for Additionnal Boost in pools (Any Type of pool can be concerned). function safeBoostNFCTransfer(INFCStore _tokenStore, address _to, uint256 _amount) internal { _tokenStore.safeNFCTransfer(_to, _amount); } // Collect pending rewards. function collectPending(uint256 _pid, address _user) internal { PoolInfo storage pool = poolInfo[_pid]; BoostInfo storage boost = boostInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; if (user.amount > 0) { uint256 pending = (user.amount*pool.accNFCPerShare/1e18) - user.rewardDebt; uint256 boostPending = (user.amount*boost.boostAccNFCPerShare/1e18) - user.boostRewardDebt; if (pending > 0) { safeNFCTransfer(_user, pending, _pid); } if (boostPending > 0) { safeBoostNFCTransfer(boost.boostTokenStore, _user, boostPending); } } } }
[{"inputs":[{"internalType":"address","name":"_nfc","type":"address"},{"internalType":"address","name":"_nfcStore","type":"address"},{"internalType":"uint256[5]","name":"_nfcPerBlock","type":"uint256[5]"},{"internalType":"address[6]","name":"_sbt","type":"address[6]"},{"internalType":"uint256[6]","name":"_requiredAmountTier","type":"uint256[6]"},{"internalType":"uint256[6]","name":"_feeAmountTier","type":"uint256[6]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"stakedToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"}],"name":"AddPoolType1","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"stakedToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"maxNFTinpool","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"roundsTierStart","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"limitNFTperUser","type":"uint256"}],"name":"AddPoolType2","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"}],"name":"SetAllocPoint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"sbtContract","type":"address"},{"indexed":false,"internalType":"string","name":"newBaseURI","type":"string"}],"name":"SetBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"contractBoostFarms","type":"address"}],"name":"SetContractBoostFarmsWithNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"poolType","type":"uint256"},{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"}],"name":"SetContractType","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256[6]","name":"feeAmountTier","type":"uint256[6]"}],"name":"SetFeeAmountTier","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"boostNfcPerBlock","type":"uint256"},{"indexed":false,"internalType":"address","name":"boostTokenStore","type":"address"},{"indexed":false,"internalType":"uint256","name":"boostMaxRewardAmount","type":"uint256"}],"name":"SetPoolBoost","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxNFTinpool","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"roundsTierStart","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"limitNFTperUser","type":"uint256"}],"name":"SetPoolNFTConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256[6]","name":"requiredAmountTier","type":"uint256[6]"}],"name":"SetRequiredAmountTier","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"treasury","type":"address"}],"name":"SetTreasury","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"isWhitelisted","type":"bool"}],"name":"SetWhitelistFeeAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"users","type":"address[]"},{"indexed":false,"internalType":"bool","name":"whitelisted","type":"bool"}],"name":"SetWhitelistQueueCut","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"poolType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nfcPerBlock","type":"uint256"}],"name":"UpdateEmissionRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"WithdrawForAll","type":"event"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_stakedToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"addPoolType1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_stakedToken","type":"address"},{"internalType":"uint256","name":"_maxNFTinpool","type":"uint256"},{"internalType":"uint256","name":"_roundsTierStart","type":"uint256"},{"internalType":"uint256","name":"_limitNFTperUser","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"addPoolType2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"boostInfo","outputs":[{"internalType":"uint256","name":"boostNfcPerBlock","type":"uint256"},{"internalType":"contract INFCStore","name":"boostTokenStore","type":"address"},{"internalType":"uint256","name":"boostAccNFCPerShare","type":"uint256"},{"internalType":"uint256","name":"boostMaxRewardAmount","type":"uint256"},{"internalType":"uint256","name":"boostRewardDistributed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractAddress","outputs":[{"internalType":"address","name":"boostFarmsWithNFT","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"depositNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getBoost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInfoFeeAmount","outputs":[{"internalType":"uint256[6]","name":"","type":"uint256[6]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInfoNfcPerBlock","outputs":[{"internalType":"uint256[5]","name":"","type":"uint256[5]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInfoRequiredAmount","outputs":[{"internalType":"uint256[6]","name":"","type":"uint256[6]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInfoSBT","outputs":[{"internalType":"address[6]","name":"","type":"address[6]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInfoTotalAllocPoint","outputs":[{"internalType":"uint256[5]","name":"","type":"uint256[5]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getPoolLimitNFTPerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getPoolMaxNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getPoolRoundsTierStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getPoolStakedToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getPoolType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"getTotalAmountStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getUserAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserTier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelistedFeeAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelistedForQueueCut","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nfc","outputs":[{"internalType":"contract INFCToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nfcStore","outputs":[{"internalType":"contract INFCStore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingNFC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"name":"poolExistence","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"poolType","type":"uint256"},{"internalType":"contract IERC20","name":"stakedToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accNFCPerShare","type":"uint256"},{"internalType":"uint256","name":"maxNFTinpool","type":"uint256"},{"internalType":"uint256","name":"roundsTierStart","type":"uint256"},{"internalType":"uint256","name":"limitNFTperUser","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sbtContract","type":"address"},{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractBoostFarms","type":"address"}],"name":"setContractBoostFarmsWithNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_type","type":"uint256"},{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"setContractType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[6]","name":"_feeAmountTier","type":"uint256[6]"}],"name":"setFeeAmountTier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"setPoolAllocPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_boostNfcPerBlock","type":"uint256"},{"internalType":"address","name":"_boostTokenStore","type":"address"},{"internalType":"uint256","name":"_boostMaxRewardAmount","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"setPoolBoost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_maxNFTinpool","type":"uint256"},{"internalType":"uint256","name":"_roundsTierStart","type":"uint256"},{"internalType":"uint256","name":"_limitNFTperUser","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"setPoolNFTConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[6]","name":"_requiredAmountTier","type":"uint256[6]"}],"name":"setRequiredAmountTier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_bool","type":"bool"}],"name":"setWhitelistFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"bool","name":"_whitelisted","type":"bool"}],"name":"setWhitelistQueueCut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_type","type":"uint256"},{"internalType":"uint256","name":"_nfcPerBlock","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"updateEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"boostRewardDebt","type":"uint256"},{"internalType":"bool","name":"isWhitelistedForQueueCut","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"withdrawForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"withdrawNFT","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c0604052730f5c4b57b572bd6c81316e60ee73b5f17d981bb3602660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b5060405162006b1238038062006b1283398181016040528101906200008c919062000a9d565b620000ac620000a06200024160201b60201c565b6200024960201b60201c565b600180819055508573ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508473ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505083600860000190600562000131929190620005d8565b50826008600a01906006620001489291906200061d565b508160086010019060066200015f9291906200069f565b50806008601601906006620001769291906200069f565b50620001926103e860038860008060006200030d60201b60201c565b6103e86008600501600360058110620001b057620001af62000b3c565b5b01819055506000600190505b60068110156200021157620001fb6103e86004868460068110620001e557620001e462000b3c565b5b602002015160008060006200030d60201b60201c565b8080620002089062000b9a565b915050620001bc565b50611388600860050160046005811062000230576200022f62000b3c565b5b018190555050505050505062000c5d565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000869050600084111562000320578390505b62000334866000836200057e60201b60201c565b6001602860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060246040518061010001604052808881526020018773ffffffffffffffffffffffffffffffffffffffff168152602001838152602001438152602001600081526020018681526020018581526020018481525090806001815401808255809150506001900390600052602060002090600802016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155505060256040518060a0016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081525090806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040155505050505050505050565b8082600860050185600581106200059a576200059962000b3c565b5b0154620005a8919062000be7565b620005b4919062000c22565b60086005018460058110620005ce57620005cd62000b3c565b5b0181905550505050565b82600581019282156200060a579160200282015b8281111562000609578251825591602001919060010190620005ec565b5b509050620006199190620006e4565b5090565b82600681019282156200068c579160200282015b828111156200068b5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000631565b5b5090506200069b9190620006e4565b5090565b8260068101928215620006d1579160200282015b82811115620006d0578251825591602001919060010190620006b3565b5b509050620006e09190620006e4565b5090565b5b80821115620006ff576000816000905550600101620006e5565b5090565b6000604051905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200073f8262000712565b9050919050565b620007518162000732565b81146200075d57600080fd5b50565b600081519050620007718162000746565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620007c7826200077c565b810181811067ffffffffffffffff82111715620007e957620007e86200078d565b5b80604052505050565b6000620007fe62000703565b90506200080c8282620007bc565b919050565b600067ffffffffffffffff8211156200082f576200082e6200078d565b5b602082029050919050565b600080fd5b6000819050919050565b62000854816200083f565b81146200086057600080fd5b50565b600081519050620008748162000849565b92915050565b6000620008916200088b8462000811565b620007f2565b90508060208402830185811115620008ae57620008ad6200083a565b5b835b81811015620008db5780620008c6888262000863565b845260208401935050602081019050620008b0565b5050509392505050565b600082601f830112620008fd57620008fc62000777565b5b60056200090c8482856200087a565b91505092915050565b600067ffffffffffffffff8211156200093357620009326200078d565b5b602082029050919050565b6000620009556200094f8462000915565b620007f2565b905080602084028301858111156200097257620009716200083a565b5b835b818110156200099f57806200098a888262000760565b84526020840193505060208101905062000974565b5050509392505050565b600082601f830112620009c157620009c062000777565b5b6006620009d08482856200093e565b91505092915050565b600067ffffffffffffffff821115620009f757620009f66200078d565b5b602082029050919050565b600062000a1962000a1384620009d9565b620007f2565b9050806020840283018581111562000a365762000a356200083a565b5b835b8181101562000a63578062000a4e888262000863565b84526020840193505060208101905062000a38565b5050509392505050565b600082601f83011262000a855762000a8462000777565b5b600662000a9484828562000a02565b91505092915050565b600080600080600080610320878903121562000abe5762000abd6200070d565b5b600062000ace89828a0162000760565b965050602062000ae189828a0162000760565b955050604062000af489828a01620008e5565b94505060e062000b0789828a01620009a9565b9350506101a062000b1b89828a0162000a6d565b92505061026062000b2f89828a0162000a6d565b9150509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ba7826200083f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362000bdc5762000bdb62000b6b565b5b600182019050919050565b600062000bf4826200083f565b915062000c01836200083f565b925082820390508181111562000c1c5762000c1b62000b6b565b5b92915050565b600062000c2f826200083f565b915062000c3c836200083f565b925082820190508082111562000c575762000c5662000b6b565b5b92915050565b60805160a051615e6c62000ca660003960008181610f4601528181611b590152613ddc01526000818161141c01528181611b1d015281816139ed0152613ebc0152615e6c6000f3fe608060405234801561001057600080fd5b506004361061030c5760003560e01c80636323f80f1161019d578063af1dab75116100e9578063d0c18755116100a2578063e4d2620e1161007c578063e4d2620e1461098f578063f0f44260146109bf578063f2fde38b146109db578063f6b4dfb4146109f75761030c565b8063d0c1875514610937578063d4af637014610953578063da4879b6146109715761030c565b8063af1dab7514610853578063c4d6e42e14610883578063cbd258b51461089f578063ccb7684e146108cf578063cdcf8783146108eb578063cfe4c1eb1461091b5761030c565b806383ac45f0116101565780638da5cb5b116101305780638da5cb5b146107ca57806393f1a40b146107e857806397649e971461081b578063a9ef6880146108375761030c565b806383ac45f01461074e578063884336511461077e5780638a1cc87d1461079a5761030c565b80636323f80f146106a25780636698656e146106be57806369be0ba4146106da578063715018a61461070a57806371f39ca114610714578063738abee6146107305761030c565b80633361a9261161025c57806345b373d31161021557806351eb05a6116101ef57806351eb05a61461062e578063525519921461064a57806361d027b31461067a578063630b5ba1146106985761030c565b806345b373d3146105b25780634c9fc584146105e25780634cd3a49b146106125761030c565b80633361a926146104f45780633437586b14610510578063386a1ce0146105405780633f8c82441461055c57806344b19bcc1461057a57806344b8ad0d146105965761030c565b80631f737641116102c957806329d683f8116102a357806329d683f81461046c5780632edff8961461048857806330bcf63c146104a657806332364f46146104c45761030c565b80631f737641146103fe57806322b7ff7a1461043257806326d2db7b1461044e5761030c565b8063060f58c314610311578063081e3eda14610341578063106a5ab21461035f5780631526fe271461038f57806317867410146103c65780631e481ada146103e2575b600080fd5b61032b60048036038101906103269190614373565b610a15565b60405161033891906143b9565b60405180910390f35b610349610af5565b60405161035691906143b9565b60405180910390f35b61037960048036038101906103749190614400565b610b02565b60405161038691906143b9565b60405180910390f35b6103a960048036038101906103a49190614400565b610b36565b6040516103bd98979695949392919061448c565b60405180910390f35b6103e060048036038101906103db9190614580565b610bae565b005b6103fc60048036038101906103f791906145d3565b610cdc565b005b61041860048036038101906104139190614400565b610dab565b604051610429959493929190614634565b60405180910390f35b61044c60048036038101906104479190614687565b610e11565b005b610456610f44565b6040516104639190614702565b60405180910390f35b61048660048036038101906104819190614864565b610f68565b005b610490610fdd565b60405161049d919061493c565b60405180910390f35b6104ae611061565b6040516104bb9190614a02565b60405180910390f35b6104de60048036038101906104d99190614a1d565b6110af565b6040516104eb9190614a6c565b60405180910390f35b61050e60048036038101906105099190614373565b61111f565b005b61052a60048036038101906105259190614a1d565b611257565b60405161053791906143b9565b60405180910390f35b61055a60048036038101906105559190614a1d565b6112ba565b005b61056461141a565b6040516105719190614aa8565b60405180910390f35b610594600480360381019061058f9190614ac3565b61143e565b005b6105b060048036038101906105ab9190614c01565b6115c8565b005b6105cc60048036038101906105c79190614c70565b6116d0565b6040516105d991906143b9565b60405180910390f35b6105fc60048036038101906105f79190614373565b6117dd565b6040516106099190614a6c565b60405180910390f35b61062c60048036038101906106279190614cb0565b6117fd565b005b61064860048036038101906106439190614400565b611a5d565b005b610664600480360381019061065f9190614400565b611ca1565b6040516106719190614d1b565b60405180910390f35b610682611cf5565b60405161068f9190614d1b565b60405180910390f35b6106a0611d1b565b005b6106bc60048036038101906106b79190614d36565b611d4e565b005b6106d860048036038101906106d39190614da5565b6120c4565b005b6106f460048036038101906106ef9190614a1d565b6121ca565b60405161070191906143b9565b60405180910390f35b6107126123b9565b005b61072e60048036038101906107299190614cb0565b6123cd565b005b6107386127b6565b6040516107459190614e7c565b60405180910390f35b61076860048036038101906107639190614400565b612804565b60405161077591906143b9565b60405180910390f35b61079860048036038101906107939190614f4c565b612838565b005b6107b460048036038101906107af9190614400565b612956565b6040516107c191906143b9565b60405180910390f35b6107d261298a565b6040516107df9190614d1b565b60405180910390f35b61080260048036038101906107fd9190614a1d565b6129b3565b6040516108129493929190614fa8565b60405180910390f35b610835600480360381019061083091906150b0565b6129fd565b005b610851600480360381019061084c9190614d36565b612b13565b005b61086d60048036038101906108689190614400565b612e92565b60405161087a91906143b9565b60405180910390f35b61089d60048036038101906108989190614c01565b612fdb565b005b6108b960048036038101906108b4919061511f565b6130e3565b6040516108c69190614a6c565b60405180910390f35b6108e960048036038101906108e49190614da5565b613103565b005b61090560048036038101906109009190614400565b613192565b60405161091291906143b9565b60405180910390f35b6109356004803603810190610930919061514c565b6131c6565b005b610951600480360381019061094c9190614864565b6132f6565b005b61095b61336b565b6040516109689190614a02565b60405180910390f35b6109796133b9565b6040516109869190614e7c565b60405180910390f35b6109a960048036038101906109a49190614373565b613407565b6040516109b691906143b9565b60405180910390f35b6109d960048036038101906109d49190614373565b6134b2565b005b6109f560048036038101906109f09190614373565b61355f565b005b6109ff6135e2565b604051610a0c9190614d1b565b60405180910390f35b6000806027600080815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006008601601600060068110610a8457610a836151c7565b5b015490506000600190505b6006811015610aea5760086010018160068110610aaf57610aae6151c7565b5b0154836000015410610ad75760086016018160068110610ad257610ad16151c7565b5b015491505b8080610ae290615225565b915050610a8f565b508092505050919050565b6000602480549050905090565b60008060248381548110610b1957610b186151c7565b5b906000526020600020906008020190508060070154915050919050565b60248181548110610b4657600080fd5b90600052602060002090600802016000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040154908060050154908060060154908060070154905088565b610bb661360e565b8160001515602860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c41906152f0565b60405180910390fd5b8115610c5957610c58611d1b565b5b610c6a84600185600080600061368c565b8273ffffffffffffffffffffffffffffffffffffffff16610c896138f4565b73ffffffffffffffffffffffffffffffffffffffff167f63311afae05c8ff58f9518d989363ebd55bdd11dd4f4049c2abde7965cf62eac86604051610cce91906143b9565b60405180910390a350505050565b610ce461360e565b80602960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610d5a6138f4565b73ffffffffffffffffffffffffffffffffffffffff167f1d0a961669cdc54e5371b2e74f50cd42a8101e39369969b0e33bcf475ac3c9b383604051610d9f9190614a6c565b60405180910390a35050565b60258181548110610dbb57600080fd5b90600052602060002090600502016000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040154905085565b610e1961360e565b8460001515602860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea4906152f0565b60405180910390fd5b8115610ebc57610ebb611d1b565b5b610ecc600060028888888861368c565b8573ffffffffffffffffffffffffffffffffffffffff16610eeb6138f4565b73ffffffffffffffffffffffffffffffffffffffff167fbeaf8443302eb6ee144177e9ac85edd4f4ca202be163cde0c5013e7a5feb82f9878787604051610f3493929190615310565b60405180910390a3505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610f7061360e565b806008601001906006610f8492919061423e565b50610f8d6138f4565b73ffffffffffffffffffffffffffffffffffffffff167f140a5671a98b91a1183cc93c906a5cfcd11fab74d52dfdabcac9bf310e6689cb82604051610fd29190614a02565b60405180910390a250565b610fe561427e565b6008600a01600680602002604051908101604052809291908260068015611057576020028201915b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161100d575b5050505050905090565b6110696142a0565b60086010016006806020026040519081016040528092919082600680156110a5576020028201915b815481526020019060010190808311611091575b5050505050905090565b6000806027600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060030160009054906101000a900460ff1691505092915050565b61112761360e565b600073ffffffffffffffffffffffffffffffffffffffff16600260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b2906153b9565b60405180910390fd5b80600260000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506112076138f4565b73ffffffffffffffffffffffffffffffffffffffff167f04778252eb5e1a21ddf96adaf6642fb5ff754d0d67acdd7c501374b568365d778260405161124c9190614d1b565b60405180910390a250565b6000806027600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015491505092915050565b6112c261360e565b600073ffffffffffffffffffffffffffffffffffffffff16600260010183600581106112f1576112f06151c7565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611369576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611360906153b9565b60405180910390fd5b8060026001018360058110611381576113806151c7565b5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816113c96138f4565b73ffffffffffffffffffffffffffffffffffffffff167f2175a6ab943b302a78a850f84764579f80156e17aca369c2a47964ed4f411a128360405161140e9190614d1b565b60405180910390a35050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61144661360e565b600261145186613192565b1461145b57600080fd5b801561146a57611469611d1b565b5b6114bf60248681548110611481576114806151c7565b5b906000526020600020906008020160000154602487815481106114a7576114a66151c7565b5b906000526020600020906008020160020154866138fc565b83602486815481106114d4576114d36151c7565b5b90600052602060002090600802016002018190555083602486815481106114fe576114fd6151c7565b5b9060005260206000209060080201600501819055508260248681548110611528576115276151c7565b5b9060005260206000209060080201600601819055508160248681548110611552576115516151c7565b5b906000526020600020906008020160070181905550846115706138f4565b73ffffffffffffffffffffffffffffffffffffffff167f04eaafe01b5011ec17caddff05708ef8437ed8aa5e038a243251737c427d188a8686866040516115b993929190615310565b60405180910390a35050505050565b60026001540361160d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160490615425565b60405180910390fd5b6002600181905550600260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c9744da8484846116616138f4565b6040518563ffffffff1660e01b815260040161168094939291906154dc565b600060405180830381600087803b15801561169a57600080fd5b505af11580156116ae573d6000803e3d6000fd5b505050506116c46116bd6138f4565b835161394c565b60018081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff16600260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361173357600090506117d7565b600260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166345b373d384846040518363ffffffff1660e01b8152600401611793929190615528565b602060405180830381865afa1580156117b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d49190615566565b90505b92915050565b60296020528060005260406000206000915054906101000a900460ff1681565b61180561360e565b600081519050600060248481548110611821576118206151c7565b5b90600052602060002090600802019050600281600001541461184257600080fd5b6032821115611886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187d90615605565b60405180910390fd5b61188f84611a5d565b60005b82811015611a0057600060026001016002600581106118b4576118b36151c7565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663189ab76287878581518110611905576119046151c7565b5b60200260200101516040518363ffffffff1660e01b815260040161192a929190615625565b6020604051808303816000875af1158015611949573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196d9190615663565b905060006027600088815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506119cd8783613a38565b600081600001819055506000816001018190555060008160020181905550505080806119f890615225565b915050611892565b5083611a0a6138f4565b73ffffffffffffffffffffffffffffffffffffffff167fc83de7baaa8d8a8fb0a2c20eaf4730f60017d6ebbed34526326557779c0fdf0085604051611a4f9190615690565b60405180910390a350505050565b600060248281548110611a7357611a726151c7565b5b90600052602060002090600802019050600060258381548110611a9957611a986151c7565b5b9060005260206000209060050201905081600301544311611abb575050611c9e565b6000611ac684612e92565b90506000811480611adb575060008360020154145b15611af157438360030181905550505050611c9e565b6000611b01846003015443613bb1565b90506000611b19828660000154876002015486613bc7565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f197f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401611b96929190615528565b600060405180830381600087803b158015611bb057600080fd5b505af1158015611bc4573d6000803e3d6000fd5b5050505082670de0b6b3a764000082611bdd91906156b2565b611be7919061573b565b8560040154611bf6919061576c565b85600401819055506000846000015483611c1091906156b2565b90508460030154818660040154611c27919061576c565b1015611c835783670de0b6b3a764000082611c4291906156b2565b611c4c919061573b565b8560020154611c5b919061576c565b856002018190555080856004016000828254611c77919061576c565b92505081905550611c8e565b600085600001819055505b4386600301819055505050505050505b50565b60008060248381548110611cb857611cb76151c7565b5b906000526020600020906008020190508060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000602480549050905060005b81811015611d4a57611d3981611a5d565b80611d4390615225565b9050611d28565b5050565b600260015403611d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8a90615425565b60405180910390fd5b60026001819055506024805490508310611de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd9906157ec565b60405180910390fd5b611deb83611a5d565b611dfc83611df76138f4565b613a38565b6000815190506000839050600060248681548110611e1d57611e1c6151c7565b5b90600052602060002090600802019050600060258781548110611e4357611e426151c7565b5b906000526020600020906005020190506000602760008981526020019081526020016000206000611e726138f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600183600001541480611ec5575060038360000154145b8015611ed15750600087115b80611efb5750600283600001541480611eee575060048360000154145b8015611efa5750600085115b5b15611fd5576002600101836000015460058110611f1b57611f1a6151c7565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e177884f898989611f636138f4565b6040518563ffffffff1660e01b8152600401611f82949392919061580c565b600060405180830381600087803b158015611f9c57600080fd5b505af1158015611fb0573d6000803e3d6000fd5b50505050600283600001541480611fcb575060048360000154145b15611fd4578493505b5b611fe7611fe06138f4565b600161394c565b838160000154611ff7919061576c565b8160000181905550670de0b6b3a76400008360040154826000015461201c91906156b2565b612026919061573b565b8160010181905550670de0b6b3a76400008260020154826000015461204b91906156b2565b612055919061573b565b8160020181905550876120666138f4565b73ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15866040516120ab91906143b9565b60405180910390a3505050505060018081905550505050565b6120cc61360e565b60016120d784613192565b146120e157600080fd5b80156120f0576120ef611d1b565b5b61214560248481548110612107576121066151c7565b5b9060005260206000209060080201600001546024858154811061212d5761212c6151c7565b5b906000526020600020906008020160020154846138fc565b816024848154811061215a576121596151c7565b5b906000526020600020906008020160020181905550826121786138f4565b73ffffffffffffffffffffffffffffffffffffffff167f676fc8e0b2147454e2b4a5c4c7c51f4a3c1d7cc2841c8c2d864e22044fb9b60c846040516121bd91906143b9565b60405180910390a3505050565b600080602484815481106121e1576121e06151c7565b5b90600052602060002090600802019050600060258581548110612207576122066151c7565b5b9060005260206000209060050201905060006027600087815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600083600401549050600083600201549050600061228889612e92565b905085600301544311801561229e575060008114155b1561233d5760006122b3876003015443613bb1565b905060006122cb8289600001548a6002015486613bc7565b905060008760000154836122df91906156b2565b905083670de0b6b3a7640000836122f691906156b2565b612300919061573b565b8661230b919061576c565b955083670de0b6b3a76400008261232291906156b2565b61232c919061573b565b85612337919061576c565b94505050505b8360020154670de0b6b3a764000083866000015461235b91906156b2565b612365919061573b565b61236f9190615858565b8460010154670de0b6b3a764000085876000015461238d91906156b2565b612397919061573b565b6123a19190615858565b6123ab919061576c565b965050505050505092915050565b6123c161360e565b6123cb6000613c8d565b565b600260015403612412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240990615425565b60405180910390fd5b60026001819055506024805490508210612461576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612458906157ec565b60405180910390fd5b600060248381548110612477576124766151c7565b5b9060005260206000209060080201905060006025848154811061249d5761249c6151c7565b5b9060005260206000209060050201905060006027600086815260200190815260200160002060006124cc6138f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050600184600001541480612528575060038460000154145b156125f7576060600260010185600001546005811061254a576125496151c7565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663472fcc3c888560000154846125966138f4565b6040518563ffffffff1660e01b81526004016125b5949392919061580c565b600060405180830381600087803b1580156125cf57600080fd5b505af11580156125e3573d6000803e3d6000fd5b5050505060008360000181905550506126f3565b60028460000154148061260e575060048460000154145b801561261b575060008551115b156126f257600260010184600001546005811061263b5761263a6151c7565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663472fcc3c876000886126846138f4565b6040518563ffffffff1660e01b81526004016126a394939291906158c7565b600060405180830381600087803b1580156126bd57600080fd5b505af11580156126d1573d6000803e3d6000fd5b50505050845190508082600001546126e99190615858565b82600001819055505b5b670de0b6b3a76400008460040154836000015461271091906156b2565b61271a919061573b565b8260010181905550670de0b6b3a76400008360020154836000015461273f91906156b2565b612749919061573b565b82600201819055508561275a6138f4565b73ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05958360405161279f91906143b9565b60405180910390a350505050600180819055505050565b6127be6142c2565b60086000016005806020026040519081016040528092919082600580156127fa576020028201915b8154815260200190600101908083116127e6575b5050505050905090565b6000806024838154811061281b5761281a6151c7565b5b906000526020600020906008020190508060060154915050919050565b61284061360e565b6002600101600360058110612858576128576151c7565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638843365183836040518363ffffffff1660e01b81526004016128b4929190615981565b600060405180830381600087803b1580156128ce57600080fd5b505af11580156128e2573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff166129056138f4565b73ffffffffffffffffffffffffffffffffffffffff167ff54df8624c3aff6b45434b440b18fa304db0941812089ac903463fd87f0464438360405161294a91906159b1565b60405180910390a35050565b6000806024838154811061296d5761296c6151c7565b5b906000526020600020906008020190508060050154915050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6027602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030160009054906101000a900460ff16905084565b612a0561360e565b60008251905060005b81811015612ab4576000602760008781526020019081526020016000206000868481518110612a4057612a3f6151c7565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050838160030160006101000a81548160ff021916908315150217905550508080612aac90615225565b915050612a0e565b5083612abe6138f4565b73ffffffffffffffffffffffffffffffffffffffff167faf423aef8da4914ec9cdc30bbf5043b40c26b577d58167899b89f33551dcbc798585604051612b05929190615a6a565b60405180910390a350505050565b600260015403612b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4f90615425565b60405180910390fd5b60026001819055506024805490508310612ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9e906157ec565b60405180910390fd5b612bb083611a5d565b612bc183612bbc6138f4565b613a38565b6000815190506000839050600060019050600060248781548110612be857612be76151c7565b5b90600052602060002090600802019050600060258881548110612c0e57612c0d6151c7565b5b906000526020600020906005020190506000602760008a81526020019081526020016000206000612c3d6138f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600183600001541480612c90575060038360000154145b8015612c9c5750600088115b80612cc65750600283600001541480612cb9575060048360000154145b8015612cc55750600086115b5b15612da3576002600101836000015460058110612ce657612ce56151c7565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663472fcc3c8a8a8a612d2e6138f4565b6040518563ffffffff1660e01b8152600401612d4d949392919061580c565b600060405180830381600087803b158015612d6757600080fd5b505af1158015612d7b573d6000803e3d6000fd5b50505050600283600001541480612d96575060048360000154145b15612da2578594508593505b5b612db4612dae6138f4565b8561394c565b848160000154612dc49190615858565b8160000181905550670de0b6b3a764000083600401548260000154612de991906156b2565b612df3919061573b565b8160010181905550670de0b6b3a764000082600201548260000154612e1891906156b2565b612e22919061573b565b816002018190555088612e336138f4565b73ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56887604051612e7891906143b9565b60405180910390a350505050505060018081905550505050565b60008060248381548110612ea957612ea86151c7565b5b906000526020600020906008020190506000806002600101836000015460058110612ed757612ed66151c7565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612fd0578260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231826040518263ffffffff1660e01b8152600401612f8c9190614d1b565b602060405180830381865afa158015612fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fcd9190615566565b91505b819350505050919050565b600260015403613020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301790615425565b60405180910390fd5b6002600181905550600260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f987a6d68484846130746138f4565b6040518563ffffffff1660e01b815260040161309394939291906154dc565b600060405180830381600087803b1580156130ad57600080fd5b505af11580156130c1573d6000803e3d6000fd5b505050506130d76130d06138f4565b835161394c565b60018081905550505050565b60286020528060005260406000206000915054906101000a900460ff1681565b61310b61360e565b801561311a57613119611d1b565b5b8160086000018460058110613132576131316151c7565b5b0181905550826131406138f4565b73ffffffffffffffffffffffffffffffffffffffff167f1d75b4af369dd9c67d43994eea5f98a89dcaa2d64156061ae12a4eaaeb43ff088460405161318591906143b9565b60405180910390a3505050565b600080602483815481106131a9576131a86151c7565b5b906000526020600020906008020190508060000154915050919050565b6131ce61360e565b80156131dd576131dc611d1b565b5b83602586815481106131f2576131f16151c7565b5b906000526020600020906005020160000181905550826025868154811061321c5761321b6151c7565b5b906000526020600020906005020160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081602586815481106132805761327f6151c7565b5b9060005260206000209060050201600301819055508461329e6138f4565b73ffffffffffffffffffffffffffffffffffffffff167fd94343f60e76b623b02085eb59ab6652ce661356ee9e83c7ec8dec5f132f5e378686866040516132e793929190615a9a565b60405180910390a35050505050565b6132fe61360e565b80600860160190600661331292919061423e565b5061331b6138f4565b73ffffffffffffffffffffffffffffffffffffffff167f1f18ca33186085569e344383527a8f8d45720960cfead887bf07b2d4a2f693b4826040516133609190614a02565b60405180910390a250565b6133736142a0565b60086016016006806020026040519081016040528092919082600680156133af576020028201915b81548152602001906001019080831161339b575b5050505050905090565b6133c16142c2565b60086005016005806020026040519081016040528092919082600580156133fd576020028201915b8154815260200190600101908083116133e9575b5050505050905090565b6000806027600080815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600080600190505b60068110156134a75760086010018160068110613484576134836151c7565b5b0154836000015410613494578091505b808061349f90615225565b915050613464565b508092505050919050565b6134ba61360e565b80602660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1661351a6138f4565b73ffffffffffffffffffffffffffffffffffffffff167f190c262dc6f09322c68a13bf67c9659e58367755ba6190fa7ce5ca8aa45a877d60405160405180910390a350565b61356761360e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036135d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135cd90615b43565b60405180910390fd5b6135df81613c8d565b50565b60028060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081565b6136166138f4565b73ffffffffffffffffffffffffffffffffffffffff1661363461298a565b73ffffffffffffffffffffffffffffffffffffffff161461368a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161368190615baf565b60405180910390fd5b565b6000869050600084111561369e578390505b6136aa866000836138fc565b6001602860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060246040518061010001604052808881526020018773ffffffffffffffffffffffffffffffffffffffff168152602001838152602001438152602001600081526020018681526020018581526020018481525090806001815401808255809150506001900390600052602060002090600802016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155505060256040518060a0016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081525090806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040155505050505050505050565b600033905090565b808260086005018560058110613915576139146151c7565b5b01546139219190615858565b61392b919061576c565b60086005018460058110613942576139416151c7565b5b0181905550505050565b600061395783610a15565b90506000811180156139b35750602960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613a3357613a3283602660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684846139eb91906156b2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16613d51909392919063ffffffff16565b5b505050565b600060248381548110613a4e57613a4d6151c7565b5b90600052602060002090600802019050600060258481548110613a7457613a736151c7565b5b9060005260206000209060050201905060006027600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001541115613baa5760008160010154670de0b6b3a764000085600401548460000154613b0991906156b2565b613b13919061573b565b613b1d9190615858565b905060008260020154670de0b6b3a764000085600201548560000154613b4391906156b2565b613b4d919061573b565b613b579190615858565b90506000821115613b6e57613b6d868389613dda565b5b6000811115613ba757613ba68460010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168783613f4f565b5b50505b5050505050565b60008282613bbf9190615858565b905092915050565b600080600090506001851480613bdd5750600385145b80613be85750600485145b15613c465760086005018560058110613c0457613c036151c7565b5b01548460086000018760058110613c1e57613c1d6151c7565b5b015488613c2b91906156b2565b613c3591906156b2565b613c3f919061573b565b9050613c81565b60028503613c80578260086000018660058110613c6657613c656151c7565b5b015487613c7391906156b2565b613c7d91906156b2565b90505b5b80915050949350505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613dd4846323b872dd60e01b858585604051602401613d7293929190615bcf565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613fc1565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b352c2a584846040518363ffffffff1660e01b8152600401613e35929190615528565b600060405180830381600087803b158015613e4f57600080fd5b505af1158015613e63573d6000803e3d6000fd5b505050506001613e7282613192565b1480613e8657506002613e8482613192565b145b15613f4a5760006103e883613e9b86856116d0565b613ea591906156b2565b613eaf919061573b565b90506000811115613f48577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f1985836040518363ffffffff1660e01b8152600401613f15929190615528565b600060405180830381600087803b158015613f2f57600080fd5b505af1158015613f43573d6000803e3d6000fd5b505050505b505b505050565b8273ffffffffffffffffffffffffffffffffffffffff1663b352c2a583836040518363ffffffff1660e01b8152600401613f8a929190615528565b600060405180830381600087803b158015613fa457600080fd5b505af1158015613fb8573d6000803e3d6000fd5b50505050505050565b6000614023826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166140889092919063ffffffff16565b905060008151111561408357808060200190518101906140439190615c1b565b614082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161407990615cba565b60405180910390fd5b5b505050565b606061409784846000856140a0565b90509392505050565b6060824710156140e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140dc90615d4c565b60405180910390fd5b6140ee856141b4565b61412d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161412490615db8565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516141569190615e1f565b60006040518083038185875af1925050503d8060008114614193576040519150601f19603f3d011682016040523d82523d6000602084013e614198565b606091505b50915091506141a88282866141d7565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606083156141e757829050614237565b6000835111156141fa5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161422e91906159b1565b60405180910390fd5b9392505050565b826006810192821561426d579160200282015b8281111561426c578251825591602001919060010190614251565b5b50905061427a91906142e4565b5090565b6040518060c00160405280600690602082028036833780820191505090505090565b6040518060c00160405280600690602082028036833780820191505090505090565b6040518060a00160405280600590602082028036833780820191505090505090565b5b808211156142fd5760008160009055506001016142e5565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061434082614315565b9050919050565b61435081614335565b811461435b57600080fd5b50565b60008135905061436d81614347565b92915050565b6000602082840312156143895761438861430b565b5b60006143978482850161435e565b91505092915050565b6000819050919050565b6143b3816143a0565b82525050565b60006020820190506143ce60008301846143aa565b92915050565b6143dd816143a0565b81146143e857600080fd5b50565b6000813590506143fa816143d4565b92915050565b6000602082840312156144165761441561430b565b5b6000614424848285016143eb565b91505092915050565b6000819050919050565b600061445261444d61444884614315565b61442d565b614315565b9050919050565b600061446482614437565b9050919050565b600061447682614459565b9050919050565b6144868161446b565b82525050565b6000610100820190506144a2600083018b6143aa565b6144af602083018a61447d565b6144bc60408301896143aa565b6144c960608301886143aa565b6144d660808301876143aa565b6144e360a08301866143aa565b6144f060c08301856143aa565b6144fd60e08301846143aa565b9998505050505050505050565b600061451582614335565b9050919050565b6145258161450a565b811461453057600080fd5b50565b6000813590506145428161451c565b92915050565b60008115159050919050565b61455d81614548565b811461456857600080fd5b50565b60008135905061457a81614554565b92915050565b6000806000606084860312156145995761459861430b565b5b60006145a7868287016143eb565b93505060206145b886828701614533565b92505060406145c98682870161456b565b9150509250925092565b600080604083850312156145ea576145e961430b565b5b60006145f88582860161435e565b92505060206146098582860161456b565b9150509250929050565b600061461e82614459565b9050919050565b61462e81614613565b82525050565b600060a08201905061464960008301886143aa565b6146566020830187614625565b61466360408301866143aa565b61467060608301856143aa565b61467d60808301846143aa565b9695505050505050565b600080600080600060a086880312156146a3576146a261430b565b5b60006146b188828901614533565b95505060206146c2888289016143eb565b94505060406146d3888289016143eb565b93505060606146e4888289016143eb565b92505060806146f58882890161456b565b9150509295509295909350565b60006020820190506147176000830184614625565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61476b82614722565b810181811067ffffffffffffffff8211171561478a57614789614733565b5b80604052505050565b600061479d614301565b90506147a98282614762565b919050565b600067ffffffffffffffff8211156147c9576147c8614733565b5b602082029050919050565b600080fd5b60006147ec6147e7846147ae565b614793565b90508060208402830185811115614806576148056147d4565b5b835b8181101561482f578061481b88826143eb565b845260208401935050602081019050614808565b5050509392505050565b600082601f83011261484e5761484d61471d565b5b600661485b8482856147d9565b91505092915050565b600060c0828403121561487a5761487961430b565b5b600061488884828501614839565b91505092915050565b600060069050919050565b600081905092915050565b6000819050919050565b6148ba81614335565b82525050565b60006148cc83836148b1565b60208301905092915050565b6000602082019050919050565b6148ee81614891565b6148f8818461489c565b9250614903826148a7565b8060005b8381101561493457815161491b87826148c0565b9650614926836148d8565b925050600181019050614907565b505050505050565b600060c08201905061495160008301846148e5565b92915050565b600060069050919050565b600081905092915050565b6000819050919050565b614980816143a0565b82525050565b60006149928383614977565b60208301905092915050565b6000602082019050919050565b6149b481614957565b6149be8184614962565b92506149c98261496d565b8060005b838110156149fa5781516149e18782614986565b96506149ec8361499e565b9250506001810190506149cd565b505050505050565b600060c082019050614a1760008301846149ab565b92915050565b60008060408385031215614a3457614a3361430b565b5b6000614a42858286016143eb565b9250506020614a538582860161435e565b9150509250929050565b614a6681614548565b82525050565b6000602082019050614a816000830184614a5d565b92915050565b6000614a9282614459565b9050919050565b614aa281614a87565b82525050565b6000602082019050614abd6000830184614a99565b92915050565b600080600080600060a08688031215614adf57614ade61430b565b5b6000614aed888289016143eb565b9550506020614afe888289016143eb565b9450506040614b0f888289016143eb565b9350506060614b20888289016143eb565b9250506080614b318882890161456b565b9150509295509295909350565b600067ffffffffffffffff821115614b5957614b58614733565b5b602082029050602081019050919050565b6000614b7d614b7884614b3e565b614793565b90508083825260208201905060208402830185811115614ba057614b9f6147d4565b5b835b81811015614bc95780614bb588826143eb565b845260208401935050602081019050614ba2565b5050509392505050565b600082601f830112614be857614be761471d565b5b8135614bf8848260208601614b6a565b91505092915050565b600080600060608486031215614c1a57614c1961430b565b5b6000614c288682870161435e565b935050602084013567ffffffffffffffff811115614c4957614c48614310565b5b614c5586828701614bd3565b9250506040614c66868287016143eb565b9150509250925092565b60008060408385031215614c8757614c8661430b565b5b6000614c958582860161435e565b9250506020614ca6858286016143eb565b9150509250929050565b60008060408385031215614cc757614cc661430b565b5b6000614cd5858286016143eb565b925050602083013567ffffffffffffffff811115614cf657614cf5614310565b5b614d0285828601614bd3565b9150509250929050565b614d1581614335565b82525050565b6000602082019050614d306000830184614d0c565b92915050565b600080600060608486031215614d4f57614d4e61430b565b5b6000614d5d868287016143eb565b9350506020614d6e868287016143eb565b925050604084013567ffffffffffffffff811115614d8f57614d8e614310565b5b614d9b86828701614bd3565b9150509250925092565b600080600060608486031215614dbe57614dbd61430b565b5b6000614dcc868287016143eb565b9350506020614ddd868287016143eb565b9250506040614dee8682870161456b565b9150509250925092565b600060059050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b614e2e81614df8565b614e388184614e03565b9250614e4382614e0e565b8060005b83811015614e74578151614e5b8782614986565b9650614e6683614e18565b925050600181019050614e47565b505050505050565b600060a082019050614e916000830184614e25565b92915050565b600080fd5b600067ffffffffffffffff821115614eb757614eb6614733565b5b614ec082614722565b9050602081019050919050565b82818337600083830152505050565b6000614eef614eea84614e9c565b614793565b905082815260208101848484011115614f0b57614f0a614e97565b5b614f16848285614ecd565b509392505050565b600082601f830112614f3357614f3261471d565b5b8135614f43848260208601614edc565b91505092915050565b60008060408385031215614f6357614f6261430b565b5b6000614f718582860161435e565b925050602083013567ffffffffffffffff811115614f9257614f91614310565b5b614f9e85828601614f1e565b9150509250929050565b6000608082019050614fbd60008301876143aa565b614fca60208301866143aa565b614fd760408301856143aa565b614fe46060830184614a5d565b95945050505050565b600067ffffffffffffffff82111561500857615007614733565b5b602082029050602081019050919050565b600061502c61502784614fed565b614793565b9050808382526020820190506020840283018581111561504f5761504e6147d4565b5b835b818110156150785780615064888261435e565b845260208401935050602081019050615051565b5050509392505050565b600082601f8301126150975761509661471d565b5b81356150a7848260208601615019565b91505092915050565b6000806000606084860312156150c9576150c861430b565b5b60006150d7868287016143eb565b935050602084013567ffffffffffffffff8111156150f8576150f7614310565b5b61510486828701615082565b92505060406151158682870161456b565b9150509250925092565b6000602082840312156151355761513461430b565b5b600061514384828501614533565b91505092915050565b600080600080600060a086880312156151685761516761430b565b5b6000615176888289016143eb565b9550506020615187888289016143eb565b94505060406151988882890161435e565b93505060606151a9888289016143eb565b92505060806151ba8882890161456b565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615230826143a0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615262576152616151f6565b5b600182019050919050565b600082825260208201905092915050565b7f4120706f6f6c20666f72207468697320746f6b656e20616c726561647920657860008201527f6973740000000000000000000000000000000000000000000000000000000000602082015250565b60006152da60238361526d565b91506152e58261527e565b604082019050919050565b60006020820190508181036000830152615309816152cd565b9050919050565b600060608201905061532560008301866143aa565b61533260208301856143aa565b61533f60408301846143aa565b949350505050565b7f436f6e74726163742063616e2774206265206368616e67656420666f7220736560008201527f63757269747920726561736f6e73000000000000000000000000000000000000602082015250565b60006153a3602e8361526d565b91506153ae82615347565b604082019050919050565b600060208201905081810360008301526153d281615396565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061540f601f8361526d565b915061541a826153d9565b602082019050919050565b6000602082019050818103600083015261543e81615402565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000602082019050919050565b600061548982615445565b6154938185615450565b935061549e83615461565b8060005b838110156154cf5781516154b68882614986565b97506154c183615471565b9250506001810190506154a2565b5085935050505092915050565b60006080820190506154f16000830187614d0c565b8181036020830152615503818661547e565b905061551260408301856143aa565b61551f6060830184614d0c565b95945050505050565b600060408201905061553d6000830185614d0c565b61554a60208301846143aa565b9392505050565b600081519050615560816143d4565b92915050565b60006020828403121561557c5761557b61430b565b5b600061558a84828501615551565b91505092915050565b7f4c696d6974656420746f203530204e465420706572207769746864726177207460008201527f7800000000000000000000000000000000000000000000000000000000000000602082015250565b60006155ef60218361526d565b91506155fa82615593565b604082019050919050565b6000602082019050818103600083015261561e816155e2565b9050919050565b600060408201905061563a60008301856143aa565b61564760208301846143aa565b9392505050565b60008151905061565d81614347565b92915050565b6000602082840312156156795761567861430b565b5b60006156878482850161564e565b91505092915050565b600060208201905081810360008301526156aa818461547e565b905092915050565b60006156bd826143a0565b91506156c8836143a0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615701576157006151f6565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615746826143a0565b9150615751836143a0565b9250826157615761576061570c565b5b828204905092915050565b6000615777826143a0565b9150615782836143a0565b925082820190508082111561579a576157996151f6565b5b92915050565b7f496e76616c696420706f6f6c2049640000000000000000000000000000000000600082015250565b60006157d6600f8361526d565b91506157e1826157a0565b602082019050919050565b60006020820190508181036000830152615805816157c9565b9050919050565b600060808201905061582160008301876143aa565b61582e60208301866143aa565b8181036040830152615840818561547e565b905061584f6060830184614d0c565b95945050505050565b6000615863826143a0565b915061586e836143a0565b9250828203905081811115615886576158856151f6565b5b92915050565b6000819050919050565b60006158b16158ac6158a78461588c565b61442d565b6143a0565b9050919050565b6158c181615896565b82525050565b60006080820190506158dc60008301876143aa565b6158e960208301866158b8565b81810360408301526158fb818561547e565b905061590a6060830184614d0c565b95945050505050565b600081519050919050565b60005b8381101561593c578082015181840152602081019050615921565b60008484015250505050565b600061595382615913565b61595d818561526d565b935061596d81856020860161591e565b61597681614722565b840191505092915050565b60006040820190506159966000830185614d0c565b81810360208301526159a88184615948565b90509392505050565b600060208201905081810360008301526159cb8184615948565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000602082019050919050565b6000615a17826159d3565b615a2181856159de565b9350615a2c836159ef565b8060005b83811015615a5d578151615a4488826148c0565b9750615a4f836159ff565b925050600181019050615a30565b5085935050505092915050565b60006040820190508181036000830152615a848185615a0c565b9050615a936020830184614a5d565b9392505050565b6000606082019050615aaf60008301866143aa565b615abc6020830185614d0c565b615ac960408301846143aa565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615b2d60268361526d565b9150615b3882615ad1565b604082019050919050565b60006020820190508181036000830152615b5c81615b20565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615b9960208361526d565b9150615ba482615b63565b602082019050919050565b60006020820190508181036000830152615bc881615b8c565b9050919050565b6000606082019050615be46000830186614d0c565b615bf16020830185614d0c565b615bfe60408301846143aa565b949350505050565b600081519050615c1581614554565b92915050565b600060208284031215615c3157615c3061430b565b5b6000615c3f84828501615c06565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000615ca4602a8361526d565b9150615caf82615c48565b604082019050919050565b60006020820190508181036000830152615cd381615c97565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615d3660268361526d565b9150615d4182615cda565b604082019050919050565b60006020820190508181036000830152615d6581615d29565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615da2601d8361526d565b9150615dad82615d6c565b602082019050919050565b60006020820190508181036000830152615dd181615d95565b9050919050565b600081519050919050565b600081905092915050565b6000615df982615dd8565b615e038185615de3565b9350615e1381856020860161591e565b80840191505092915050565b6000615e2b8284615dee565b91508190509291505056fea264697066735822122082231f706655e0c56b3e94ad945f784f806092c81f6a13e2670d578ec002b73f64736f6c63430008100033000000000000000000000000d5f8092aaebce73e755ac2e03c37be70d0447b8d0000000000000000000000006fc4b53e8627ac5c4958297536e590798691f111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a9681f11b0538000000000000000000000000000000000000000000000000000003d0dd5276d00000000000000000000000000000000000000000000000000002212018d1e420000000000000000000000000000000000000000000000000000110900c68f210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d5673a21ec2606a8d3bd8498a9c62a6a0fdcebd000000000000000000000000d0f46d11d4a4e85961bd0a24769bb577b4d38ec7000000000000000000000000e5597249a8c429ff7d2e5515f55ac75a551c962600000000000000000000000075aeea69ba755704f37f0ee68fd05e739ea664070000000000000000000000007e6c5ce1c6ca8d203c9815c12692dfeb3cf9abf1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b1ae4d6e2ef5000000000000000000000000000000000000000000000000000878678326eac90000000000000000000000000000000000000000000000000021e19e0c9bab2400000000000000000000000000000000000000000000000000a968163f0a57b400000000000000000000000000000000000000000000000001fc3842bd1f071c0000000000000000000000000000000000000000000000000000029a2241af62c000000000000000000000000000000000000000000000000000022b1c8c1227a00000000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000000000000000000000000000014d1120d7b1600000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000006f05b59d3b20000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d5f8092aaebce73e755ac2e03c37be70d0447b8d0000000000000000000000006fc4b53e8627ac5c4958297536e590798691f111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a9681f11b0538000000000000000000000000000000000000000000000000000003d0dd5276d00000000000000000000000000000000000000000000000000002212018d1e420000000000000000000000000000000000000000000000000000110900c68f210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d5673a21ec2606a8d3bd8498a9c62a6a0fdcebd000000000000000000000000d0f46d11d4a4e85961bd0a24769bb577b4d38ec7000000000000000000000000e5597249a8c429ff7d2e5515f55ac75a551c962600000000000000000000000075aeea69ba755704f37f0ee68fd05e739ea664070000000000000000000000007e6c5ce1c6ca8d203c9815c12692dfeb3cf9abf1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b1ae4d6e2ef5000000000000000000000000000000000000000000000000000878678326eac90000000000000000000000000000000000000000000000000021e19e0c9bab2400000000000000000000000000000000000000000000000000a968163f0a57b400000000000000000000000000000000000000000000000001fc3842bd1f071c0000000000000000000000000000000000000000000000000000029a2241af62c000000000000000000000000000000000000000000000000000022b1c8c1227a00000000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000000000000000000000000000014d1120d7b1600000000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000006f05b59d3b20000
-----Decoded View---------------
Arg [0] : _nfc (address): 0xd5f8092aaebce73e755ac2e03c37be70d0447b8d
Arg [1] : _nfcStore (address): 0x6fc4b53e8627ac5c4958297536e590798691f111
Arg [2] : _nfcPerBlock (uint256[5]): 0,191798941790000000,67129620000000,9589947080000000,4794973540000000
Arg [3] : _sbt (address[6]): 0x0000000000000000000000000000000000000000,0x9d5673a21ec2606a8d3bd8498a9c62a6a0fdcebd,0xd0f46d11d4a4e85961bd0a24769bb577b4d38ec7,0xe5597249a8c429ff7d2e5515f55ac75a551c9626,0x75aeea69ba755704f37f0ee68fd05e739ea66407,0x7e6c5ce1c6ca8d203c9815c12692dfeb3cf9abf1
Arg [4] : _requiredAmountTier (uint256[6]): 0,500000000000000000000,2500000000000000000000,10000000000000000000000,50000000000000000000000,150000000000000000000000
Arg [5] : _feeAmountTier (uint256[6]): 3000000000000000000,2500000000000000000,2000000000000000000,1500000000000000000,1000000000000000000,500000000000000000
-----Encoded View---------------
25 Constructor Arguments found :
Arg [0] : 000000000000000000000000d5f8092aaebce73e755ac2e03c37be70d0447b8d
Arg [1] : 0000000000000000000000006fc4b53e8627ac5c4958297536e590798691f111
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 00000000000000000000000000000000000000000000000002a9681f11b05380
Arg [4] : 00000000000000000000000000000000000000000000000000003d0dd5276d00
Arg [5] : 000000000000000000000000000000000000000000000000002212018d1e4200
Arg [6] : 00000000000000000000000000000000000000000000000000110900c68f2100
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000009d5673a21ec2606a8d3bd8498a9c62a6a0fdcebd
Arg [9] : 000000000000000000000000d0f46d11d4a4e85961bd0a24769bb577b4d38ec7
Arg [10] : 000000000000000000000000e5597249a8c429ff7d2e5515f55ac75a551c9626
Arg [11] : 00000000000000000000000075aeea69ba755704f37f0ee68fd05e739ea66407
Arg [12] : 0000000000000000000000007e6c5ce1c6ca8d203c9815c12692dfeb3cf9abf1
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [14] : 00000000000000000000000000000000000000000000001b1ae4d6e2ef500000
Arg [15] : 0000000000000000000000000000000000000000000000878678326eac900000
Arg [16] : 00000000000000000000000000000000000000000000021e19e0c9bab2400000
Arg [17] : 000000000000000000000000000000000000000000000a968163f0a57b400000
Arg [18] : 000000000000000000000000000000000000000000001fc3842bd1f071c00000
Arg [19] : 00000000000000000000000000000000000000000000000029a2241af62c0000
Arg [20] : 00000000000000000000000000000000000000000000000022b1c8c1227a0000
Arg [21] : 0000000000000000000000000000000000000000000000001bc16d674ec80000
Arg [22] : 00000000000000000000000000000000000000000000000014d1120d7b160000
Arg [23] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [24] : 00000000000000000000000000000000000000000000000006f05b59d3b20000
Deployed ByteCode Sourcemap
32810:28168:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39142:393;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42284:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40939:173;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35974:26;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;43610:317;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48877:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36007:28;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;43976:441;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35861:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49170:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41429:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41301:120;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40377:203;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49776:356;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40192:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50201:347;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35824:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44962:677;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56809:268;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56116:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36241:55;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47002:792;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50939:1290;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40588:174;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36042:68;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50683:180;;;:::i;:::-;;52359:1118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44479:405;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42387:1109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5535:103;;;:::i;:::-;;54870:1172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41535:114;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41120:173;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48272:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40770:161;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4887:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36119:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;45757:426;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53554:1226;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39704:419;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56492:266;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36190:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47945:273;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39543:153;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46295:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49444:191;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41787:110;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41657:122;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41909:367;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48584:150;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5793:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35905:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39142:393;39198:7;39218:21;39242:8;:11;39251:1;39242:11;;;;;;;;;;;:18;39254:5;39242:18;;;;;;;;;;;;;;;39218:42;;39271:15;39289:4;:14;;39304:1;39289:17;;;;;;;:::i;:::-;;;;39271:35;;39322:9;39334:1;39322:13;;39317:186;39341:26;39337:1;:30;39317:186;;;39407:4;:19;;39427:1;39407:22;;;;;;;:::i;:::-;;;;39392:4;:11;;;:37;39389:103;;39459:4;:14;;39474:1;39459:17;;;;;;;:::i;:::-;;;;39449:27;;39389:103;39369:3;;;;;:::i;:::-;;;;39317:186;;;;39520:7;39513:14;;;;39142:393;;;:::o;42284:95::-;42329:7;42356:8;:15;;;;42349:22;;42284:95;:::o;40939:173::-;41008:7;41028:21;41052:8;41061:4;41052:14;;;;;;;;:::i;:::-;;;;;;;;;;;;41028:38;;41084:4;:20;;;41077:27;;;40939:173;;;:::o;35974:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43610:317::-;4773:13;:11;:13::i;:::-;43725:12:::1;39012:5;38981:36;;:13;:27;38995:12;38981:27;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;38973:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;43754:11:::2;43750:34;;;43767:17;:15;:17::i;:::-;43750:34;43795:46;43803:11;43816:1;43819:12;43833:1;43836::::0;43839::::2;43795:7;:46::i;:::-;43892:12;43857:62;;43870:12;:10;:12::i;:::-;43857:62;;;43907:11;43857:62;;;;;;:::i;:::-;;;;;;;;4797:1:::1;43610:317:::0;;;:::o;48877:210::-;4773:13;:11;:13::i;:::-;49005:5:::1;48969:23;:33;48993:8;48969:33;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;49063:8;49026:53;;49049:12;:10;:12::i;:::-;49026:53;;;49073:5;49026:53;;;;;;:::i;:::-;;;;;;;;48877:210:::0;;:::o;36007:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43976:441::-;4773:13;:11;:13::i;:::-;44145:12:::1;39012:5;38981:36;;:13;:27;38995:12;38981:27;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;38973:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;44174:11:::2;44170:34;;;44187:17;:15;:17::i;:::-;44170:34;44215:78;44223:1;44226;44229:12;44243:13;44258:16;44276;44215:7;:78::i;:::-;44344:12;44309:100;;44322:12;:10;:12::i;:::-;44309:100;;;44359:13;44374:16;44392;44309:100;;;;;;;;:::i;:::-;;;;;;;;4797:1:::1;43976:441:::0;;;;;:::o;35861:35::-;;;:::o;49170:221::-;4773:13;:11;:13::i;:::-;49292:19:::1;49270:4;:19;;:41;;;;;;;:::i;:::-;;49349:12;:10;:12::i;:::-;49327:56;;;49363:19;49327:56;;;;;;:::i;:::-;;;;;;;;49170:221:::0;:::o;41429:98::-;41474:17;;:::i;:::-;41511:4;:8;;41504:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41429:98;:::o;41301:120::-;41357:17;;:::i;:::-;41394:4;:19;;41387:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41301:120;:::o;40377:203::-;40463:4;40480:21;40504:8;:14;40513:4;40504:14;;;;;;;;;;;:21;40519:5;40504:21;;;;;;;;;;;;;;;40480:45;;40543:4;:29;;;;;;;;;;;;40536:36;;;40377:203;;;;:::o;49776:356::-;4773:13;:11;:13::i;:::-;49926:1:::1;49881:47;;:15;:33;;;;;;;;;;;;:47;;;49873:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;50026:19;49990:15;:33;;;:55;;;;;;;;;;;;;;;;;;50090:12;:10;:12::i;:::-;50061:63;;;50104:19;50061:63;;;;;;:::i;:::-;;;;;;;;49776:356:::0;:::o;40192:177::-;40267:7;40287:21;40311:8;:14;40320:4;40311:14;;;;;;;;;;;:21;40326:5;40311:21;;;;;;;;;;;;;;;40287:45;;40350:4;:11;;;40343:18;;;40192:177;;;;:::o;50201:347::-;4773:13;:11;:13::i;:::-;50352:1:::1;50305:49;;:15;:28;;50334:5;50305:35;;;;;;;:::i;:::-;;;;;;;;;;;;;:49;;;50297:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;50454:16;50416:15;:28;;50445:5;50416:35;;;;;;;:::i;:::-;;;;:54;;;;;;;;;;;;;;;;;;50516:5;50502:12;:10;:12::i;:::-;50486:54;;;50523:16;50486:54;;;;;;:::i;:::-;;;;;;;;50201:347:::0;;:::o;35824:30::-;;;:::o;44962:677::-;4773:13;:11;:13::i;:::-;45154:1:::1;45133:17;45145:4;45133:11;:17::i;:::-;:22;45125:31;;;::::0;::::1;;45171:11;45167:34;;;45184:17;:15;:17::i;:::-;45167:34;45212:90;45236:8;45245:4;45236:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:23;;;45261:8;45270:4;45261:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:25;;;45288:13;45212:23;:90::i;:::-;45341:13;45313:8;45322:4;45313:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:25;;:41;;;;45395:13;45365:8;45374:4;45365:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:27;;:43;;;;45452:16;45419:8;45428:4;45419:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:30;;:49;;;;45512:16;45479:8;45488:4;45479:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:30;;:49;;;;45575:4;45561:12;:10;:12::i;:::-;45544:87;;;45581:13;45596:16;45614;45544:87;;;;;;;;:::i;:::-;;;;;;;;44962:677:::0;;;;;:::o;56809:268::-;1812:1;2410:7;;:19;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;56937:15:::1;:33;;;;;;;;;;;;56918:65;;;56984:4;56990:9;57001:4;57007:12;:10;:12::i;:::-;56918:102;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;57031:38;57038:12;:10;:12::i;:::-;57052:9;:16;57031:6;:38::i;:::-;1768:1:::0;2722:7;:22;;;;56809:268;;;:::o;56116:256::-;56187:7;56256:1;56211:47;;:15;:33;;;;;;;;;;;;:47;;;56207:61;;56267:1;56260:8;;;;56207:61;56305:15;:33;;;;;;;;;;;;56286:62;;;56349:8;56359:4;56286:78;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56279:85;;56116:256;;;;;:::o;36241:55::-;;;;;;;;;;;;;;;;;;;;;;:::o;47002:792::-;4773:13;:11;:13::i;:::-;47098:18:::1;47119:9;:16;47098:37;;47146:21;47170:8;47179:4;47170:14;;;;;;;;:::i;:::-;;;;;;;;;;;;47146:38;;47220:1;47203:4;:13;;;:18;47195:27;;;::::0;::::1;;47255:2;47241:10;:16;;47233:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;47306:16;47317:4;47306:10;:16::i;:::-;47338:9;47333:379;47357:10;47353:1;:14;47333:379;;;47389:14;47423:15;:28;;47452:1;47423:31;;;;;;;:::i;:::-;;;;;;;;;;;;;47406:67;;;47474:4;47480:9;47490:1;47480:12;;;;;;;;:::i;:::-;;;;;;;;47406:87;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47389:104;;47508:21;47532:8;:14;47541:4;47532:14;;;;;;;;;;;:22;47547:6;47532:22;;;;;;;;;;;;;;;47508:46;;47569:28;47584:4;47590:6;47569:14;:28::i;:::-;47626:1;47612:4;:11;;:15;;;;47660:1;47642:4;:15;;:19;;;;47699:1;47676:4;:20;;:24;;;;47374:338;;47369:3;;;;;:::i;:::-;;;;47333:379;;;;47766:4;47752:12;:10;:12::i;:::-;47737:45;;;47772:9;47737:45;;;;;;:::i;:::-;;;;;;;;47087:707;;47002:792:::0;;:::o;50939:1290::-;50991:21;51015:8;51024:4;51015:14;;;;;;;;:::i;:::-;;;;;;;;;;;;50991:38;;51040:23;51066:9;51076:4;51066:15;;;;;;;;:::i;:::-;;;;;;;;;;;;51040:41;;51112:4;:20;;;51096:12;:36;51092:75;;51149:7;;;;51092:75;51177:25;51205:26;51226:4;51205:20;:26::i;:::-;51177:54;;51267:1;51246:17;:22;:46;;;;51291:1;51272:4;:15;;;:20;51246:46;51242:135;;;51332:12;51309:4;:20;;:35;;;;51359:7;;;;;51242:135;51387:18;51408:49;51422:4;:20;;;51444:12;51408:13;:49::i;:::-;51387:70;;51468:17;51488:75;51501:10;51513:4;:13;;;51528:4;:15;;;51545:17;51488:12;:75::i;:::-;51468:95;;51574:3;:8;;;51591;51602:9;51574:38;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51683:17;51678:4;51668:9;:14;;;;:::i;:::-;:32;;;;:::i;:::-;51645:4;:19;;;:56;;;;:::i;:::-;51623:4;:19;;:78;;;;51741:22;51779:5;:22;;;51766:10;:35;;;;:::i;:::-;51741:60;;51906:5;:26;;;51889:14;51858:5;:28;;;:45;;;;:::i;:::-;:74;51855:319;;;52025:17;52020:4;52005:14;:19;;;;:::i;:::-;:37;;;;:::i;:::-;51976:5;:25;;;:67;;;;:::i;:::-;51948:5;:25;;:95;;;;52090:14;52058:5;:28;;;:46;;;;;;;:::i;:::-;;;;;;;;51855:319;;;52161:1;52136:5;:22;;:26;;;;51855:319;52209:12;52186:4;:20;;:35;;;;50980:1249;;;;;;50939:1290;;:::o;40588:174::-;40653:7;40673:21;40697:8;40706:4;40697:14;;;;;;;;:::i;:::-;;;;;;;;;;;;40673:38;;40737:4;:16;;;;;;;;;;;;40722:32;;;40588:174;;;:::o;36042:68::-;;;;;;;;;;;;;:::o;50683:180::-;50728:14;50745:8;:15;;;;50728:32;;50776:11;50771:85;50799:6;50793:3;:12;50771:85;;;50829:15;50840:3;50829:10;:15::i;:::-;50807:5;;;;:::i;:::-;;;50771:85;;;;50717:146;50683:180::o;52359:1118::-;1812:1;2410:7;;:19;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;52484:8:::1;:15;;;;52477:4;:22;52468:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;52530:16;52541:4;52530:10;:16::i;:::-;52557:34;52572:4;52578:12;:10;:12::i;:::-;52557:14;:34::i;:::-;52602:18;52623:9;:16;52602:37;;52650:14;52667:7;52650:24;;52685:21;52709:8;52718:4;52709:14;;;;;;;;:::i;:::-;;;;;;;;;;;;52685:38;;52734:23;52760:9;52770:4;52760:15;;;;;;;;:::i;:::-;;;;;;;;;;;;52734:41;;52786:21;52810:8;:14;52819:4;52810:14;;;;;;;;;;;:28;52825:12;:10;:12::i;:::-;52810:28;;;;;;;;;;;;;;;52786:52;;52872:1;52855:4;:13;;;:18;:40;;;;52894:1;52877:4;:13;;;:18;52855:40;52854:57;;;;;52910:1;52900:7;:11;52854:57;52853:125;;;;52935:1;52918:4;:13;;;:18;:40;;;;52957:1;52940:4;:13;;;:18;52918:40;52917:60;;;;;52976:1;52963:10;:14;52917:60;52853:125;52849:350;;;53015:15;:28;;53044:4;:13;;;53015:43;;;;;;;:::i;:::-;;;;;;;;;;;;;52994:73;;;53068:4;53074:7;53083:9;53094:12;:10;:12::i;:::-;52994:113;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;53143:1;53126:4;:13;;;:18;:40;;;;53165:1;53148:4;:13;;;:18;53126:40;53122:65;;;53177:10;53168:19;;53122:65;52849:350;53209:23;53216:12;:10;:12::i;:::-;53230:1;53209:6;:23::i;:::-;53271:6;53257:4;:11;;;:20;;;;:::i;:::-;53243:4;:11;;:34;;;;53338:4;53318;:19;;;53306:4;:11;;;:31;;;;:::i;:::-;:36;;;;:::i;:::-;53288:4;:15;;:54;;;;53414:4;53388:5;:25;;;53376:4;:11;;;:37;;;;:::i;:::-;:42;;;;:::i;:::-;53353:4;:20;;:65;;;;53456:4;53442:12;:10;:12::i;:::-;53434:35;;;53462:6;53434:35;;;;;;:::i;:::-;;;;;;;;52457:1020;;;;;1768:1:::0;2722:7;:22;;;;52359:1118;;;:::o;44479:405::-;4773:13;:11;:13::i;:::-;44618:1:::1;44597:17;44609:4;44597:11;:17::i;:::-;:22;44589:31;;;::::0;::::1;;44635:11;44631:34;;;44648:17;:15;:17::i;:::-;44631:34;44676:88;44700:8;44709:4;44700:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:23;;;44725:8;44734:4;44725:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:25;;;44752:11;44676:23;:88::i;:::-;44803:11;44775:8;44784:4;44775:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:25;;:39;;;;44858:4;44844:12;:10;:12::i;:::-;44830:46;;;44864:11;44830:46;;;;;;:::i;:::-;;;;;;;;44479:405:::0;;;:::o;42387:1109::-;42459:7;42479:21;42503:8;42512:4;42503:14;;;;;;;;:::i;:::-;;;;;;;;;;;;42479:38;;42528:23;42554:9;42564:4;42554:15;;;;;;;;:::i;:::-;;;;;;;;;;;;42528:41;;42580:21;42604:8;:14;42613:4;42604:14;;;;;;;;;;;:21;42619:5;42604:21;;;;;;;;;;;;;;;42580:45;;42636:22;42661:4;:19;;;42636:44;;42691:27;42721:5;:25;;;42691:55;;42757:25;42785:26;42806:4;42785:20;:26::i;:::-;42757:54;;42841:4;:20;;;42826:12;:35;:61;;;;;42886:1;42865:17;:22;;42826:61;42822:530;;;42904:18;42925:49;42939:4;:20;;;42961:12;42925:13;:49::i;:::-;42904:70;;42989:17;43009:75;43022:10;43034:4;:13;;;43049:4;:15;;;43066:17;43009:12;:75::i;:::-;42989:95;;43099:22;43137:5;:22;;;43124:10;:35;;;;:::i;:::-;43099:60;;43224:17;43219:4;43209:9;:14;;;;:::i;:::-;:32;;;;:::i;:::-;43191:14;:51;;;;:::i;:::-;43174:68;;43322:17;43317:4;43302:14;:19;;;;:::i;:::-;:37;;;;:::i;:::-;43279:19;:61;;;;:::i;:::-;43257:83;;42889:463;;;42822:530;43467:4;:20;;;43459:4;43439:19;43427:4;:11;;;:31;;;;:::i;:::-;:36;;;;:::i;:::-;43426:61;;;;:::i;:::-;43406:4;:15;;;43398:4;43383:14;43371:4;:11;;;:26;;;;:::i;:::-;:31;;;;:::i;:::-;43370:51;;;;:::i;:::-;43369:119;;;;:::i;:::-;43362:126;;;;;;;;42387:1109;;;;:::o;5535:103::-;4773:13;:11;:13::i;:::-;5600:30:::1;5627:1;5600:18;:30::i;:::-;5535:103::o:0;54870:1172::-;1812:1;2410:7;;:19;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;54988:8:::1;:15;;;;54981:4;:22;54972:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;55034:21;55058:8;55067:4;55058:14;;;;;;;;:::i;:::-;;;;;;;;;;;;55034:38;;55083:23;55109:9;55119:4;55109:15;;;;;;;;:::i;:::-;;;;;;;;;;;;55083:41;;55135:21;55159:8;:14;55168:4;55159:14;;;;;;;;;;;:28;55174:12;:10;:12::i;:::-;55159:28;;;;;;;;;;;;;;;55135:52;;55198:22;55223:4;:11;;;55198:36;;55266:1;55249:4;:13;;;:18;:40;;;;55288:1;55271:4;:13;;;:18;55249:40;55245:580;;;55305:27;55368:15;:28;;55397:4;:13;;;55368:43;;;;;;;:::i;:::-;;;;;;;;;;;;;55347:74;;;55422:4;55428;:11;;;55441:10;55453:12;:10;:12::i;:::-;55347:119;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;55495:1;55481:4;:11;;:15;;;;55290:218;55245:580;;;55536:1;55519:4;:13;;;:18;:40;;;;55558:1;55541:4;:13;;;:18;55519:40;55518:66;;;;;55583:1;55564:9;:16;:20;55518:66;55514:311;;;55621:15;:28;;55650:4;:13;;;55621:43;;;;;;;:::i;:::-;;;;;;;;;;;;;55600:74;;;55675:4;55681:1;55684:9;55695:12;:10;:12::i;:::-;55600:108;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;55740:9;:16;55723:33;;55799:14;55785:4;:11;;;:28;;;;:::i;:::-;55771:4;:11;;:42;;;;55514:311;55245:580;55885:4;55865;:19;;;55853:4;:11;;;:31;;;;:::i;:::-;:36;;;;:::i;:::-;55835:4;:15;;:54;;;;55961:4;55935:5;:25;;;55923:4;:11;;;:37;;;;:::i;:::-;:42;;;;:::i;:::-;55900:4;:20;;:65;;;;56013:4;55999:12;:10;:12::i;:::-;55981:53;;;56019:14;55981:53;;;;;;:::i;:::-;;;;;;;;54961:1081;;;;1768:1:::0;2722:7;:22;;;;54870:1172;;:::o;41535:114::-;41588:17;;:::i;:::-;41625:4;:16;;41618:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41535:114;:::o;41120:173::-;41189:7;41209:21;41233:8;41242:4;41233:14;;;;;;;;:::i;:::-;;;;;;;;;;;;41209:38;;41265:4;:20;;;41258:27;;;41120:173;;;:::o;48272:256::-;4773:13;:11;:13::i;:::-;48383:15:::1;:28;;48412:1;48383:31;;;;;;;:::i;:::-;;;;;;;;;;;;;48371:55;;;48427:12;48441:11;48371:82;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48494:12;48469:51;;48480:12;:10;:12::i;:::-;48469:51;;;48508:11;48469:51;;;;;;:::i;:::-;;;;;;;;48272:256:::0;;:::o;40770:161::-;40830:7;40850:21;40874:8;40883:4;40874:14;;;;;;;;:::i;:::-;;;;;;;;;;;;40850:38;;40906:4;:17;;;40899:24;;;40770:161;;;:::o;4887:87::-;4933:7;4960:6;;;;;;;;;;;4953:13;;4887:87;:::o;36119:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45757:426::-;4773:13;:11;:13::i;:::-;45875:15:::1;45893:6;:13;45875:31;;45922:9;45917:173;45941:7;45937:1;:11;45917:173;;;45970:21;45994:8;:14;46003:4;45994:14;;;;;;;;;;;:25;46009:6;46016:1;46009:9;;;;;;;;:::i;:::-;;;;;;;;45994:25;;;;;;;;;;;;;;;45970:49;;46066:12;46034:4;:29;;;:44;;;;;;;;;;;;;;;;;;45955:135;45950:3;;;;;:::i;:::-;;;;45917:173;;;;46148:4;46134:12;:10;:12::i;:::-;46113:62;;;46154:6;46162:12;46113:62;;;;;;;:::i;:::-;;;;;;;;45864:319;45757:426:::0;;;:::o;53554:1226::-;1812:1;2410:7;;:19;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;53680:8:::1;:15;;;;53673:4;:22;53664:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;53726:16;53737:4;53726:10;:16::i;:::-;53753:34;53768:4;53774:12;:10;:12::i;:::-;53753:14;:34::i;:::-;53798:18;53819:9;:16;53798:37;;53846:14;53863:7;53846:24;;53881:14;53898:1;53881:18;;53910:21;53934:8;53943:4;53934:14;;;;;;;;:::i;:::-;;;;;;;;;;;;53910:38;;53959:23;53985:9;53995:4;53985:15;;;;;;;;:::i;:::-;;;;;;;;;;;;53959:41;;54011:21;54035:8;:14;54044:4;54035:14;;;;;;;;;;;:28;54050:12;:10;:12::i;:::-;54035:28;;;;;;;;;;;;;;;54011:52;;54097:1;54080:4;:13;;;:18;:40;;;;54119:1;54102:4;:13;;;:18;54080:40;54079:57;;;;;54135:1;54125:7;:11;54079:57;54078:125;;;;54160:1;54143:4;:13;;;:18;:40;;;;54182:1;54165:4;:13;;;:18;54143:40;54142:60;;;;;54201:1;54188:10;:14;54142:60;54078:125;54074:422;;;54240:15;:28;;54269:4;:13;;;54240:43;;;;;;;:::i;:::-;;;;;;;;;;;;;54219:74;;;54294:4;54300:7;54309:9;54320:12;:10;:12::i;:::-;54219:114;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;54369:1;54352:4;:13;;;:18;:40;;;;54391:1;54374:4;:13;;;:18;54352:40;54348:137;;;54421:10;54412:19;;54459:10;54450:19;;54348:137;54074:422;54506:28;54513:12;:10;:12::i;:::-;54527:6;54506;:28::i;:::-;54573:6;54559:4;:11;;;:20;;;;:::i;:::-;54545:4;:11;;:34;;;;54640:4;54620;:19;;;54608:4;:11;;;:31;;;;:::i;:::-;:36;;;;:::i;:::-;54590:4;:15;;:54;;;;54716:4;54690:5;:25;;;54678:4;:11;;;:37;;;;:::i;:::-;:42;;;;:::i;:::-;54655:4;:20;;:65;;;;54759:4;54745:12;:10;:12::i;:::-;54736:36;;;54765:6;54736:36;;;;;;:::i;:::-;;;;;;;;53653:1127;;;;;;1768:1:::0;2722:7;:22;;;;53554:1226;;;:::o;39704:419::-;39769:7;39789:21;39813:8;39822:4;39813:14;;;;;;;;:::i;:::-;;;;;;;;;;;;39789:38;;39838:25;39878:23;39904:15;:28;;39933:4;:13;;;39904:43;;;;;;;:::i;:::-;;;;;;;;;;;;;39878:69;;39988:1;39961:29;;:15;:29;;;39958:123;;40026:4;:16;;;;;;;;;;;;:26;;;40053:15;40026:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40006:63;;39958:123;40098:17;40091:24;;;;;39704:419;;;:::o;56492:266::-;1812:1;2410:7;;:19;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;56619:15:::1;:33;;;;;;;;;;;;56600:64;;;56665:4;56671:9;56682:4;56688:12;:10;:12::i;:::-;56600:101;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;56712:38;56719:12;:10;:12::i;:::-;56733:9;:16;56712:6;:38::i;:::-;1768:1:::0;2722:7;:22;;;;56492:266;;;:::o;36190:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;47945:273::-;4773:13;:11;:13::i;:::-;48062:11:::1;48058:34;;;48075:17;:15;:17::i;:::-;48058:34;48129:12;48103:4;:16;;48120:5;48103:23;;;;;;;:::i;:::-;;;:38;;;;48190:5;48176:12;:10;:12::i;:::-;48157:53;;;48197:12;48157:53;;;;;;:::i;:::-;;;;;;;;47945:273:::0;;;:::o;39543:153::-;39599:7;39619:21;39643:8;39652:4;39643:14;;;;;;;;:::i;:::-;;;;;;;;;;;;39619:38;;39675:4;:13;;;39668:20;;;39543:153;;;:::o;46295:524::-;4773:13;:11;:13::i;:::-;46467:11:::1;46463:34;;;46480:17;:15;:17::i;:::-;46463:34;46543:17;46508:9;46518:4;46508:15;;;;;;;;:::i;:::-;;;;;;;;;;;;:32;;:52;;;;46615:16;46571:9;46581:4;46571:15;;;;;;;;:::i;:::-;;;;;;;;;;;;:31;;;:61;;;;;;;;;;;;;;;;;;46682:21;46643:9;46653:4;46643:15;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;:60;;;;46746:4;46732:12;:10;:12::i;:::-;46719:92;;;46752:17;46771:16;46789:21;46719:92;;;;;;;;:::i;:::-;;;;;;;;46295:524:::0;;;;;:::o;49444:191::-;4773:13;:11;:13::i;:::-;49551:14:::1;49534:4;:14;;:31;;;;;;;:::i;:::-;;49598:12;:10;:12::i;:::-;49581:46;;;49612:14;49581:46;;;;;;:::i;:::-;;;;;;;;49444:191:::0;:::o;41787:110::-;41838:17;;:::i;:::-;41875:4;:14;;41868:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41787:110;:::o;41657:122::-;41714:17;;:::i;:::-;41751:4;:20;;41744:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41657:122;:::o;41909:367::-;41968:7;41988:21;42012:8;:11;42021:1;42012:11;;;;;;;;;;;:18;42024:5;42012:18;;;;;;;;;;;;;;;41988:42;;42041:16;42077:9;42089:1;42077:13;;42072:171;42096:26;42092:1;:30;42072:171;;;42162:4;:19;;42182:1;42162:22;;;;;;;:::i;:::-;;;;42147:4;:11;;;:37;42144:88;;42215:1;42204:12;;42144:88;42124:3;;;;;:::i;:::-;;;;42072:171;;;;42260:8;42253:15;;;;41909:367;;;:::o;48584:150::-;4773:13;:11;:13::i;:::-;48665:9:::1;48654:8;;:20;;;;;;;;;;;;;;;;;;48716:9;48690:36;;48702:12;:10;:12::i;:::-;48690:36;;;;;;;;;;;;48584:150:::0;:::o;5793:201::-;4773:13;:11;:13::i;:::-;5902:1:::1;5882:22;;:8;:22;;::::0;5874:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5958:28;5977:8;5958:18;:28::i;:::-;5793:201:::0;:::o;35905:38::-;;;;;;;;;;;;;;;;;;:::o;5052:132::-;5127:12;:10;:12::i;:::-;5116:23;;:7;:5;:7::i;:::-;:23;;;5108:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5052:132::o;58469:1047::-;58643:18;58664:11;58643:32;;58706:1;58690:13;:17;58686:49;;;58722:13;58709:26;;58686:49;58746;58770:9;58781:1;58784:10;58746:23;:49::i;:::-;58836:4;58806:13;:27;58820:12;58806:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;58851:8;58865:354;;;;;;;;58900:9;58865:354;;;;58938:12;58865:354;;;;;;58978:10;58865:354;;;;59021:12;58865:354;;;;59065:1;58865:354;;;;59096:13;58865:354;;;;59142:16;58865:354;;;;59191:16;58865:354;;;58851:369;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59231:9;59246:261;;;;;;;;59290:1;59246:261;;;;59334:42;59246:261;;;;;;59414:1;59246:261;;;;59453:1;59246:261;;;;59494:1;59246:261;;;59231:277;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58632:884;58469:1047;;;;;;:::o;3438:98::-;3491:7;3518:10;3511:17;;3438:98;:::o;58251:187::-;58426:4;58419;58385;:20;;58406:9;58385:31;;;;;;;:::i;:::-;;;;:38;;;;:::i;:::-;:45;;;;:::i;:::-;58351:4;:20;;58372:9;58351:31;;;;;;;:::i;:::-;;;:79;;;;58251:187;;;:::o;57155:276::-;57222:11;57236:20;57247:8;57236:10;:20::i;:::-;57222:34;;57280:1;57274:3;:7;:45;;;;;57286:23;:33;57310:8;57286:33;;;;;;;;;;;;;;;;;;;;;;;;;57285:34;57274:45;57271:153;;;57335:77;57373:8;57391;;;;;;;;;;;57408:3;57402;:9;;;;:::i;:::-;57350:3;57335:37;;;;:77;;;;;;:::i;:::-;57271:153;57211:220;57155:276;;:::o;60273:702::-;60346:21;60370:8;60379:4;60370:14;;;;;;;;:::i;:::-;;;;;;;;;;;;60346:38;;60395:23;60421:9;60431:4;60421:15;;;;;;;;:::i;:::-;;;;;;;;;;;;60395:41;;60447:21;60471:8;:14;60480:4;60471:14;;;;;;;;;;;:21;60486:5;60471:21;;;;;;;;;;;;;;;60447:45;;60521:1;60507:4;:11;;;:15;60503:465;;;60539:15;60598:4;:15;;;60590:4;60570;:19;;;60558:4;:11;;;:31;;;;:::i;:::-;:36;;;;:::i;:::-;60557:56;;;;:::i;:::-;60539:74;;60628:20;60698:4;:20;;;60690:4;60664:5;:25;;;60652:4;:11;;;:37;;;;:::i;:::-;:42;;;;:::i;:::-;60651:67;;;;:::i;:::-;60628:90;;60747:1;60737:7;:11;60733:89;;;60769:37;60785:5;60792:7;60801:4;60769:15;:37::i;:::-;60733:89;60855:1;60840:12;:16;60836:121;;;60877:64;60898:5;:21;;;;;;;;;;;;60921:5;60928:12;60877:20;:64::i;:::-;60836:121;60524:444;;60503:465;60335:640;;;60273:702;;:::o;57507:120::-;57581:7;57614:5;57608:3;:11;;;;:::i;:::-;57601:18;;57507:120;;;;:::o;57665:535::-;57803:7;57823:17;57843:1;57823:21;;57871:1;57858:9;:14;:32;;;;57889:1;57876:9;:14;57858:32;:50;;;;57907:1;57894:9;:14;57858:50;57855:311;;;57998:4;:20;;58019:9;57998:31;;;;;;;:::i;:::-;;;;57980:15;57950:4;:16;;57967:9;57950:27;;;;;;;:::i;:::-;;;;57936:11;:41;;;;:::i;:::-;:59;;;;:::i;:::-;:93;;;;:::i;:::-;57924:105;;57855:311;;;58063:1;58050:9;:14;58046:120;;58136:18;58106:4;:16;;58123:9;58106:27;;;;;;;:::i;:::-;;;;58092:11;:41;;;;:::i;:::-;:62;;;;:::i;:::-;58080:74;;58046:120;57855:311;58183:9;58176:16;;;57665:535;;;;;;:::o;6154:191::-;6228:16;6247:6;;;;;;;;;;;6228:25;;6273:8;6264:6;;:17;;;;;;;;;;;;;;;;;;6328:8;6297:40;;6318:8;6297:40;;;;;;;;;;;;6217:128;6154:191;:::o;21082:248::-;21226:96;21246:5;21276:27;;;21305:4;21311:2;21315:5;21253:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21226:19;:96::i;:::-;21082:248;;;;:::o;59627:326::-;59716:8;:24;;;59741:3;59746:7;59716:38;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59789:1;59768:17;59780:4;59768:11;:17::i;:::-;:22;:48;;;;59815:1;59794:17;59806:4;59794:11;:17::i;:::-;:22;59768:48;59765:181;;;59832:13;59880:4;59870:7;59848:19;59857:3;59862:4;59848:8;:19::i;:::-;:29;;;;:::i;:::-;:36;;;;:::i;:::-;59832:52;;59911:1;59903:5;:9;59899:35;;;59914:3;:8;;;59923:3;59928:5;59914:20;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59899:35;59817:129;59765:181;59627:326;;;:::o;60080:152::-;60183:11;:27;;;60211:3;60216:7;60183:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60080:152;;;:::o;23930:716::-;24354:23;24380:69;24408:4;24380:69;;;;;;;;;;;;;;;;;24388:5;24380:27;;;;:69;;;;;:::i;:::-;24354:95;;24484:1;24464:10;:17;:21;24460:179;;;24561:10;24550:30;;;;;;;;;;;;:::i;:::-;24542:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;24460:179;24000:646;23930:716;;:::o;10330:229::-;10467:12;10499:52;10521:6;10529:4;10535:1;10538:12;10499:21;:52::i;:::-;10492:59;;10330:229;;;;;:::o;11450:510::-;11620:12;11678:5;11653:21;:30;;11645:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;11745:18;11756:6;11745:10;:18::i;:::-;11737:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;11811:12;11825:23;11852:6;:11;;11871:5;11878:4;11852:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11810:73;;;;11901:51;11918:7;11927:10;11939:12;11901:16;:51::i;:::-;11894:58;;;;11450:510;;;;;;:::o;7585:326::-;7645:4;7902:1;7880:7;:19;;;:23;7873:30;;7585:326;;;:::o;14136:762::-;14286:12;14315:7;14311:580;;;14346:10;14339:17;;;;14311:580;14480:1;14460:10;:17;:21;14456:424;;;14708:10;14702:17;14769:15;14756:10;14752:2;14748:19;14741:44;14456:424;14851:12;14844:20;;;;;;;;;;;:::i;:::-;;;;;;;;14136:762;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:222::-;1476:4;1514:2;1503:9;1499:18;1491:26;;1527:71;1595:1;1584:9;1580:17;1571:6;1527:71;:::i;:::-;1383:222;;;;:::o;1611:122::-;1684:24;1702:5;1684:24;:::i;:::-;1677:5;1674:35;1664:63;;1723:1;1720;1713:12;1664:63;1611:122;:::o;1739:139::-;1785:5;1823:6;1810:20;1801:29;;1839:33;1866:5;1839:33;:::i;:::-;1739:139;;;;:::o;1884:329::-;1943:6;1992:2;1980:9;1971:7;1967:23;1963:32;1960:119;;;1998:79;;:::i;:::-;1960:119;2118:1;2143:53;2188:7;2179:6;2168:9;2164:22;2143:53;:::i;:::-;2133:63;;2089:117;1884:329;;;;:::o;2219:60::-;2247:3;2268:5;2261:12;;2219:60;;;:::o;2285:142::-;2335:9;2368:53;2386:34;2395:24;2413:5;2395:24;:::i;:::-;2386:34;:::i;:::-;2368:53;:::i;:::-;2355:66;;2285:142;;;:::o;2433:126::-;2483:9;2516:37;2547:5;2516:37;:::i;:::-;2503:50;;2433:126;;;:::o;2565:140::-;2629:9;2662:37;2693:5;2662:37;:::i;:::-;2649:50;;2565:140;;;:::o;2711:159::-;2812:51;2857:5;2812:51;:::i;:::-;2807:3;2800:64;2711:159;;:::o;2876:1025::-;3179:4;3217:3;3206:9;3202:19;3194:27;;3231:71;3299:1;3288:9;3284:17;3275:6;3231:71;:::i;:::-;3312:86;3394:2;3383:9;3379:18;3370:6;3312:86;:::i;:::-;3408:72;3476:2;3465:9;3461:18;3452:6;3408:72;:::i;:::-;3490;3558:2;3547:9;3543:18;3534:6;3490:72;:::i;:::-;3572:73;3640:3;3629:9;3625:19;3616:6;3572:73;:::i;:::-;3655;3723:3;3712:9;3708:19;3699:6;3655:73;:::i;:::-;3738;3806:3;3795:9;3791:19;3782:6;3738:73;:::i;:::-;3821;3889:3;3878:9;3874:19;3865:6;3821:73;:::i;:::-;2876:1025;;;;;;;;;;;:::o;3907:110::-;3958:7;3987:24;4005:5;3987:24;:::i;:::-;3976:35;;3907:110;;;:::o;4023:150::-;4110:38;4142:5;4110:38;:::i;:::-;4103:5;4100:49;4090:77;;4163:1;4160;4153:12;4090:77;4023:150;:::o;4179:167::-;4239:5;4277:6;4264:20;4255:29;;4293:47;4334:5;4293:47;:::i;:::-;4179:167;;;;:::o;4352:90::-;4386:7;4429:5;4422:13;4415:21;4404:32;;4352:90;;;:::o;4448:116::-;4518:21;4533:5;4518:21;:::i;:::-;4511:5;4508:32;4498:60;;4554:1;4551;4544:12;4498:60;4448:116;:::o;4570:133::-;4613:5;4651:6;4638:20;4629:29;;4667:30;4691:5;4667:30;:::i;:::-;4570:133;;;;:::o;4709:641::-;4797:6;4805;4813;4862:2;4850:9;4841:7;4837:23;4833:32;4830:119;;;4868:79;;:::i;:::-;4830:119;4988:1;5013:53;5058:7;5049:6;5038:9;5034:22;5013:53;:::i;:::-;5003:63;;4959:117;5115:2;5141:67;5200:7;5191:6;5180:9;5176:22;5141:67;:::i;:::-;5131:77;;5086:132;5257:2;5283:50;5325:7;5316:6;5305:9;5301:22;5283:50;:::i;:::-;5273:60;;5228:115;4709:641;;;;;:::o;5356:468::-;5421:6;5429;5478:2;5466:9;5457:7;5453:23;5449:32;5446:119;;;5484:79;;:::i;:::-;5446:119;5604:1;5629:53;5674:7;5665:6;5654:9;5650:22;5629:53;:::i;:::-;5619:63;;5575:117;5731:2;5757:50;5799:7;5790:6;5779:9;5775:22;5757:50;:::i;:::-;5747:60;;5702:115;5356:468;;;;;:::o;5830:144::-;5898:9;5931:37;5962:5;5931:37;:::i;:::-;5918:50;;5830:144;;;:::o;5980:167::-;6085:55;6134:5;6085:55;:::i;:::-;6080:3;6073:68;5980:167;;:::o;6153:700::-;6376:4;6414:3;6403:9;6399:19;6391:27;;6428:71;6496:1;6485:9;6481:17;6472:6;6428:71;:::i;:::-;6509:90;6595:2;6584:9;6580:18;6571:6;6509:90;:::i;:::-;6609:72;6677:2;6666:9;6662:18;6653:6;6609:72;:::i;:::-;6691;6759:2;6748:9;6744:18;6735:6;6691:72;:::i;:::-;6773:73;6841:3;6830:9;6826:19;6817:6;6773:73;:::i;:::-;6153:700;;;;;;;;:::o;6859:933::-;6965:6;6973;6981;6989;6997;7046:3;7034:9;7025:7;7021:23;7017:33;7014:120;;;7053:79;;:::i;:::-;7014:120;7173:1;7198:67;7257:7;7248:6;7237:9;7233:22;7198:67;:::i;:::-;7188:77;;7144:131;7314:2;7340:53;7385:7;7376:6;7365:9;7361:22;7340:53;:::i;:::-;7330:63;;7285:118;7442:2;7468:53;7513:7;7504:6;7493:9;7489:22;7468:53;:::i;:::-;7458:63;;7413:118;7570:2;7596:53;7641:7;7632:6;7621:9;7617:22;7596:53;:::i;:::-;7586:63;;7541:118;7698:3;7725:50;7767:7;7758:6;7747:9;7743:22;7725:50;:::i;:::-;7715:60;;7669:116;6859:933;;;;;;;;:::o;7798:258::-;7909:4;7947:2;7936:9;7932:18;7924:26;;7960:89;8046:1;8035:9;8031:17;8022:6;7960:89;:::i;:::-;7798:258;;;;:::o;8062:117::-;8171:1;8168;8161:12;8185:102;8226:6;8277:2;8273:7;8268:2;8261:5;8257:14;8253:28;8243:38;;8185:102;;;:::o;8293:180::-;8341:77;8338:1;8331:88;8438:4;8435:1;8428:15;8462:4;8459:1;8452:15;8479:281;8562:27;8584:4;8562:27;:::i;:::-;8554:6;8550:40;8692:6;8680:10;8677:22;8656:18;8644:10;8641:34;8638:62;8635:88;;;8703:18;;:::i;:::-;8635:88;8743:10;8739:2;8732:22;8522:238;8479:281;;:::o;8766:129::-;8800:6;8827:20;;:::i;:::-;8817:30;;8856:33;8884:4;8876:6;8856:33;:::i;:::-;8766:129;;;:::o;8901:249::-;8976:4;9066:18;9058:6;9055:30;9052:56;;;9088:18;;:::i;:::-;9052:56;9138:4;9130:6;9126:17;9118:25;;8901:249;;;:::o;9156:117::-;9265:1;9262;9255:12;9297:643;9391:5;9416:79;9432:62;9487:6;9432:62;:::i;:::-;9416:79;:::i;:::-;9407:88;;9515:5;9568:4;9560:6;9556:17;9548:6;9544:30;9597:3;9589:6;9586:15;9583:122;;;9616:79;;:::i;:::-;9583:122;9731:6;9714:220;9748:6;9743:3;9740:15;9714:220;;;9823:3;9852:37;9885:3;9873:10;9852:37;:::i;:::-;9847:3;9840:50;9919:4;9914:3;9910:14;9903:21;;9790:144;9774:4;9769:3;9765:14;9758:21;;9714:220;;;9718:21;9397:543;;9297:643;;;;;:::o;9964:339::-;10033:5;10082:3;10075:4;10067:6;10063:17;10059:27;10049:122;;10090:79;;:::i;:::-;10049:122;10194:4;10216:81;10293:3;10285:6;10277;10216:81;:::i;:::-;10207:90;;10039:264;9964:339;;;;:::o;10309:376::-;10391:6;10440:3;10428:9;10419:7;10415:23;10411:33;10408:120;;;10447:79;;:::i;:::-;10408:120;10567:1;10592:76;10660:7;10651:6;10640:9;10636:22;10592:76;:::i;:::-;10582:86;;10538:140;10309:376;;;;:::o;10691:104::-;10756:6;10784:4;10774:14;;10691:104;;;:::o;10801:143::-;10898:11;10935:3;10920:18;;10801:143;;;;:::o;10950:98::-;11015:4;11038:3;11030:11;;10950:98;;;:::o;11054:108::-;11131:24;11149:5;11131:24;:::i;:::-;11126:3;11119:37;11054:108;;:::o;11168:179::-;11237:10;11258:46;11300:3;11292:6;11258:46;:::i;:::-;11336:4;11331:3;11327:14;11313:28;;11168:179;;;;:::o;11353:111::-;11421:4;11453;11448:3;11444:14;11436:22;;11353:111;;;:::o;11502:694::-;11638:52;11684:5;11638:52;:::i;:::-;11706:84;11783:6;11778:3;11706:84;:::i;:::-;11699:91;;11814:54;11862:5;11814:54;:::i;:::-;11891:7;11922:1;11907:282;11932:6;11929:1;11926:13;11907:282;;;12008:6;12002:13;12035:63;12094:3;12079:13;12035:63;:::i;:::-;12028:70;;12121:58;12172:6;12121:58;:::i;:::-;12111:68;;11967:222;11954:1;11951;11947:9;11942:14;;11907:282;;;11911:14;11614:582;;;11502:694;;:::o;12202:315::-;12341:4;12379:3;12368:9;12364:19;12356:27;;12393:117;12507:1;12496:9;12492:17;12483:6;12393:117;:::i;:::-;12202:315;;;;:::o;12523:104::-;12588:6;12616:4;12606:14;;12523:104;;;:::o;12633:143::-;12730:11;12767:3;12752:18;;12633:143;;;;:::o;12782:98::-;12847:4;12870:3;12862:11;;12782:98;;;:::o;12886:108::-;12963:24;12981:5;12963:24;:::i;:::-;12958:3;12951:37;12886:108;;:::o;13000:179::-;13069:10;13090:46;13132:3;13124:6;13090:46;:::i;:::-;13168:4;13163:3;13159:14;13145:28;;13000:179;;;;:::o;13185:111::-;13253:4;13285;13280:3;13276:14;13268:22;;13185:111;;;:::o;13334:694::-;13470:52;13516:5;13470:52;:::i;:::-;13538:84;13615:6;13610:3;13538:84;:::i;:::-;13531:91;;13646:54;13694:5;13646:54;:::i;:::-;13723:7;13754:1;13739:282;13764:6;13761:1;13758:13;13739:282;;;13840:6;13834:13;13867:63;13926:3;13911:13;13867:63;:::i;:::-;13860:70;;13953:58;14004:6;13953:58;:::i;:::-;13943:68;;13799:222;13786:1;13783;13779:9;13774:14;;13739:282;;;13743:14;13446:582;;;13334:694;;:::o;14034:315::-;14173:4;14211:3;14200:9;14196:19;14188:27;;14225:117;14339:1;14328:9;14324:17;14315:6;14225:117;:::i;:::-;14034:315;;;;:::o;14355:474::-;14423:6;14431;14480:2;14468:9;14459:7;14455:23;14451:32;14448:119;;;14486:79;;:::i;:::-;14448:119;14606:1;14631:53;14676:7;14667:6;14656:9;14652:22;14631:53;:::i;:::-;14621:63;;14577:117;14733:2;14759:53;14804:7;14795:6;14784:9;14780:22;14759:53;:::i;:::-;14749:63;;14704:118;14355:474;;;;;:::o;14835:109::-;14916:21;14931:5;14916:21;:::i;:::-;14911:3;14904:34;14835:109;;:::o;14950:210::-;15037:4;15075:2;15064:9;15060:18;15052:26;;15088:65;15150:1;15139:9;15135:17;15126:6;15088:65;:::i;:::-;14950:210;;;;:::o;15166:144::-;15234:9;15267:37;15298:5;15267:37;:::i;:::-;15254:50;;15166:144;;;:::o;15316:167::-;15421:55;15470:5;15421:55;:::i;:::-;15416:3;15409:68;15316:167;;:::o;15489:258::-;15600:4;15638:2;15627:9;15623:18;15615:26;;15651:89;15737:1;15726:9;15722:17;15713:6;15651:89;:::i;:::-;15489:258;;;;:::o;15753:905::-;15845:6;15853;15861;15869;15877;15926:3;15914:9;15905:7;15901:23;15897:33;15894:120;;;15933:79;;:::i;:::-;15894:120;16053:1;16078:53;16123:7;16114:6;16103:9;16099:22;16078:53;:::i;:::-;16068:63;;16024:117;16180:2;16206:53;16251:7;16242:6;16231:9;16227:22;16206:53;:::i;:::-;16196:63;;16151:118;16308:2;16334:53;16379:7;16370:6;16359:9;16355:22;16334:53;:::i;:::-;16324:63;;16279:118;16436:2;16462:53;16507:7;16498:6;16487:9;16483:22;16462:53;:::i;:::-;16452:63;;16407:118;16564:3;16591:50;16633:7;16624:6;16613:9;16609:22;16591:50;:::i;:::-;16581:60;;16535:116;15753:905;;;;;;;;:::o;16664:311::-;16741:4;16831:18;16823:6;16820:30;16817:56;;;16853:18;;:::i;:::-;16817:56;16903:4;16895:6;16891:17;16883:25;;16963:4;16957;16953:15;16945:23;;16664:311;;;:::o;16998:710::-;17094:5;17119:81;17135:64;17192:6;17135:64;:::i;:::-;17119:81;:::i;:::-;17110:90;;17220:5;17249:6;17242:5;17235:21;17283:4;17276:5;17272:16;17265:23;;17336:4;17328:6;17324:17;17316:6;17312:30;17365:3;17357:6;17354:15;17351:122;;;17384:79;;:::i;:::-;17351:122;17499:6;17482:220;17516:6;17511:3;17508:15;17482:220;;;17591:3;17620:37;17653:3;17641:10;17620:37;:::i;:::-;17615:3;17608:50;17687:4;17682:3;17678:14;17671:21;;17558:144;17542:4;17537:3;17533:14;17526:21;;17482:220;;;17486:21;17100:608;;16998:710;;;;;:::o;17731:370::-;17802:5;17851:3;17844:4;17836:6;17832:17;17828:27;17818:122;;17859:79;;:::i;:::-;17818:122;17976:6;17963:20;18001:94;18091:3;18083:6;18076:4;18068:6;18064:17;18001:94;:::i;:::-;17992:103;;17808:293;17731:370;;;;:::o;18107:829::-;18209:6;18217;18225;18274:2;18262:9;18253:7;18249:23;18245:32;18242:119;;;18280:79;;:::i;:::-;18242:119;18400:1;18425:53;18470:7;18461:6;18450:9;18446:22;18425:53;:::i;:::-;18415:63;;18371:117;18555:2;18544:9;18540:18;18527:32;18586:18;18578:6;18575:30;18572:117;;;18608:79;;:::i;:::-;18572:117;18713:78;18783:7;18774:6;18763:9;18759:22;18713:78;:::i;:::-;18703:88;;18498:303;18840:2;18866:53;18911:7;18902:6;18891:9;18887:22;18866:53;:::i;:::-;18856:63;;18811:118;18107:829;;;;;:::o;18942:474::-;19010:6;19018;19067:2;19055:9;19046:7;19042:23;19038:32;19035:119;;;19073:79;;:::i;:::-;19035:119;19193:1;19218:53;19263:7;19254:6;19243:9;19239:22;19218:53;:::i;:::-;19208:63;;19164:117;19320:2;19346:53;19391:7;19382:6;19371:9;19367:22;19346:53;:::i;:::-;19336:63;;19291:118;18942:474;;;;;:::o;19422:684::-;19515:6;19523;19572:2;19560:9;19551:7;19547:23;19543:32;19540:119;;;19578:79;;:::i;:::-;19540:119;19698:1;19723:53;19768:7;19759:6;19748:9;19744:22;19723:53;:::i;:::-;19713:63;;19669:117;19853:2;19842:9;19838:18;19825:32;19884:18;19876:6;19873:30;19870:117;;;19906:79;;:::i;:::-;19870:117;20011:78;20081:7;20072:6;20061:9;20057:22;20011:78;:::i;:::-;20001:88;;19796:303;19422:684;;;;;:::o;20112:118::-;20199:24;20217:5;20199:24;:::i;:::-;20194:3;20187:37;20112:118;;:::o;20236:222::-;20329:4;20367:2;20356:9;20352:18;20344:26;;20380:71;20448:1;20437:9;20433:17;20424:6;20380:71;:::i;:::-;20236:222;;;;:::o;20464:829::-;20566:6;20574;20582;20631:2;20619:9;20610:7;20606:23;20602:32;20599:119;;;20637:79;;:::i;:::-;20599:119;20757:1;20782:53;20827:7;20818:6;20807:9;20803:22;20782:53;:::i;:::-;20772:63;;20728:117;20884:2;20910:53;20955:7;20946:6;20935:9;20931:22;20910:53;:::i;:::-;20900:63;;20855:118;21040:2;21029:9;21025:18;21012:32;21071:18;21063:6;21060:30;21057:117;;;21093:79;;:::i;:::-;21057:117;21198:78;21268:7;21259:6;21248:9;21244:22;21198:78;:::i;:::-;21188:88;;20983:303;20464:829;;;;;:::o;21299:613::-;21373:6;21381;21389;21438:2;21426:9;21417:7;21413:23;21409:32;21406:119;;;21444:79;;:::i;:::-;21406:119;21564:1;21589:53;21634:7;21625:6;21614:9;21610:22;21589:53;:::i;:::-;21579:63;;21535:117;21691:2;21717:53;21762:7;21753:6;21742:9;21738:22;21717:53;:::i;:::-;21707:63;;21662:118;21819:2;21845:50;21887:7;21878:6;21867:9;21863:22;21845:50;:::i;:::-;21835:60;;21790:115;21299:613;;;;;:::o;21918:104::-;21983:6;22011:4;22001:14;;21918:104;;;:::o;22028:143::-;22125:11;22162:3;22147:18;;22028:143;;;;:::o;22177:98::-;22242:4;22265:3;22257:11;;22177:98;;;:::o;22281:111::-;22349:4;22381;22376:3;22372:14;22364:22;;22281:111;;;:::o;22430:694::-;22566:52;22612:5;22566:52;:::i;:::-;22634:84;22711:6;22706:3;22634:84;:::i;:::-;22627:91;;22742:54;22790:5;22742:54;:::i;:::-;22819:7;22850:1;22835:282;22860:6;22857:1;22854:13;22835:282;;;22936:6;22930:13;22963:63;23022:3;23007:13;22963:63;:::i;:::-;22956:70;;23049:58;23100:6;23049:58;:::i;:::-;23039:68;;22895:222;22882:1;22879;22875:9;22870:14;;22835:282;;;22839:14;22542:582;;;22430:694;;:::o;23130:315::-;23269:4;23307:3;23296:9;23292:19;23284:27;;23321:117;23435:1;23424:9;23420:17;23411:6;23321:117;:::i;:::-;23130:315;;;;:::o;23451:117::-;23560:1;23557;23550:12;23574:308;23636:4;23726:18;23718:6;23715:30;23712:56;;;23748:18;;:::i;:::-;23712:56;23786:29;23808:6;23786:29;:::i;:::-;23778:37;;23870:4;23864;23860:15;23852:23;;23574:308;;;:::o;23888:146::-;23985:6;23980:3;23975;23962:30;24026:1;24017:6;24012:3;24008:16;24001:27;23888:146;;;:::o;24040:425::-;24118:5;24143:66;24159:49;24201:6;24159:49;:::i;:::-;24143:66;:::i;:::-;24134:75;;24232:6;24225:5;24218:21;24270:4;24263:5;24259:16;24308:3;24299:6;24294:3;24290:16;24287:25;24284:112;;;24315:79;;:::i;:::-;24284:112;24405:54;24452:6;24447:3;24442;24405:54;:::i;:::-;24124:341;24040:425;;;;;:::o;24485:340::-;24541:5;24590:3;24583:4;24575:6;24571:17;24567:27;24557:122;;24598:79;;:::i;:::-;24557:122;24715:6;24702:20;24740:79;24815:3;24807:6;24800:4;24792:6;24788:17;24740:79;:::i;:::-;24731:88;;24547:278;24485:340;;;;:::o;24831:654::-;24909:6;24917;24966:2;24954:9;24945:7;24941:23;24937:32;24934:119;;;24972:79;;:::i;:::-;24934:119;25092:1;25117:53;25162:7;25153:6;25142:9;25138:22;25117:53;:::i;:::-;25107:63;;25063:117;25247:2;25236:9;25232:18;25219:32;25278:18;25270:6;25267:30;25264:117;;;25300:79;;:::i;:::-;25264:117;25405:63;25460:7;25451:6;25440:9;25436:22;25405:63;:::i;:::-;25395:73;;25190:288;24831:654;;;;;:::o;25491:541::-;25662:4;25700:3;25689:9;25685:19;25677:27;;25714:71;25782:1;25771:9;25767:17;25758:6;25714:71;:::i;:::-;25795:72;25863:2;25852:9;25848:18;25839:6;25795:72;:::i;:::-;25877;25945:2;25934:9;25930:18;25921:6;25877:72;:::i;:::-;25959:66;26021:2;26010:9;26006:18;25997:6;25959:66;:::i;:::-;25491:541;;;;;;;:::o;26038:311::-;26115:4;26205:18;26197:6;26194:30;26191:56;;;26227:18;;:::i;:::-;26191:56;26277:4;26269:6;26265:17;26257:25;;26337:4;26331;26327:15;26319:23;;26038:311;;;:::o;26372:710::-;26468:5;26493:81;26509:64;26566:6;26509:64;:::i;:::-;26493:81;:::i;:::-;26484:90;;26594:5;26623:6;26616:5;26609:21;26657:4;26650:5;26646:16;26639:23;;26710:4;26702:6;26698:17;26690:6;26686:30;26739:3;26731:6;26728:15;26725:122;;;26758:79;;:::i;:::-;26725:122;26873:6;26856:220;26890:6;26885:3;26882:15;26856:220;;;26965:3;26994:37;27027:3;27015:10;26994:37;:::i;:::-;26989:3;26982:50;27061:4;27056:3;27052:14;27045:21;;26932:144;26916:4;26911:3;26907:14;26900:21;;26856:220;;;26860:21;26474:608;;26372:710;;;;;:::o;27105:370::-;27176:5;27225:3;27218:4;27210:6;27206:17;27202:27;27192:122;;27233:79;;:::i;:::-;27192:122;27350:6;27337:20;27375:94;27465:3;27457:6;27450:4;27442:6;27438:17;27375:94;:::i;:::-;27366:103;;27182:293;27105:370;;;;:::o;27481:823::-;27580:6;27588;27596;27645:2;27633:9;27624:7;27620:23;27616:32;27613:119;;;27651:79;;:::i;:::-;27613:119;27771:1;27796:53;27841:7;27832:6;27821:9;27817:22;27796:53;:::i;:::-;27786:63;;27742:117;27926:2;27915:9;27911:18;27898:32;27957:18;27949:6;27946:30;27943:117;;;27979:79;;:::i;:::-;27943:117;28084:78;28154:7;28145:6;28134:9;28130:22;28084:78;:::i;:::-;28074:88;;27869:303;28211:2;28237:50;28279:7;28270:6;28259:9;28255:22;28237:50;:::i;:::-;28227:60;;28182:115;27481:823;;;;;:::o;28310:357::-;28383:6;28432:2;28420:9;28411:7;28407:23;28403:32;28400:119;;;28438:79;;:::i;:::-;28400:119;28558:1;28583:67;28642:7;28633:6;28622:9;28618:22;28583:67;:::i;:::-;28573:77;;28529:131;28310:357;;;;:::o;28673:905::-;28765:6;28773;28781;28789;28797;28846:3;28834:9;28825:7;28821:23;28817:33;28814:120;;;28853:79;;:::i;:::-;28814:120;28973:1;28998:53;29043:7;29034:6;29023:9;29019:22;28998:53;:::i;:::-;28988:63;;28944:117;29100:2;29126:53;29171:7;29162:6;29151:9;29147:22;29126:53;:::i;:::-;29116:63;;29071:118;29228:2;29254:53;29299:7;29290:6;29279:9;29275:22;29254:53;:::i;:::-;29244:63;;29199:118;29356:2;29382:53;29427:7;29418:6;29407:9;29403:22;29382:53;:::i;:::-;29372:63;;29327:118;29484:3;29511:50;29553:7;29544:6;29533:9;29529:22;29511:50;:::i;:::-;29501:60;;29455:116;28673:905;;;;;;;;:::o;29584:180::-;29632:77;29629:1;29622:88;29729:4;29726:1;29719:15;29753:4;29750:1;29743:15;29770:180;29818:77;29815:1;29808:88;29915:4;29912:1;29905:15;29939:4;29936:1;29929:15;29956:233;29995:3;30018:24;30036:5;30018:24;:::i;:::-;30009:33;;30064:66;30057:5;30054:77;30051:103;;30134:18;;:::i;:::-;30051:103;30181:1;30174:5;30170:13;30163:20;;29956:233;;;:::o;30195:169::-;30279:11;30313:6;30308:3;30301:19;30353:4;30348:3;30344:14;30329:29;;30195:169;;;;:::o;30370:222::-;30510:34;30506:1;30498:6;30494:14;30487:58;30579:5;30574:2;30566:6;30562:15;30555:30;30370:222;:::o;30598:366::-;30740:3;30761:67;30825:2;30820:3;30761:67;:::i;:::-;30754:74;;30837:93;30926:3;30837:93;:::i;:::-;30955:2;30950:3;30946:12;30939:19;;30598:366;;;:::o;30970:419::-;31136:4;31174:2;31163:9;31159:18;31151:26;;31223:9;31217:4;31213:20;31209:1;31198:9;31194:17;31187:47;31251:131;31377:4;31251:131;:::i;:::-;31243:139;;30970:419;;;:::o;31395:442::-;31544:4;31582:2;31571:9;31567:18;31559:26;;31595:71;31663:1;31652:9;31648:17;31639:6;31595:71;:::i;:::-;31676:72;31744:2;31733:9;31729:18;31720:6;31676:72;:::i;:::-;31758;31826:2;31815:9;31811:18;31802:6;31758:72;:::i;:::-;31395:442;;;;;;:::o;31843:233::-;31983:34;31979:1;31971:6;31967:14;31960:58;32052:16;32047:2;32039:6;32035:15;32028:41;31843:233;:::o;32082:366::-;32224:3;32245:67;32309:2;32304:3;32245:67;:::i;:::-;32238:74;;32321:93;32410:3;32321:93;:::i;:::-;32439:2;32434:3;32430:12;32423:19;;32082:366;;;:::o;32454:419::-;32620:4;32658:2;32647:9;32643:18;32635:26;;32707:9;32701:4;32697:20;32693:1;32682:9;32678:17;32671:47;32735:131;32861:4;32735:131;:::i;:::-;32727:139;;32454:419;;;:::o;32879:181::-;33019:33;33015:1;33007:6;33003:14;32996:57;32879:181;:::o;33066:366::-;33208:3;33229:67;33293:2;33288:3;33229:67;:::i;:::-;33222:74;;33305:93;33394:3;33305:93;:::i;:::-;33423:2;33418:3;33414:12;33407:19;;33066:366;;;:::o;33438:419::-;33604:4;33642:2;33631:9;33627:18;33619:26;;33691:9;33685:4;33681:20;33677:1;33666:9;33662:17;33655:47;33719:131;33845:4;33719:131;:::i;:::-;33711:139;;33438:419;;;:::o;33863:114::-;33930:6;33964:5;33958:12;33948:22;;33863:114;;;:::o;33983:184::-;34082:11;34116:6;34111:3;34104:19;34156:4;34151:3;34147:14;34132:29;;33983:184;;;;:::o;34173:132::-;34240:4;34263:3;34255:11;;34293:4;34288:3;34284:14;34276:22;;34173:132;;;:::o;34311:113::-;34381:4;34413;34408:3;34404:14;34396:22;;34311:113;;;:::o;34460:732::-;34579:3;34608:54;34656:5;34608:54;:::i;:::-;34678:86;34757:6;34752:3;34678:86;:::i;:::-;34671:93;;34788:56;34838:5;34788:56;:::i;:::-;34867:7;34898:1;34883:284;34908:6;34905:1;34902:13;34883:284;;;34984:6;34978:13;35011:63;35070:3;35055:13;35011:63;:::i;:::-;35004:70;;35097:60;35150:6;35097:60;:::i;:::-;35087:70;;34943:224;34930:1;34927;34923:9;34918:14;;34883:284;;;34887:14;35183:3;35176:10;;34584:608;;;34460:732;;;;:::o;35198:704::-;35425:4;35463:3;35452:9;35448:19;35440:27;;35477:71;35545:1;35534:9;35530:17;35521:6;35477:71;:::i;:::-;35595:9;35589:4;35585:20;35580:2;35569:9;35565:18;35558:48;35623:108;35726:4;35717:6;35623:108;:::i;:::-;35615:116;;35741:72;35809:2;35798:9;35794:18;35785:6;35741:72;:::i;:::-;35823;35891:2;35880:9;35876:18;35867:6;35823:72;:::i;:::-;35198:704;;;;;;;:::o;35908:332::-;36029:4;36067:2;36056:9;36052:18;36044:26;;36080:71;36148:1;36137:9;36133:17;36124:6;36080:71;:::i;:::-;36161:72;36229:2;36218:9;36214:18;36205:6;36161:72;:::i;:::-;35908:332;;;;;:::o;36246:143::-;36303:5;36334:6;36328:13;36319:22;;36350:33;36377:5;36350:33;:::i;:::-;36246:143;;;;:::o;36395:351::-;36465:6;36514:2;36502:9;36493:7;36489:23;36485:32;36482:119;;;36520:79;;:::i;:::-;36482:119;36640:1;36665:64;36721:7;36712:6;36701:9;36697:22;36665:64;:::i;:::-;36655:74;;36611:128;36395:351;;;;:::o;36752:220::-;36892:34;36888:1;36880:6;36876:14;36869:58;36961:3;36956:2;36948:6;36944:15;36937:28;36752:220;:::o;36978:366::-;37120:3;37141:67;37205:2;37200:3;37141:67;:::i;:::-;37134:74;;37217:93;37306:3;37217:93;:::i;:::-;37335:2;37330:3;37326:12;37319:19;;36978:366;;;:::o;37350:419::-;37516:4;37554:2;37543:9;37539:18;37531:26;;37603:9;37597:4;37593:20;37589:1;37578:9;37574:17;37567:47;37631:131;37757:4;37631:131;:::i;:::-;37623:139;;37350:419;;;:::o;37775:332::-;37896:4;37934:2;37923:9;37919:18;37911:26;;37947:71;38015:1;38004:9;38000:17;37991:6;37947:71;:::i;:::-;38028:72;38096:2;38085:9;38081:18;38072:6;38028:72;:::i;:::-;37775:332;;;;;:::o;38113:143::-;38170:5;38201:6;38195:13;38186:22;;38217:33;38244:5;38217:33;:::i;:::-;38113:143;;;;:::o;38262:351::-;38332:6;38381:2;38369:9;38360:7;38356:23;38352:32;38349:119;;;38387:79;;:::i;:::-;38349:119;38507:1;38532:64;38588:7;38579:6;38568:9;38564:22;38532:64;:::i;:::-;38522:74;;38478:128;38262:351;;;;:::o;38619:373::-;38762:4;38800:2;38789:9;38785:18;38777:26;;38849:9;38843:4;38839:20;38835:1;38824:9;38820:17;38813:47;38877:108;38980:4;38971:6;38877:108;:::i;:::-;38869:116;;38619:373;;;;:::o;38998:348::-;39038:7;39061:20;39079:1;39061:20;:::i;:::-;39056:25;;39095:20;39113:1;39095:20;:::i;:::-;39090:25;;39283:1;39215:66;39211:74;39208:1;39205:81;39200:1;39193:9;39186:17;39182:105;39179:131;;;39290:18;;:::i;:::-;39179:131;39338:1;39335;39331:9;39320:20;;38998:348;;;;:::o;39352:180::-;39400:77;39397:1;39390:88;39497:4;39494:1;39487:15;39521:4;39518:1;39511:15;39538:185;39578:1;39595:20;39613:1;39595:20;:::i;:::-;39590:25;;39629:20;39647:1;39629:20;:::i;:::-;39624:25;;39668:1;39658:35;;39673:18;;:::i;:::-;39658:35;39715:1;39712;39708:9;39703:14;;39538:185;;;;:::o;39729:191::-;39769:3;39788:20;39806:1;39788:20;:::i;:::-;39783:25;;39822:20;39840:1;39822:20;:::i;:::-;39817:25;;39865:1;39862;39858:9;39851:16;;39886:3;39883:1;39880:10;39877:36;;;39893:18;;:::i;:::-;39877:36;39729:191;;;;:::o;39926:165::-;40066:17;40062:1;40054:6;40050:14;40043:41;39926:165;:::o;40097:366::-;40239:3;40260:67;40324:2;40319:3;40260:67;:::i;:::-;40253:74;;40336:93;40425:3;40336:93;:::i;:::-;40454:2;40449:3;40445:12;40438:19;;40097:366;;;:::o;40469:419::-;40635:4;40673:2;40662:9;40658:18;40650:26;;40722:9;40716:4;40712:20;40708:1;40697:9;40693:17;40686:47;40750:131;40876:4;40750:131;:::i;:::-;40742:139;;40469:419;;;:::o;40894:704::-;41121:4;41159:3;41148:9;41144:19;41136:27;;41173:71;41241:1;41230:9;41226:17;41217:6;41173:71;:::i;:::-;41254:72;41322:2;41311:9;41307:18;41298:6;41254:72;:::i;:::-;41373:9;41367:4;41363:20;41358:2;41347:9;41343:18;41336:48;41401:108;41504:4;41495:6;41401:108;:::i;:::-;41393:116;;41519:72;41587:2;41576:9;41572:18;41563:6;41519:72;:::i;:::-;40894:704;;;;;;;:::o;41604:194::-;41644:4;41664:20;41682:1;41664:20;:::i;:::-;41659:25;;41698:20;41716:1;41698:20;:::i;:::-;41693:25;;41742:1;41739;41735:9;41727:17;;41766:1;41760:4;41757:11;41754:37;;;41771:18;;:::i;:::-;41754:37;41604:194;;;;:::o;41804:85::-;41849:7;41878:5;41867:16;;41804:85;;;:::o;41895:158::-;41953:9;41986:61;42004:42;42013:32;42039:5;42013:32;:::i;:::-;42004:42;:::i;:::-;41986:61;:::i;:::-;41973:74;;41895:158;;;:::o;42059:147::-;42154:45;42193:5;42154:45;:::i;:::-;42149:3;42142:58;42059:147;;:::o;42212:720::-;42447:4;42485:3;42474:9;42470:19;42462:27;;42499:71;42567:1;42556:9;42552:17;42543:6;42499:71;:::i;:::-;42580:80;42656:2;42645:9;42641:18;42632:6;42580:80;:::i;:::-;42707:9;42701:4;42697:20;42692:2;42681:9;42677:18;42670:48;42735:108;42838:4;42829:6;42735:108;:::i;:::-;42727:116;;42853:72;42921:2;42910:9;42906:18;42897:6;42853:72;:::i;:::-;42212:720;;;;;;;:::o;42938:99::-;42990:6;43024:5;43018:12;43008:22;;42938:99;;;:::o;43043:246::-;43124:1;43134:113;43148:6;43145:1;43142:13;43134:113;;;43233:1;43228:3;43224:11;43218:18;43214:1;43209:3;43205:11;43198:39;43170:2;43167:1;43163:10;43158:15;;43134:113;;;43281:1;43272:6;43267:3;43263:16;43256:27;43105:184;43043:246;;;:::o;43295:377::-;43383:3;43411:39;43444:5;43411:39;:::i;:::-;43466:71;43530:6;43525:3;43466:71;:::i;:::-;43459:78;;43546:65;43604:6;43599:3;43592:4;43585:5;43581:16;43546:65;:::i;:::-;43636:29;43658:6;43636:29;:::i;:::-;43631:3;43627:39;43620:46;;43387:285;43295:377;;;;:::o;43678:423::-;43819:4;43857:2;43846:9;43842:18;43834:26;;43870:71;43938:1;43927:9;43923:17;43914:6;43870:71;:::i;:::-;43988:9;43982:4;43978:20;43973:2;43962:9;43958:18;43951:48;44016:78;44089:4;44080:6;44016:78;:::i;:::-;44008:86;;43678:423;;;;;:::o;44107:313::-;44220:4;44258:2;44247:9;44243:18;44235:26;;44307:9;44301:4;44297:20;44293:1;44282:9;44278:17;44271:47;44335:78;44408:4;44399:6;44335:78;:::i;:::-;44327:86;;44107:313;;;;:::o;44426:114::-;44493:6;44527:5;44521:12;44511:22;;44426:114;;;:::o;44546:184::-;44645:11;44679:6;44674:3;44667:19;44719:4;44714:3;44710:14;44695:29;;44546:184;;;;:::o;44736:132::-;44803:4;44826:3;44818:11;;44856:4;44851:3;44847:14;44839:22;;44736:132;;;:::o;44874:113::-;44944:4;44976;44971:3;44967:14;44959:22;;44874:113;;;:::o;45023:732::-;45142:3;45171:54;45219:5;45171:54;:::i;:::-;45241:86;45320:6;45315:3;45241:86;:::i;:::-;45234:93;;45351:56;45401:5;45351:56;:::i;:::-;45430:7;45461:1;45446:284;45471:6;45468:1;45465:13;45446:284;;;45547:6;45541:13;45574:63;45633:3;45618:13;45574:63;:::i;:::-;45567:70;;45660:60;45713:6;45660:60;:::i;:::-;45650:70;;45506:224;45493:1;45490;45486:9;45481:14;;45446:284;;;45450:14;45746:3;45739:10;;45147:608;;;45023:732;;;;:::o;45761:471::-;45926:4;45964:2;45953:9;45949:18;45941:26;;46013:9;46007:4;46003:20;45999:1;45988:9;45984:17;45977:47;46041:108;46144:4;46135:6;46041:108;:::i;:::-;46033:116;;46159:66;46221:2;46210:9;46206:18;46197:6;46159:66;:::i;:::-;45761:471;;;;;:::o;46238:442::-;46387:4;46425:2;46414:9;46410:18;46402:26;;46438:71;46506:1;46495:9;46491:17;46482:6;46438:71;:::i;:::-;46519:72;46587:2;46576:9;46572:18;46563:6;46519:72;:::i;:::-;46601;46669:2;46658:9;46654:18;46645:6;46601:72;:::i;:::-;46238:442;;;;;;:::o;46686:225::-;46826:34;46822:1;46814:6;46810:14;46803:58;46895:8;46890:2;46882:6;46878:15;46871:33;46686:225;:::o;46917:366::-;47059:3;47080:67;47144:2;47139:3;47080:67;:::i;:::-;47073:74;;47156:93;47245:3;47156:93;:::i;:::-;47274:2;47269:3;47265:12;47258:19;;46917:366;;;:::o;47289:419::-;47455:4;47493:2;47482:9;47478:18;47470:26;;47542:9;47536:4;47532:20;47528:1;47517:9;47513:17;47506:47;47570:131;47696:4;47570:131;:::i;:::-;47562:139;;47289:419;;;:::o;47714:182::-;47854:34;47850:1;47842:6;47838:14;47831:58;47714:182;:::o;47902:366::-;48044:3;48065:67;48129:2;48124:3;48065:67;:::i;:::-;48058:74;;48141:93;48230:3;48141:93;:::i;:::-;48259:2;48254:3;48250:12;48243:19;;47902:366;;;:::o;48274:419::-;48440:4;48478:2;48467:9;48463:18;48455:26;;48527:9;48521:4;48517:20;48513:1;48502:9;48498:17;48491:47;48555:131;48681:4;48555:131;:::i;:::-;48547:139;;48274:419;;;:::o;48699:442::-;48848:4;48886:2;48875:9;48871:18;48863:26;;48899:71;48967:1;48956:9;48952:17;48943:6;48899:71;:::i;:::-;48980:72;49048:2;49037:9;49033:18;49024:6;48980:72;:::i;:::-;49062;49130:2;49119:9;49115:18;49106:6;49062:72;:::i;:::-;48699:442;;;;;;:::o;49147:137::-;49201:5;49232:6;49226:13;49217:22;;49248:30;49272:5;49248:30;:::i;:::-;49147:137;;;;:::o;49290:345::-;49357:6;49406:2;49394:9;49385:7;49381:23;49377:32;49374:119;;;49412:79;;:::i;:::-;49374:119;49532:1;49557:61;49610:7;49601:6;49590:9;49586:22;49557:61;:::i;:::-;49547:71;;49503:125;49290:345;;;;:::o;49641:229::-;49781:34;49777:1;49769:6;49765:14;49758:58;49850:12;49845:2;49837:6;49833:15;49826:37;49641:229;:::o;49876:366::-;50018:3;50039:67;50103:2;50098:3;50039:67;:::i;:::-;50032:74;;50115:93;50204:3;50115:93;:::i;:::-;50233:2;50228:3;50224:12;50217:19;;49876:366;;;:::o;50248:419::-;50414:4;50452:2;50441:9;50437:18;50429:26;;50501:9;50495:4;50491:20;50487:1;50476:9;50472:17;50465:47;50529:131;50655:4;50529:131;:::i;:::-;50521:139;;50248:419;;;:::o;50673:225::-;50813:34;50809:1;50801:6;50797:14;50790:58;50882:8;50877:2;50869:6;50865:15;50858:33;50673:225;:::o;50904:366::-;51046:3;51067:67;51131:2;51126:3;51067:67;:::i;:::-;51060:74;;51143:93;51232:3;51143:93;:::i;:::-;51261:2;51256:3;51252:12;51245:19;;50904:366;;;:::o;51276:419::-;51442:4;51480:2;51469:9;51465:18;51457:26;;51529:9;51523:4;51519:20;51515:1;51504:9;51500:17;51493:47;51557:131;51683:4;51557:131;:::i;:::-;51549:139;;51276:419;;;:::o;51701:179::-;51841:31;51837:1;51829:6;51825:14;51818:55;51701:179;:::o;51886:366::-;52028:3;52049:67;52113:2;52108:3;52049:67;:::i;:::-;52042:74;;52125:93;52214:3;52125:93;:::i;:::-;52243:2;52238:3;52234:12;52227:19;;51886:366;;;:::o;52258:419::-;52424:4;52462:2;52451:9;52447:18;52439:26;;52511:9;52505:4;52501:20;52497:1;52486:9;52482:17;52475:47;52539:131;52665:4;52539:131;:::i;:::-;52531:139;;52258:419;;;:::o;52683:98::-;52734:6;52768:5;52762:12;52752:22;;52683:98;;;:::o;52787:147::-;52888:11;52925:3;52910:18;;52787:147;;;;:::o;52940:386::-;53044:3;53072:38;53104:5;53072:38;:::i;:::-;53126:88;53207:6;53202:3;53126:88;:::i;:::-;53119:95;;53223:65;53281:6;53276:3;53269:4;53262:5;53258:16;53223:65;:::i;:::-;53313:6;53308:3;53304:16;53297:23;;53048:278;52940:386;;;;:::o;53332:271::-;53462:3;53484:93;53573:3;53564:6;53484:93;:::i;:::-;53477:100;;53594:3;53587:10;;53332:271;;;;:::o
Swarm Source
ipfs://82231f706655e0c56b3e94ad945f784f806092c81f6a13e2670d578ec002b73f
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.