Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
VoterUpgradeable
Compiler Version
v0.8.27+commit.40a35a09
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-01-26 */ //SPDX-License-Identifier: MIT pragma solidity ^0.8.20; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Storage of the initializable contract. * * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions * when using with upgradeable contracts. * * @custom:storage-location erc7201:openzeppelin.storage.Initializable */ struct InitializableStorage { /** * @dev Indicates that the contract has been initialized. */ uint64 _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool _initializing; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00; /** * @dev The contract is already initialized. */ error InvalidInitialization(); /** * @dev The contract is not initializing. */ error NotInitializing(); /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint64 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in * production. * * Emits an {Initialized} event. */ modifier initializer() { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); // Cache values to avoid duplicated sloads bool isTopLevelCall = !$._initializing; uint64 initialized = $._initialized; // Allowed calls: // - initialSetup: the contract is not in the initializing state and no previous version was // initialized // - construction: the contract is initialized at version 1 (no reininitialization) and the // current contract is just being deployed bool initialSetup = initialized == 0 && isTopLevelCall; bool construction = initialized == 1 && address(this).code.length == 0; if (!initialSetup && !construction) { revert InvalidInitialization(); } $._initialized = 1; if (isTopLevelCall) { $._initializing = true; } _; if (isTopLevelCall) { $._initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint64 version) { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing || $._initialized >= version) { revert InvalidInitialization(); } $._initialized = version; $._initializing = true; _; $._initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { _checkInitializing(); _; } /** * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}. */ function _checkInitializing() internal view virtual { if (!_isInitializing()) { revert NotInitializing(); } } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing) { revert InvalidInitialization(); } if ($._initialized != type(uint64).max) { $._initialized = type(uint64).max; emit Initialized(type(uint64).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint64) { return _getInitializableStorage()._initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _getInitializableStorage()._initializing; } /** * @dev Returns a pointer to the storage namespace. */ // solhint-disable-next-line var-name-mixedcase function _getInitializableStorage() private pure returns (InitializableStorage storage $) { assembly { $.slot := INITIALIZABLE_STORAGE } } } pragma solidity ^0.8.20; /** * @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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } pragma solidity ^0.8.20; /** * @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. * * The initial owner is set to the address provided by the deployer. 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 OwnableUpgradeable is Initializable, ContextUpgradeable { /// @custom:storage-location erc7201:openzeppelin.storage.Ownable struct OwnableStorage { address _owner; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Ownable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300; function _getOwnableStorage() private pure returns (OwnableStorage storage $) { assembly { $.slot := OwnableStorageLocation } } /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ function __Ownable_init(address initialOwner) internal onlyInitializing { __Ownable_init_unchained(initialOwner); } function __Ownable_init_unchained(address initialOwner) internal onlyInitializing { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @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) { OwnableStorage storage $ = _getOwnableStorage(); return $._owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { OwnableStorage storage $ = _getOwnableStorage(); address oldOwner = $._owner; $._owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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); } 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. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20PermitUpgradeable { /** * @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]. * * CAUTION: See Security Considerations above. */ 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); } pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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); } } } 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 SafeERC20Upgradeable { using AddressUpgradeable for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20Upgradeable 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(IERC20Upgradeable 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)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20Upgradeable token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20PermitUpgradeable 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(IERC20Upgradeable 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"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation 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). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20Upgradeable token, bytes memory data) private returns (bool) { // 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 cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && AddressUpgradeable.isContract(address(token)); } } 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 ReentrancyGuardUpgradeable is Initializable { // 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; function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { _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() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } pragma solidity 0.8.27; interface IMeme { /** * @notice Lock tokens for voting * @param amount Amount of tokens to lock * @param user Address of the user whose tokens are being locked */ function lockTokens(uint256 amount, address user) external; /** * @notice Get the balance of tokens for a user * @param account Address of the user to check balance for * @return The token balance of the given account */ function balanceOf(address account) external view returns (uint256); /** * @notice Check if tokens are currently locked for a user * @param user Address of the user to check locks for * @return Boolean indicating if user has locked tokens */ function isLocked(address user) external view returns (bool); /** * @notice Transfer tokens from one address to another * @param from Address to transfer from * @param to Address to transfer to * @param amount Amount of tokens to transfer * @return Boolean indicating if the transfer was successful */ function transferFrom(address from, address to, uint256 amount) external returns (bool); /** * @notice Transfer tokens to another address * @param to Address to transfer to * @param amount Amount of tokens to transfer * @return Boolean indicating if the transfer was successful */ function transfer(address to, uint256 amount) external returns (bool); function isLockExpired(address user) external view returns (bool); } pragma solidity ^0.8.4; interface IOnlyMemesERC20 { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance( address owner, address spender ) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; } pragma solidity ^0.8.4; interface IVoter { function isBribeWhitelisted(address token) external view returns (bool); function setWhitelistedBribe(address token, bool status) external; function bribe(uint256 pid, address reward, uint256 amount) external; function _lastEpoch() external view returns (uint256); function _epochLength() external view returns(uint256); function _unlockTokens(address owner) external; } pragma solidity ^0.8.4; interface IOnlyMemesPair is IOnlyMemesERC20 { event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn( address to ) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; function setPID(uint256 pid) external; function setFeeAddresses(IVoter, address, address) external; } pragma solidity 0.8.27; interface IChef { /** * @notice Get the total number of pools in the chef contract * @return Number of pools */ function poolLength() external view returns (uint256); /** * @notice Set the allocation points for a pool * @param pid Pool ID to modify * @param allocPoint New allocation points for the pool */ function set(uint256 pid, uint256 allocPoint) external; function getPID(address lp) external returns (uint256 pid); } pragma solidity 0.8.27; contract VoterUpgradeable is Initializable, OwnableUpgradeable, ReentrancyGuardUpgradeable { using SafeERC20Upgradeable for IERC20Upgradeable; struct votes { uint256 pid; uint256 amount; bool claimed; } struct bribeInfo { address reward; uint256 epoch; uint256 amount; uint256 claimed; } // Constants uint256 public constant MAX_BRIBES_PER_POOL = 10; uint256 private constant MAX_ALLOC_POINTS = 4000; uint256 public constant MINIMUM_BRIBE_AMOUNT = 1e18; uint256 public constant VOTE_BUFFER_TIME = 1 hours; uint256 public constant MAX_BUFFER_TIME = 4 hours; uint256 public constant MAXIMUM_VOTE_AMOUNT = 42e24; uint56 [50] _gap; // Storage variables address public masterChef; address public votingToken; uint256 public lastEpoch; uint256 public epochLength; uint256 public totalWeight; uint256 public Epoch; uint256 public bufferStart; IMeme public meme; IChef public chef; mapping(address => bool) public isBribeWhitelisted; mapping(address => uint256) public userLocks; mapping(uint256 => uint256) public voterTurnouts; mapping(address => uint256) public lastClaim; mapping(uint256 => mapping(uint256 => uint256)) public voteResults; mapping(uint256 => mapping(uint256 => bribeInfo[])) public bribeRewards; mapping(address => mapping(uint256 => votes[])) public userVotes; mapping(uint256 => bool) public isEpochSealed; mapping(uint256 => bool) public isEpochFinalized; // Events remain the same event BribeWhitelistUpdated(address indexed token, bool status); event BribeClaimed(address indexed user, uint256 indexed epoch, uint256 indexed pid, address reward, uint256 amount); event VoteCast(address indexed user, uint256 indexed pid, uint256 amount); event EpochFlipped(uint256 indexed newEpoch, uint256 timestamp); event BribeAdded(address indexed token, uint256 indexed pid, uint256 indexed epoch, uint256 amount); event ClaimSkipped(uint256 indexed epoch); event BufferPeriodStarted(uint256 indexed epoch, uint256 startTime); event EpochFinalized(uint256 indexed epoch, uint256 timestamp); // Errors remain the same error InsufficientVotes(); error BribeNotWhitelisted(); error EpochNotEnded(); error BribesAlreadyClaimed(); error ZeroVotes(); error DivisionByZero(); error InvalidEpoch(); error InvalidToken(); error NotAuthorized(); error ClaimTooEarly(); error InvalidPid(); error DuplicatePid(); error Overflow(); error TooManyBribes(); error BribeTooSmall(); error VoteAmountTooLarge(); error BufferPeriodTooEarly(); error BufferPeriodExpired(); error EpochSealed(); error BufferNotStarted(); error NoLocksToUnlock(); error NoClaimableEpochs(); error EpochAlreadyFinalized(); /// @custom:oz-upgrades-unsafe-allow constructor constructor() { _disableInitializers(); } function initialize( address _masterChef, uint256 epochLength_, address _token ) public initializer { require(_masterChef != address(0), "Zero address chef"); require(_token != address(0), "Zero address token"); require(epochLength_ > VOTE_BUFFER_TIME * 2 + 1 hours, "Epoch too short"); __Ownable_init(msg.sender); __ReentrancyGuard_init(); masterChef = _masterChef; epochLength = epochLength_; votingToken = _token; meme = IMeme(_token); chef = IChef(_masterChef); } function vote(uint256 pid, uint256 amount) public { if (pid >= chef.poolLength()) revert InvalidPid(); if (votesLeft(msg.sender) < amount) revert InsufficientVotes(); if (amount > MAXIMUM_VOTE_AMOUNT) revert VoteAmountTooLarge(); if (isEpochSealed[Epoch]) revert EpochSealed(); if (block.timestamp >= lastEpoch + epochLength - VOTE_BUFFER_TIME) revert BufferPeriodTooEarly(); if (meme.isLockExpired(msg.sender)) {_unlockTokens(msg.sender);} _lockTokens(amount, msg.sender); (bool voted, uint256 voteId) = _hasVotedForEpoch(msg.sender, pid, Epoch); if (!voted) { userVotes[msg.sender][Epoch].push(votes(pid, amount, false)); } else { uint256 newTotal = userVotes[msg.sender][Epoch][voteId].amount + amount; if (newTotal > MAXIMUM_VOTE_AMOUNT) revert VoteAmountTooLarge(); userVotes[msg.sender][Epoch][voteId].amount = newTotal; } voteResults[Epoch][pid] += amount; voterTurnouts[Epoch] += amount; totalWeight += amount; emit VoteCast(msg.sender, pid, amount); } function multiVote(votes[] calldata Votes) external { uint256 length = Votes.length; uint256 poolLength = chef.poolLength(); bool[] memory seenPids = new bool[](poolLength); for (uint256 i; i < length; ++i) { uint256 pid = Votes[i].pid; if (pid >= poolLength) revert InvalidPid(); if (seenPids[pid]) revert DuplicatePid(); seenPids[pid] = true; vote(pid, Votes[i].amount); } } function bribe(uint256 pid, address reward, uint256 amount) external { if (!isBribeWhitelisted[reward]) revert BribeNotWhitelisted(); if (pid >= chef.poolLength()) revert InvalidPid(); if (amount < MINIMUM_BRIBE_AMOUNT) revert BribeTooSmall(); if (isEpochSealed[Epoch]) revert EpochSealed(); (bool isBribe, uint256 farmId) = _isBribe(reward, pid, Epoch); if (!isBribe && bribeRewards[Epoch][pid].length >= MAX_BRIBES_PER_POOL) { revert TooManyBribes(); } IERC20Upgradeable(reward).safeTransferFrom(msg.sender, address(this), amount); if (isBribe) { bribeRewards[Epoch][pid][farmId].amount += amount; } else { bribeRewards[Epoch][pid].push(bribeInfo(reward, Epoch, amount, 0)); } emit BribeAdded(reward, pid, Epoch, amount); } function startBuffer() external { if (block.timestamp < lastEpoch + epochLength - (VOTE_BUFFER_TIME * 2)) revert BufferPeriodTooEarly(); if (block.timestamp > lastEpoch + epochLength) revert BufferPeriodExpired(); if (isEpochSealed[Epoch]) revert EpochSealed(); isEpochSealed[Epoch] = true; bufferStart = block.timestamp; emit BufferPeriodStarted(Epoch, block.timestamp); } function flip() external { if (!isEpochSealed[Epoch]) revert EpochNotEnded(); if (isEpochFinalized[Epoch]) revert EpochAlreadyFinalized(); if (block.timestamp < bufferStart + VOTE_BUFFER_TIME) revert BufferPeriodTooEarly(); if (block.timestamp > bufferStart + MAX_BUFFER_TIME) revert BufferPeriodExpired(); if (bufferStart == 0) revert BufferNotStarted(); uint256 length = chef.poolLength(); if (length == 0) revert InvalidPid(); uint256 totalVotes = voterTurnouts[Epoch]; if (totalVotes == 0) revert ZeroVotes(); // Safe math for allocation points for (uint256 i; i < length; ++i) { uint256 votesForEpoch = voteResults[Epoch][i]; uint256 allocPoint; if (votesForEpoch > 0) { allocPoint = (votesForEpoch * MAX_ALLOC_POINTS) / totalVotes; if (allocPoint > MAX_ALLOC_POINTS) { allocPoint = MAX_ALLOC_POINTS; } } chef.set(i, allocPoint); } isEpochFinalized[Epoch] = true; emit EpochFinalized(Epoch, block.timestamp); uint256 newEpoch = Epoch + 1; Epoch = newEpoch; totalWeight = 0; lastEpoch = block.timestamp; bufferStart = 0; emit EpochFlipped(newEpoch, block.timestamp); } function claimEverything() external nonReentrant { uint256 latestClaim = lastClaim[msg.sender]; if (latestClaim >= Epoch) revert ClaimTooEarly(); uint256 claimStart = latestClaim + 1; uint256 claimEnd = Epoch; if (claimStart >= claimEnd) revert NoClaimableEpochs(); for (uint256 epochToClaim = claimStart; epochToClaim < claimEnd; epochToClaim++) { if (!isEpochFinalized[epochToClaim]) { emit ClaimSkipped(epochToClaim); continue; } uint256 length = userVotes[msg.sender][epochToClaim].length; bool hasUnclaimedVotes = false; for (uint256 i = 0; i < length; i++) { if (!userVotes[msg.sender][epochToClaim][i].claimed) { hasUnclaimedVotes = true; break; } } if (hasUnclaimedVotes) { _claimBribesForEpoch(epochToClaim); } else { emit ClaimSkipped(epochToClaim); } } lastClaim[msg.sender] = claimEnd - 1; } function claimBribes(uint256 epoch) public nonReentrant { if (epoch >= Epoch) revert EpochNotEnded(); if (!isEpochFinalized[epoch]) revert EpochNotEnded(); _claimBribesForEpoch(epoch); } function setWhitelistedBribe(address token, bool status) external onlyWhitelister { if (token == address(0)) revert InvalidEpoch(); isBribeWhitelisted[token] = status; emit BribeWhitelistUpdated(token, status); } function votesLeft(address user) public view returns(uint256) { return IERC20Upgradeable(votingToken).balanceOf(user) - votesUsed(user); } function votesUsed(address user) public view returns(uint256) { return userLocks[user]; } function pendingRewards(address user, uint256 pid, uint256 epoch) public view returns(bribeInfo[] memory) { uint256 bribeLength = bribeRewards[epoch][pid].length; bribeInfo[] memory bribes = new bribeInfo[](bribeLength); uint256 totalVotes = voteResults[epoch][pid]; if (totalVotes == 0) return bribes; uint256 amountVoted; (bool voted, uint256 voteId) = _hasVotedForEpoch(user, pid, epoch); if (voted) { amountVoted = userVotes[user][epoch][voteId].amount; } for (uint256 i; i < bribeLength; ++i) { bribeInfo storage _bribe = bribeRewards[epoch][pid][i]; uint256 unclaimedBribes = _bribe.amount - _bribe.claimed; if (unclaimedBribes > 0) { // Check for overflow in multiplication uint256 numerator = amountVoted * unclaimedBribes; if (numerator / amountVoted != unclaimedBribes) revert Overflow(); uint256 amountOwed = numerator / totalVotes; bribes[i] = bribeInfo(_bribe.reward, epoch, amountOwed, 0); } } return bribes; } function _claimBribesForEpoch(uint256 epoch) internal { uint256 length = userVotes[msg.sender][epoch].length; for (uint256 j; j < length; ++j) { if (userVotes[msg.sender][epoch][j].claimed) revert BribesAlreadyClaimed(); uint256 _pid = userVotes[msg.sender][epoch][j].pid; bribeInfo[] memory bribes = pendingRewards(msg.sender, _pid, epoch); // Mark as claimed before external calls userVotes[msg.sender][epoch][j].claimed = true; uint256 bribeLength = bribes.length; for (uint256 k; k < bribeLength; ++k) { if (bribes[k].amount > 0) { // Update claimed amount in storage bribeRewards[epoch][_pid][k].claimed += bribes[k].amount; // Transfer rewards IERC20Upgradeable(bribes[k].reward).safeTransfer(msg.sender, bribes[k].amount); emit BribeClaimed(msg.sender, epoch, _pid, bribes[k].reward, bribes[k].amount); } } } lastClaim[msg.sender] = epoch; } function _hasVotedForEpoch(address user, uint256 pid, uint256 epoch) internal view returns (bool voted, uint256 voteId) { uint256 length = userVotes[user][epoch].length; for (uint256 j; j < length; ++j) { if (pid == userVotes[user][epoch][j].pid) { return (true, j); } } return (false, 0); } function _lockTokens(uint256 amount, address user) internal { userLocks[user] += amount; meme.lockTokens(amount, user); } function _isBribe(address reward, uint256 pid, uint256 epoch) internal view returns (bool isBribe, uint256 farmId) { uint256 length = bribeRewards[epoch][pid].length; for (uint256 i; i < length; ++i) { if (bribeRewards[epoch][pid][i].reward == reward) { return (true, i); } } return (false, 0); } function unlockTokens(address user) external { if (msg.sender != votingToken) revert NotAuthorized(); uint256 currentLocks = userLocks[user]; if (currentLocks == 0) revert NoLocksToUnlock(); userLocks[user] = 0; } function _unlockTokens(address user) internal { uint256 currentLocks = userLocks[user]; if (currentLocks == 0) revert NoLocksToUnlock(); userLocks[user] = 0; } function getPID(address lp) public returns (uint256 _pid){ return chef.getPID(lp); } function _epochLength() external view returns(uint256) { return epochLength; } function _lastEpoch() external view returns (uint256){ return lastEpoch; } function setFirstEpoch(uint256 timestamp) external onlyOwner returns (bool VotesOpen) { require (lastEpoch == 0, "Already set"); lastEpoch = timestamp; return true; } modifier onlyWhitelister() { address _owner = owner(); require (msg.sender == _owner || msg.sender == masterChef , "Not Approved to Whitelist"); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BribeNotWhitelisted","type":"error"},{"inputs":[],"name":"BribeTooSmall","type":"error"},{"inputs":[],"name":"BribesAlreadyClaimed","type":"error"},{"inputs":[],"name":"BufferNotStarted","type":"error"},{"inputs":[],"name":"BufferPeriodExpired","type":"error"},{"inputs":[],"name":"BufferPeriodTooEarly","type":"error"},{"inputs":[],"name":"ClaimTooEarly","type":"error"},{"inputs":[],"name":"DivisionByZero","type":"error"},{"inputs":[],"name":"DuplicatePid","type":"error"},{"inputs":[],"name":"EpochAlreadyFinalized","type":"error"},{"inputs":[],"name":"EpochNotEnded","type":"error"},{"inputs":[],"name":"EpochSealed","type":"error"},{"inputs":[],"name":"InsufficientVotes","type":"error"},{"inputs":[],"name":"InvalidEpoch","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"InvalidPid","type":"error"},{"inputs":[],"name":"InvalidToken","type":"error"},{"inputs":[],"name":"NoClaimableEpochs","type":"error"},{"inputs":[],"name":"NoLocksToUnlock","type":"error"},{"inputs":[],"name":"NotAuthorized","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"Overflow","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"TooManyBribes","type":"error"},{"inputs":[],"name":"VoteAmountTooLarge","type":"error"},{"inputs":[],"name":"ZeroVotes","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BribeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BribeClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"BribeWhitelistUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"}],"name":"BufferPeriodStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"ClaimSkipped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"EpochFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newEpoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"EpochFlipped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","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":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"VoteCast","type":"event"},{"inputs":[],"name":"Epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_VOTE_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BRIBES_PER_POOL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BUFFER_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_BRIBE_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOTE_BUFFER_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_epochLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_lastEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"reward","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"bribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"bribeRewards","outputs":[{"internalType":"address","name":"reward","type":"address"},{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bufferStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chef","outputs":[{"internalType":"contract IChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"claimBribes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEverything","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"epochLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lp","type":"address"}],"name":"getPID","outputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_masterChef","type":"address"},{"internalType":"uint256","name":"epochLength_","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBribeWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isEpochFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isEpochSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterChef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"meme","outputs":[{"internalType":"contract IMeme","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"claimed","type":"bool"}],"internalType":"struct VoterUpgradeable.votes[]","name":"Votes","type":"tuple[]"}],"name":"multiVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"pendingRewards","outputs":[{"components":[{"internalType":"address","name":"reward","type":"address"},{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"}],"internalType":"struct VoterUpgradeable.bribeInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"setFirstEpoch","outputs":[{"internalType":"bool","name":"VotesOpen","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setWhitelistedBribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBuffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"unlockTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userLocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userVotes","outputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"claimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"voteResults","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"voterTurnouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"votesLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"votesUsed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561000f575f5ffd5b5061001e61002360201b60201c565b610183565b5f61003261012160201b60201c565b9050805f0160089054906101000a900460ff161561007c576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8016815f015f9054906101000a900467ffffffffffffffff1667ffffffffffffffff161461011e5767ffffffffffffffff815f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d267ffffffffffffffff604051610115919061016a565b60405180910390a15b50565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b5f67ffffffffffffffff82169050919050565b61016481610148565b82525050565b5f60208201905061017d5f83018461015b565b92915050565b6148fd806101905f395ff3fe608060405234801561000f575f5ffd5b5060043610610267575f3560e01c806372a66b691161014f578063b384abef116100c1578063cb67f94811610085578063cb67f9481461076a578063cc66985114610786578063cde4efa9146107b6578063e402ecb7146107c0578063e476f635146107dc578063f2fde38b146107fa57610267565b8063b384abef146106b4578063b683450a146106d0578063bf812ff214610700578063c14164d81461071e578063c350a1b51461074e57610267565b8063872447351161011357806387244735146105ee5780638cab882d1461060c5780638da5cb5b1461062a57806396c82e571461064857806397ec67ee14610666578063b03401231461069657610267565b806372a66b6914610531578063744b3b041461053b57806374604793146105595780637e0adc931461058c5780638049e17b146105bc57610267565b80633b6f064b116101e857806362e33bed116101ac57806362e33bed146104835780636747bea11461049f5780636c256980146104bd5780636e2ae98f146104d95780636f9874a414610509578063715018a61461052757610267565b80633b6f064b146103c957806344097c48146103f9578063575a86b21461041757806357d775f8146104355780635c16e15e1461045357610267565b80631c244b5b1161022f5780631c244b5b146103235780631fc8bc5d14610341578063290d24941461035f57806331ee02af14610369578063363cbae01461039957610267565b8063018f561f1461026b5780630259ef581461028757806306a4c983146102b75780630e74689b146102d557806310e9489514610305575b5f5ffd5b61028560048036038101906102809190613adc565b610816565b005b6102a1600480360381019061029c9190613b81565b610a0f565b6040516102ae9190613bc4565b60405180910390f35b6102bf610a24565b6040516102cc9190613bc4565b60405180910390f35b6102ef60048036038101906102ea9190613c07565b610a2a565b6040516102fc9190613d70565b60405180910390f35b61030d610cce565b60405161031a9190613bc4565b60405180910390f35b61032b610cd7565b6040516103389190613bc4565b60405180910390f35b610349610ce0565b6040516103569190613deb565b60405180910390f35b610367610d05565b005b610383600480360381019061037e9190613e04565b610e75565b6040516103909190613e49565b60405180910390f35b6103b360048036038101906103ae9190613b81565b610e92565b6040516103c09190613e49565b60405180910390f35b6103e360048036038101906103de9190613e62565b610eaf565b6040516103f09190613bc4565b60405180910390f35b610401610ecf565b60405161040e9190613ec0565b60405180910390f35b61041f610ef4565b60405161042c9190613ee8565b60405180910390f35b61043d610f19565b60405161044a9190613bc4565b60405180910390f35b61046d60048036038101906104689190613b81565b610f1f565b60405161047a9190613bc4565b60405180910390f35b61049d60048036038101906104989190613f2b565b610f34565b005b6104a7611110565b6040516104b49190613bc4565b60405180910390f35b6104d760048036038101906104d29190613e04565b61111f565b005b6104f360048036038101906104ee9190613e04565b6111ca565b6040516105009190613e49565b60405180910390f35b610511611227565b60405161051e9190613bc4565b60405180910390f35b61052f61122d565b005b610539611240565b005b61054361151b565b6040516105509190613bc4565b60405180910390f35b610573600480360381019061056e9190613f69565b611520565b6040516105839493929190613fb9565b60405180910390f35b6105a660048036038101906105a19190613e04565b611590565b6040516105b39190613bc4565b60405180910390f35b6105d660048036038101906105d19190613c07565b6115a5565b6040516105e593929190613ffc565b60405180910390f35b6105f66115fc565b6040516106039190613bc4565b60405180910390f35b610614611602565b6040516106219190613bc4565b60405180910390f35b61063261160e565b60405161063f9190613ee8565b60405180910390f35b610650611643565b60405161065d9190613bc4565b60405180910390f35b610680600480360381019061067b9190613e04565b611649565b60405161068d9190613e49565b60405180910390f35b61069e611666565b6040516106ab9190613ee8565b60405180910390f35b6106ce60048036038101906106c99190613e62565b61168b565b005b6106ea60048036038101906106e59190613b81565b611c1e565b6040516106f79190613bc4565b60405180910390f35b610708611cc0565b6040516107159190613bc4565b60405180910390f35b61073860048036038101906107339190613b81565b611cc6565b6040516107459190613bc4565b60405180910390f35b61076860048036038101906107639190614031565b611d0c565b005b610784600480360381019061077f9190613b81565b6120d7565b005b6107a0600480360381019061079b9190613b81565b61221d565b6040516107ad9190613bc4565b60405180910390f35b6107be6122d1565b005b6107da60048036038101906107d59190614081565b612731565b005b6107e4612b5e565b6040516107f19190613bc4565b60405180910390f35b610814600480360381019061080f9190613b81565b612b64565b005b5f8282905090505f60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610888573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ac91906140e5565b90505f8167ffffffffffffffff8111156108c9576108c8614110565b5b6040519080825280602002602001820160405280156108f75781602001602082028036833780820191505090505b5090505f5b83811015610a07575f8686838181106109185761091761413d565b5b9050606002015f0135905083811061095c576040517f87e8068300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82818151811061096f5761096e61413d565b5b6020026020010151156109ae576040517fae96cf7f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018382815181106109c3576109c261413d565b5b6020026020010190151590811515815250506109fb818888858181106109ec576109eb61413d565b5b9050606002016020013561168b565b508060010190506108fc565b505050505050565b6049602052805f5260405f205f915090505481565b60415481565b60605f604d5f8481526020019081526020015f205f8581526020019081526020015f208054905090505f8167ffffffffffffffff811115610a6e57610a6d614110565b5b604051908082528060200260200182016040528015610aa757816020015b610a94613a39565b815260200190600190039081610a8c5790505b5090505f604c5f8681526020019081526020015f205f8781526020019081526020015f205490505f8103610ae057819350505050610cc7565b5f5f5f610aee8a8a8a612be8565b915091508115610b6957604e5f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8981526020019081526020015f208181548110610b5657610b5561413d565b5b905f5260205f2090600302016001015492505b5f5b86811015610cbc575f604d5f8b81526020019081526020015f205f8c81526020019081526020015f208281548110610ba657610ba561413d565b5b905f5260205f20906004020190505f81600301548260020154610bc99190614197565b90505f811115610caf575f8187610be091906141ca565b9050818782610bef9190614238565b14610c26576040517f35278d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8882610c339190614238565b90506040518060800160405280855f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018e81526020018281526020015f8152508a8681518110610ca157610ca061413d565b5b602002602001018190525050505b5050806001019050610b6b565b508496505050505050505b9392505050565b5f604154905090565b5f604254905090565b60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002610e10610d1491906141ca565b604254604154610d249190614268565b610d2e9190614197565b421015610d67576040517fa38d960e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604254604154610d779190614268565b421115610db0576040517f7f54044100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604f5f60445481526020019081526020015f205f9054906101000a900460ff1615610e07576040517f1ac9b04c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001604f5f60445481526020019081526020015f205f6101000a81548160ff021916908315150217905550426045819055506044547f38726a7c4990228ceea18e072f773791ed75a63e2ea835e78dd89df680e2aa8c42604051610e6b9190613bc4565b60405180910390a2565b6050602052805f5260405f205f915054906101000a900460ff1681565b6048602052805f5260405f205f915054906101000a900460ff1681565b604c602052815f5260405f20602052805f5260405f205f91509150505481565b60465f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b603f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60425481565b604b602052805f5260405f205f915090505481565b5f610f3d61160e565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610fc55750603f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffb906142f5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611069576040517fd5b25b6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160485f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff167fd793fd780e30a609bf1357c38ccaff5af874b132935bac8bc80317d3f8fc4e4e836040516111039190613e49565b60405180910390a2505050565b6a22bdd88fed9efc6a00000081565b611127612ce4565b6044548110611162576040517f756b785700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60505f8281526020019081526020015f205f9054906101000a900460ff166111b6576040517f756b785700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111bf81612d31565b6111c7613141565b50565b5f6111d361314a565b5f60415414611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e9061435d565b60405180910390fd5b8160418190555060019050919050565b60445481565b61123561314a565b61123e5f6131d1565b565b611248612ce4565b5f604b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905060445481106112c4576040517f1613b7eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6001826112d29190614268565b90505f6044549050808210611313576040517fa697924200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8290505b818110156114bf5760505f8281526020019081526020015f205f9054906101000a900460ff1661137457807fe8ed8f956761ef5e04d522658afd165a8d389ce08c465bf7aacab9f4fe402c0d60405160405180910390a26114b2565b5f604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f208054905090505f5f90505f5f90505b8281101561146c57604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f2081815481106114365761143561413d565b5b905f5260205f2090600302016002015f9054906101000a900460ff1661145f576001915061146c565b80806001019150506113d0565b5080156114815761147c83612d31565b6114af565b827fe8ed8f956761ef5e04d522658afd165a8d389ce08c465bf7aacab9f4fe402c0d60405160405180910390a25b50505b8080600101915050611318565b506001816114cd9190614197565b604b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505050611519613141565b565b600a81565b604d602052825f5260405f20602052815f5260405f208181548110611543575f80fd5b905f5260205f2090600402015f925092505050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b604a602052805f5260405f205f915090505481565b604e602052825f5260405f20602052815f5260405f2081815481106115c8575f80fd5b905f5260205f2090600302015f925092505050805f015490806001015490806002015f9054906101000a900460ff16905083565b610e1081565b670de0b6b3a764000081565b5f5f6116186132a2565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b60435481565b604f602052805f5260405f205f915054906101000a900460ff1681565b60405f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f5573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061171991906140e5565b8210611751576040517f87e8068300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061175b3361221d565b1015611793576040517f60900ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6a22bdd88fed9efc6a0000008111156117d8576040517f7b684d0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604f5f60445481526020019081526020015f205f9054906101000a900460ff161561182f576040517f1ac9b04c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e106042546041546118429190614268565b61184c9190614197565b4210611884576040517fa38d960e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60465f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b9d50832336040518263ffffffff1660e01b81526004016118de9190613ee8565b602060405180830381865afa1580156118f9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061191d919061438f565b1561192c5761192b336132c9565b5b6119368133613389565b5f5f6119453385604454612be8565b9150915081611a1757604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60445481526020019081526020015f2060405180606001604052808681526020018581526020015f1515815250908060018154018082558091505060019003905f5260205f2090600302015f909190919091505f820151815f0155602082015181600101556040820151816002015f6101000a81548160ff0219169083151502179055505050611b50565b5f83604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60445481526020019081526020015f208381548110611a7957611a7861413d565b5b905f5260205f20906003020160010154611a939190614268565b90506a22bdd88fed9efc6a000000811115611ada576040517f7b684d0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60445481526020019081526020015f208381548110611b3b57611b3a61413d565b5b905f5260205f20906003020160010181905550505b82604c5f60445481526020019081526020015f205f8681526020019081526020015f205f828254611b819190614268565b9250508190555082604a5f60445481526020019081526020015f205f828254611baa9190614268565b925050819055508260435f828254611bc29190614268565b92505081905550833373ffffffffffffffffffffffffffffffffffffffff167fb4cfecf70861b7b150d8337780d34fb4cbc2114b5fb1fe51a5c5fca1849f727485604051611c109190613bc4565b60405180910390a350505050565b5f60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b683450a836040518263ffffffff1660e01b8152600401611c799190613ee8565b6020604051808303815f875af1158015611c95573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cb991906140e5565b9050919050565b61384081565b5f60495f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f611d15613469565b90505f815f0160089054906101000a900460ff161590505f825f015f9054906101000a900467ffffffffffffffff1690505f5f8267ffffffffffffffff16148015611d5d5750825b90505f60018367ffffffffffffffff16148015611d9057505f3073ffffffffffffffffffffffffffffffffffffffff163b145b905081158015611d9e575080155b15611dd5576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001855f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508315611e22576001855f0160086101000a81548160ff0219169083151502179055505b5f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1603611e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8790614404565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef59061446c565b60405180910390fd5b610e106002610e10611f1091906141ca565b611f1a9190614268565b8711611f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f52906144d4565b60405180910390fd5b611f6433613490565b611f6c6134a4565b87603f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550866042819055508560405f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560465f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508760475f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083156120cd575f855f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d260016040516120c4919061453e565b60405180910390a15b5050505050505050565b60405f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461215d576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60495f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f81036121d7576040517f4a067ce300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60495f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505050565b5f61222782611cc6565b60405f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016122819190613ee8565b602060405180830381865afa15801561229c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122c091906140e5565b6122ca9190614197565b9050919050565b604f5f60445481526020019081526020015f205f9054906101000a900460ff16612327576040517f756b785700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60505f60445481526020019081526020015f205f9054906101000a900460ff161561237e576040517f3366263c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e1060455461238e9190614268565b4210156123c7576040517fa38d960e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6138406045546123d79190614268565b421115612410576040517f7f54044100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6045540361244b576040517fe1a6d15600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124da91906140e5565b90505f8103612515576040517f87e8068300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604a5f60445481526020019081526020015f205490505f8103612565576040517fcdad98fd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b82811015612660575f604c5f60445481526020019081526020015f205f8381526020019081526020015f205490505f5f8211156125ca5783610fa0836125ad91906141ca565b6125b79190614238565b9050610fa08111156125c957610fa090505b5b60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ab06ee584836040518363ffffffff1660e01b8152600401612626929190614557565b5f604051808303815f87803b15801561263d575f5ffd5b505af115801561264f573d5f5f3e3d5ffd5b505050505050806001019050612567565b50600160505f60445481526020019081526020015f205f6101000a81548160ff0219169083151502179055506044547f6debf9c0b8bd7ecda40db89a2641f61251d80a576b5c5e5f06de7f1c2a65850a426040516126be9190613bc4565b60405180910390a25f60016044546126d69190614268565b9050806044819055505f604381905550426041819055505f604581905550807f0339a014b2a3d6abc2fc06f1b5012e5d2f000c05e177344349717baaea6c4a6e426040516127249190613bc4565b60405180910390a2505050565b60485f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166127b1576040517ffb9b7df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561281b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061283f91906140e5565b8310612877576040517f87e8068300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b670de0b6b3a76400008110156128b9576040517fc978b25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604f5f60445481526020019081526020015f205f9054906101000a900460ff1615612910576040517f1ac9b04c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f61291f84866044546134b6565b91509150811580156129575750600a604d5f60445481526020019081526020015f205f8781526020019081526020015f208054905010155b1561298e576040517f86bd0d8100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129bb3330858773ffffffffffffffffffffffffffffffffffffffff166135a5909392919063ffffffff16565b8115612a1f5782604d5f60445481526020019081526020015f205f8781526020019081526020015f2082815481106129f6576129f561413d565b5b905f5260205f2090600402016002015f828254612a139190614268565b92505081905550612b05565b604d5f60445481526020019081526020015f205f8681526020019081526020015f2060405180608001604052808673ffffffffffffffffffffffffffffffffffffffff16815260200160445481526020018581526020015f815250908060018154018082558091505060019003905f5260205f2090600402015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015550505b604454858573ffffffffffffffffffffffffffffffffffffffff167f53d7e12b48de8b91fcdb4f254d62b1a73b83ce93def79899dba9a49f630319d486604051612b4f9190613bc4565b60405180910390a45050505050565b60455481565b612b6c61314a565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612bdc575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401612bd39190613ee8565b60405180910390fd5b612be5816131d1565b50565b5f5f5f604e5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f208054905090505f5b81811015612cd357604e5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8681526020019081526020015f208181548110612ca557612ca461413d565b5b905f5260205f2090600302015f01548603612cc857600181935093505050612cdc565b806001019050612c3f565b505f5f92509250505b935093915050565b60025f5403612d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1f906145c8565b60405180910390fd5b60025f81905550565b5f604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f208054905090505f5b818110156130fa57604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f208181548110612dec57612deb61413d565b5b905f5260205f2090600302016002015f9054906101000a900460ff1615612e3f576040517f23eb246c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f208281548110612e9e57612e9d61413d565b5b905f5260205f2090600302015f015490505f612ebb338387610a2a565b90506001604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8781526020019081526020015f208481548110612f1d57612f1c61413d565b5b905f5260205f2090600302016002015f6101000a81548160ff0219169083151502179055505f815190505f5b818110156130eb575f838281518110612f6557612f6461413d565b5b60200260200101516040015111156130e057828181518110612f8a57612f8961413d565b5b602002602001015160400151604d5f8981526020019081526020015f205f8681526020019081526020015f208281548110612fc857612fc761413d565b5b905f5260205f2090600402016003015f828254612fe59190614268565b92505081905550613052338483815181106130035761300261413d565b5b6020026020010151604001518584815181106130225761302161413d565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1661362e9092919063ffffffff16565b83873373ffffffffffffffffffffffffffffffffffffffff167f8f62d91ae48a7294bb9327b1e922ff909fa07eed33dbf02378ab8b2e26c1a7a886858151811061309f5761309e61413d565b5b60200260200101515f01518786815181106130bd576130bc61413d565b5b6020026020010151604001516040516130d79291906145e6565b60405180910390a45b806001019050612f49565b50505050806001019050612d86565b5081604b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505050565b60015f81905550565b6131526136b4565b73ffffffffffffffffffffffffffffffffffffffff1661317061160e565b73ffffffffffffffffffffffffffffffffffffffff16146131cf576131936136b4565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016131c69190613ee8565b60405180910390fd5b565b5f6131da6132a2565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b5f60495f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f8103613343576040517f4a067ce300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60495f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505050565b8160495f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546133d59190614268565b9250508190555060465f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aa68acde83836040518363ffffffff1660e01b815260040161343892919061460d565b5f604051808303815f87803b15801561344f575f5ffd5b505af1158015613461573d5f5f3e3d5ffd5b505050505050565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b6134986136bb565b6134a1816136fb565b50565b6134ac6136bb565b6134b461377f565b565b5f5f5f604d5f8581526020019081526020015f205f8681526020019081526020015f208054905090505f5b81811015613594578673ffffffffffffffffffffffffffffffffffffffff16604d5f8781526020019081526020015f205f8881526020019081526020015f2082815481106135325761353161413d565b5b905f5260205f2090600402015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036135895760018193509350505061359d565b8060010190506134e1565b505f5f92509250505b935093915050565b613628846323b872dd60e01b8585856040516024016135c693929190614634565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613790565b50505050565b6136af8363a9059cbb60e01b848460405160240161364d9291906145e6565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613790565b505050565b5f33905090565b6136c3613856565b6136f9576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6137036136bb565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613773575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161376a9190613ee8565b60405180910390fd5b61377c816131d1565b50565b6137876136bb565b60015f81905550565b5f6137f1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166138749092919063ffffffff16565b90505f81511480613812575080806020019051810190613811919061438f565b5b613851576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613848906146d9565b60405180910390fd5b505050565b5f61385f613469565b5f0160089054906101000a900460ff16905090565b606061388284845f8561388b565b90509392505050565b6060824710156138d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138c790614767565b60405180910390fd5b5f5f8673ffffffffffffffffffffffffffffffffffffffff1685876040516138f891906147d7565b5f6040518083038185875af1925050503d805f8114613932576040519150601f19603f3d011682016040523d82523d5f602084013e613937565b606091505b509150915061394887838387613954565b92505050949350505050565b606083156139b5575f8351036139ad5761396d856139c8565b6139ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139a390614837565b60405180910390fd5b5b8290506139c0565b6139bf83836139ea565b5b949350505050565b5f5f8273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f825111156139fc5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3091906148a7565b60405180910390fd5b60405180608001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81525090565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f840112613a9c57613a9b613a7b565b5b8235905067ffffffffffffffff811115613ab957613ab8613a7f565b5b602083019150836060820283011115613ad557613ad4613a83565b5b9250929050565b5f5f60208385031215613af257613af1613a73565b5b5f83013567ffffffffffffffff811115613b0f57613b0e613a77565b5b613b1b85828601613a87565b92509250509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613b5082613b27565b9050919050565b613b6081613b46565b8114613b6a575f5ffd5b50565b5f81359050613b7b81613b57565b92915050565b5f60208284031215613b9657613b95613a73565b5b5f613ba384828501613b6d565b91505092915050565b5f819050919050565b613bbe81613bac565b82525050565b5f602082019050613bd75f830184613bb5565b92915050565b613be681613bac565b8114613bf0575f5ffd5b50565b5f81359050613c0181613bdd565b92915050565b5f5f5f60608486031215613c1e57613c1d613a73565b5b5f613c2b86828701613b6d565b9350506020613c3c86828701613bf3565b9250506040613c4d86828701613bf3565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613c8981613b46565b82525050565b613c9881613bac565b82525050565b608082015f820151613cb25f850182613c80565b506020820151613cc56020850182613c8f565b506040820151613cd86040850182613c8f565b506060820151613ceb6060850182613c8f565b50505050565b5f613cfc8383613c9e565b60808301905092915050565b5f602082019050919050565b5f613d1e82613c57565b613d288185613c61565b9350613d3383613c71565b805f5b83811015613d63578151613d4a8882613cf1565b9750613d5583613d08565b925050600181019050613d36565b5085935050505092915050565b5f6020820190508181035f830152613d888184613d14565b905092915050565b5f819050919050565b5f613db3613dae613da984613b27565b613d90565b613b27565b9050919050565b5f613dc482613d99565b9050919050565b5f613dd582613dba565b9050919050565b613de581613dcb565b82525050565b5f602082019050613dfe5f830184613ddc565b92915050565b5f60208284031215613e1957613e18613a73565b5b5f613e2684828501613bf3565b91505092915050565b5f8115159050919050565b613e4381613e2f565b82525050565b5f602082019050613e5c5f830184613e3a565b92915050565b5f5f60408385031215613e7857613e77613a73565b5b5f613e8585828601613bf3565b9250506020613e9685828601613bf3565b9150509250929050565b5f613eaa82613dba565b9050919050565b613eba81613ea0565b82525050565b5f602082019050613ed35f830184613eb1565b92915050565b613ee281613b46565b82525050565b5f602082019050613efb5f830184613ed9565b92915050565b613f0a81613e2f565b8114613f14575f5ffd5b50565b5f81359050613f2581613f01565b92915050565b5f5f60408385031215613f4157613f40613a73565b5b5f613f4e85828601613b6d565b9250506020613f5f85828601613f17565b9150509250929050565b5f5f5f60608486031215613f8057613f7f613a73565b5b5f613f8d86828701613bf3565b9350506020613f9e86828701613bf3565b9250506040613faf86828701613bf3565b9150509250925092565b5f608082019050613fcc5f830187613ed9565b613fd96020830186613bb5565b613fe66040830185613bb5565b613ff36060830184613bb5565b95945050505050565b5f60608201905061400f5f830186613bb5565b61401c6020830185613bb5565b6140296040830184613e3a565b949350505050565b5f5f5f6060848603121561404857614047613a73565b5b5f61405586828701613b6d565b935050602061406686828701613bf3565b925050604061407786828701613b6d565b9150509250925092565b5f5f5f6060848603121561409857614097613a73565b5b5f6140a586828701613bf3565b93505060206140b686828701613b6d565b92505060406140c786828701613bf3565b9150509250925092565b5f815190506140df81613bdd565b92915050565b5f602082840312156140fa576140f9613a73565b5b5f614107848285016140d1565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6141a182613bac565b91506141ac83613bac565b92508282039050818111156141c4576141c361416a565b5b92915050565b5f6141d482613bac565b91506141df83613bac565b92508282026141ed81613bac565b915082820484148315176142045761420361416a565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61424282613bac565b915061424d83613bac565b92508261425d5761425c61420b565b5b828204905092915050565b5f61427282613bac565b915061427d83613bac565b92508282019050808211156142955761429461416a565b5b92915050565b5f82825260208201905092915050565b7f4e6f7420417070726f76656420746f2057686974656c697374000000000000005f82015250565b5f6142df60198361429b565b91506142ea826142ab565b602082019050919050565b5f6020820190508181035f83015261430c816142d3565b9050919050565b7f416c7265616479207365740000000000000000000000000000000000000000005f82015250565b5f614347600b8361429b565b915061435282614313565b602082019050919050565b5f6020820190508181035f8301526143748161433b565b9050919050565b5f8151905061438981613f01565b92915050565b5f602082840312156143a4576143a3613a73565b5b5f6143b18482850161437b565b91505092915050565b7f5a65726f206164647265737320636865660000000000000000000000000000005f82015250565b5f6143ee60118361429b565b91506143f9826143ba565b602082019050919050565b5f6020820190508181035f83015261441b816143e2565b9050919050565b7f5a65726f206164647265737320746f6b656e00000000000000000000000000005f82015250565b5f61445660128361429b565b915061446182614422565b602082019050919050565b5f6020820190508181035f8301526144838161444a565b9050919050565b7f45706f636820746f6f2073686f727400000000000000000000000000000000005f82015250565b5f6144be600f8361429b565b91506144c98261448a565b602082019050919050565b5f6020820190508181035f8301526144eb816144b2565b9050919050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f61452861452361451e846144f2565b613d90565b6144fb565b9050919050565b6145388161450e565b82525050565b5f6020820190506145515f83018461452f565b92915050565b5f60408201905061456a5f830185613bb5565b6145776020830184613bb5565b9392505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6145b2601f8361429b565b91506145bd8261457e565b602082019050919050565b5f6020820190508181035f8301526145df816145a6565b9050919050565b5f6040820190506145f95f830185613ed9565b6146066020830184613bb5565b9392505050565b5f6040820190506146205f830185613bb5565b61462d6020830184613ed9565b9392505050565b5f6060820190506146475f830186613ed9565b6146546020830185613ed9565b6146616040830184613bb5565b949350505050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f6146c3602a8361429b565b91506146ce82614669565b604082019050919050565b5f6020820190508181035f8301526146f0816146b7565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f61475160268361429b565b915061475c826146f7565b604082019050919050565b5f6020820190508181035f83015261477e81614745565b9050919050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f6147b182614785565b6147bb818561478f565b93506147cb818560208601614799565b80840191505092915050565b5f6147e282846147a7565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f614821601d8361429b565b915061482c826147ed565b602082019050919050565b5f6020820190508181035f83015261484e81614815565b9050919050565b5f81519050919050565b5f601f19601f8301169050919050565b5f61487982614855565b614883818561429b565b9350614893818560208601614799565b61489c8161485f565b840191505092915050565b5f6020820190508181035f8301526148bf818461486f565b90509291505056fea2646970667358221220c6aaaf92aea2ee86c8cd550b71b62b61b1577d6044eb507334006ac19aba2b4064736f6c634300081b0033
Deployed Bytecode
0x608060405234801561000f575f5ffd5b5060043610610267575f3560e01c806372a66b691161014f578063b384abef116100c1578063cb67f94811610085578063cb67f9481461076a578063cc66985114610786578063cde4efa9146107b6578063e402ecb7146107c0578063e476f635146107dc578063f2fde38b146107fa57610267565b8063b384abef146106b4578063b683450a146106d0578063bf812ff214610700578063c14164d81461071e578063c350a1b51461074e57610267565b8063872447351161011357806387244735146105ee5780638cab882d1461060c5780638da5cb5b1461062a57806396c82e571461064857806397ec67ee14610666578063b03401231461069657610267565b806372a66b6914610531578063744b3b041461053b57806374604793146105595780637e0adc931461058c5780638049e17b146105bc57610267565b80633b6f064b116101e857806362e33bed116101ac57806362e33bed146104835780636747bea11461049f5780636c256980146104bd5780636e2ae98f146104d95780636f9874a414610509578063715018a61461052757610267565b80633b6f064b146103c957806344097c48146103f9578063575a86b21461041757806357d775f8146104355780635c16e15e1461045357610267565b80631c244b5b1161022f5780631c244b5b146103235780631fc8bc5d14610341578063290d24941461035f57806331ee02af14610369578063363cbae01461039957610267565b8063018f561f1461026b5780630259ef581461028757806306a4c983146102b75780630e74689b146102d557806310e9489514610305575b5f5ffd5b61028560048036038101906102809190613adc565b610816565b005b6102a1600480360381019061029c9190613b81565b610a0f565b6040516102ae9190613bc4565b60405180910390f35b6102bf610a24565b6040516102cc9190613bc4565b60405180910390f35b6102ef60048036038101906102ea9190613c07565b610a2a565b6040516102fc9190613d70565b60405180910390f35b61030d610cce565b60405161031a9190613bc4565b60405180910390f35b61032b610cd7565b6040516103389190613bc4565b60405180910390f35b610349610ce0565b6040516103569190613deb565b60405180910390f35b610367610d05565b005b610383600480360381019061037e9190613e04565b610e75565b6040516103909190613e49565b60405180910390f35b6103b360048036038101906103ae9190613b81565b610e92565b6040516103c09190613e49565b60405180910390f35b6103e360048036038101906103de9190613e62565b610eaf565b6040516103f09190613bc4565b60405180910390f35b610401610ecf565b60405161040e9190613ec0565b60405180910390f35b61041f610ef4565b60405161042c9190613ee8565b60405180910390f35b61043d610f19565b60405161044a9190613bc4565b60405180910390f35b61046d60048036038101906104689190613b81565b610f1f565b60405161047a9190613bc4565b60405180910390f35b61049d60048036038101906104989190613f2b565b610f34565b005b6104a7611110565b6040516104b49190613bc4565b60405180910390f35b6104d760048036038101906104d29190613e04565b61111f565b005b6104f360048036038101906104ee9190613e04565b6111ca565b6040516105009190613e49565b60405180910390f35b610511611227565b60405161051e9190613bc4565b60405180910390f35b61052f61122d565b005b610539611240565b005b61054361151b565b6040516105509190613bc4565b60405180910390f35b610573600480360381019061056e9190613f69565b611520565b6040516105839493929190613fb9565b60405180910390f35b6105a660048036038101906105a19190613e04565b611590565b6040516105b39190613bc4565b60405180910390f35b6105d660048036038101906105d19190613c07565b6115a5565b6040516105e593929190613ffc565b60405180910390f35b6105f66115fc565b6040516106039190613bc4565b60405180910390f35b610614611602565b6040516106219190613bc4565b60405180910390f35b61063261160e565b60405161063f9190613ee8565b60405180910390f35b610650611643565b60405161065d9190613bc4565b60405180910390f35b610680600480360381019061067b9190613e04565b611649565b60405161068d9190613e49565b60405180910390f35b61069e611666565b6040516106ab9190613ee8565b60405180910390f35b6106ce60048036038101906106c99190613e62565b61168b565b005b6106ea60048036038101906106e59190613b81565b611c1e565b6040516106f79190613bc4565b60405180910390f35b610708611cc0565b6040516107159190613bc4565b60405180910390f35b61073860048036038101906107339190613b81565b611cc6565b6040516107459190613bc4565b60405180910390f35b61076860048036038101906107639190614031565b611d0c565b005b610784600480360381019061077f9190613b81565b6120d7565b005b6107a0600480360381019061079b9190613b81565b61221d565b6040516107ad9190613bc4565b60405180910390f35b6107be6122d1565b005b6107da60048036038101906107d59190614081565b612731565b005b6107e4612b5e565b6040516107f19190613bc4565b60405180910390f35b610814600480360381019061080f9190613b81565b612b64565b005b5f8282905090505f60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610888573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ac91906140e5565b90505f8167ffffffffffffffff8111156108c9576108c8614110565b5b6040519080825280602002602001820160405280156108f75781602001602082028036833780820191505090505b5090505f5b83811015610a07575f8686838181106109185761091761413d565b5b9050606002015f0135905083811061095c576040517f87e8068300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82818151811061096f5761096e61413d565b5b6020026020010151156109ae576040517fae96cf7f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018382815181106109c3576109c261413d565b5b6020026020010190151590811515815250506109fb818888858181106109ec576109eb61413d565b5b9050606002016020013561168b565b508060010190506108fc565b505050505050565b6049602052805f5260405f205f915090505481565b60415481565b60605f604d5f8481526020019081526020015f205f8581526020019081526020015f208054905090505f8167ffffffffffffffff811115610a6e57610a6d614110565b5b604051908082528060200260200182016040528015610aa757816020015b610a94613a39565b815260200190600190039081610a8c5790505b5090505f604c5f8681526020019081526020015f205f8781526020019081526020015f205490505f8103610ae057819350505050610cc7565b5f5f5f610aee8a8a8a612be8565b915091508115610b6957604e5f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8981526020019081526020015f208181548110610b5657610b5561413d565b5b905f5260205f2090600302016001015492505b5f5b86811015610cbc575f604d5f8b81526020019081526020015f205f8c81526020019081526020015f208281548110610ba657610ba561413d565b5b905f5260205f20906004020190505f81600301548260020154610bc99190614197565b90505f811115610caf575f8187610be091906141ca565b9050818782610bef9190614238565b14610c26576040517f35278d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8882610c339190614238565b90506040518060800160405280855f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018e81526020018281526020015f8152508a8681518110610ca157610ca061413d565b5b602002602001018190525050505b5050806001019050610b6b565b508496505050505050505b9392505050565b5f604154905090565b5f604254905090565b60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002610e10610d1491906141ca565b604254604154610d249190614268565b610d2e9190614197565b421015610d67576040517fa38d960e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604254604154610d779190614268565b421115610db0576040517f7f54044100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604f5f60445481526020019081526020015f205f9054906101000a900460ff1615610e07576040517f1ac9b04c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001604f5f60445481526020019081526020015f205f6101000a81548160ff021916908315150217905550426045819055506044547f38726a7c4990228ceea18e072f773791ed75a63e2ea835e78dd89df680e2aa8c42604051610e6b9190613bc4565b60405180910390a2565b6050602052805f5260405f205f915054906101000a900460ff1681565b6048602052805f5260405f205f915054906101000a900460ff1681565b604c602052815f5260405f20602052805f5260405f205f91509150505481565b60465f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b603f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60425481565b604b602052805f5260405f205f915090505481565b5f610f3d61160e565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610fc55750603f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffb906142f5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611069576040517fd5b25b6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160485f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff167fd793fd780e30a609bf1357c38ccaff5af874b132935bac8bc80317d3f8fc4e4e836040516111039190613e49565b60405180910390a2505050565b6a22bdd88fed9efc6a00000081565b611127612ce4565b6044548110611162576040517f756b785700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60505f8281526020019081526020015f205f9054906101000a900460ff166111b6576040517f756b785700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111bf81612d31565b6111c7613141565b50565b5f6111d361314a565b5f60415414611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e9061435d565b60405180910390fd5b8160418190555060019050919050565b60445481565b61123561314a565b61123e5f6131d1565b565b611248612ce4565b5f604b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905060445481106112c4576040517f1613b7eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6001826112d29190614268565b90505f6044549050808210611313576040517fa697924200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8290505b818110156114bf5760505f8281526020019081526020015f205f9054906101000a900460ff1661137457807fe8ed8f956761ef5e04d522658afd165a8d389ce08c465bf7aacab9f4fe402c0d60405160405180910390a26114b2565b5f604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f208054905090505f5f90505f5f90505b8281101561146c57604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f2081815481106114365761143561413d565b5b905f5260205f2090600302016002015f9054906101000a900460ff1661145f576001915061146c565b80806001019150506113d0565b5080156114815761147c83612d31565b6114af565b827fe8ed8f956761ef5e04d522658afd165a8d389ce08c465bf7aacab9f4fe402c0d60405160405180910390a25b50505b8080600101915050611318565b506001816114cd9190614197565b604b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505050611519613141565b565b600a81565b604d602052825f5260405f20602052815f5260405f208181548110611543575f80fd5b905f5260205f2090600402015f925092505050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b604a602052805f5260405f205f915090505481565b604e602052825f5260405f20602052815f5260405f2081815481106115c8575f80fd5b905f5260205f2090600302015f925092505050805f015490806001015490806002015f9054906101000a900460ff16905083565b610e1081565b670de0b6b3a764000081565b5f5f6116186132a2565b9050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b60435481565b604f602052805f5260405f205f915054906101000a900460ff1681565b60405f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f5573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061171991906140e5565b8210611751576040517f87e8068300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8061175b3361221d565b1015611793576040517f60900ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6a22bdd88fed9efc6a0000008111156117d8576040517f7b684d0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604f5f60445481526020019081526020015f205f9054906101000a900460ff161561182f576040517f1ac9b04c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e106042546041546118429190614268565b61184c9190614197565b4210611884576040517fa38d960e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60465f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b9d50832336040518263ffffffff1660e01b81526004016118de9190613ee8565b602060405180830381865afa1580156118f9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061191d919061438f565b1561192c5761192b336132c9565b5b6119368133613389565b5f5f6119453385604454612be8565b9150915081611a1757604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60445481526020019081526020015f2060405180606001604052808681526020018581526020015f1515815250908060018154018082558091505060019003905f5260205f2090600302015f909190919091505f820151815f0155602082015181600101556040820151816002015f6101000a81548160ff0219169083151502179055505050611b50565b5f83604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60445481526020019081526020015f208381548110611a7957611a7861413d565b5b905f5260205f20906003020160010154611a939190614268565b90506a22bdd88fed9efc6a000000811115611ada576040517f7b684d0f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60445481526020019081526020015f208381548110611b3b57611b3a61413d565b5b905f5260205f20906003020160010181905550505b82604c5f60445481526020019081526020015f205f8681526020019081526020015f205f828254611b819190614268565b9250508190555082604a5f60445481526020019081526020015f205f828254611baa9190614268565b925050819055508260435f828254611bc29190614268565b92505081905550833373ffffffffffffffffffffffffffffffffffffffff167fb4cfecf70861b7b150d8337780d34fb4cbc2114b5fb1fe51a5c5fca1849f727485604051611c109190613bc4565b60405180910390a350505050565b5f60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b683450a836040518263ffffffff1660e01b8152600401611c799190613ee8565b6020604051808303815f875af1158015611c95573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cb991906140e5565b9050919050565b61384081565b5f60495f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f611d15613469565b90505f815f0160089054906101000a900460ff161590505f825f015f9054906101000a900467ffffffffffffffff1690505f5f8267ffffffffffffffff16148015611d5d5750825b90505f60018367ffffffffffffffff16148015611d9057505f3073ffffffffffffffffffffffffffffffffffffffff163b145b905081158015611d9e575080155b15611dd5576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001855f015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508315611e22576001855f0160086101000a81548160ff0219169083151502179055505b5f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1603611e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8790614404565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603611efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef59061446c565b60405180910390fd5b610e106002610e10611f1091906141ca565b611f1a9190614268565b8711611f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f52906144d4565b60405180910390fd5b611f6433613490565b611f6c6134a4565b87603f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550866042819055508560405f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560465f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508760475f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083156120cd575f855f0160086101000a81548160ff0219169083151502179055507fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d260016040516120c4919061453e565b60405180910390a15b5050505050505050565b60405f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461215d576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60495f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f81036121d7576040517f4a067ce300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60495f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505050565b5f61222782611cc6565b60405f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016122819190613ee8565b602060405180830381865afa15801561229c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122c091906140e5565b6122ca9190614197565b9050919050565b604f5f60445481526020019081526020015f205f9054906101000a900460ff16612327576040517f756b785700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60505f60445481526020019081526020015f205f9054906101000a900460ff161561237e576040517f3366263c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e1060455461238e9190614268565b4210156123c7576040517fa38d960e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6138406045546123d79190614268565b421115612410576040517f7f54044100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6045540361244b576040517fe1a6d15600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124da91906140e5565b90505f8103612515576040517f87e8068300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604a5f60445481526020019081526020015f205490505f8103612565576040517fcdad98fd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b82811015612660575f604c5f60445481526020019081526020015f205f8381526020019081526020015f205490505f5f8211156125ca5783610fa0836125ad91906141ca565b6125b79190614238565b9050610fa08111156125c957610fa090505b5b60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ab06ee584836040518363ffffffff1660e01b8152600401612626929190614557565b5f604051808303815f87803b15801561263d575f5ffd5b505af115801561264f573d5f5f3e3d5ffd5b505050505050806001019050612567565b50600160505f60445481526020019081526020015f205f6101000a81548160ff0219169083151502179055506044547f6debf9c0b8bd7ecda40db89a2641f61251d80a576b5c5e5f06de7f1c2a65850a426040516126be9190613bc4565b60405180910390a25f60016044546126d69190614268565b9050806044819055505f604381905550426041819055505f604581905550807f0339a014b2a3d6abc2fc06f1b5012e5d2f000c05e177344349717baaea6c4a6e426040516127249190613bc4565b60405180910390a2505050565b60485f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166127b1576040517ffb9b7df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60475f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663081e3eda6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561281b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061283f91906140e5565b8310612877576040517f87e8068300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b670de0b6b3a76400008110156128b9576040517fc978b25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604f5f60445481526020019081526020015f205f9054906101000a900460ff1615612910576040517f1ac9b04c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f61291f84866044546134b6565b91509150811580156129575750600a604d5f60445481526020019081526020015f205f8781526020019081526020015f208054905010155b1561298e576040517f86bd0d8100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129bb3330858773ffffffffffffffffffffffffffffffffffffffff166135a5909392919063ffffffff16565b8115612a1f5782604d5f60445481526020019081526020015f205f8781526020019081526020015f2082815481106129f6576129f561413d565b5b905f5260205f2090600402016002015f828254612a139190614268565b92505081905550612b05565b604d5f60445481526020019081526020015f205f8681526020019081526020015f2060405180608001604052808673ffffffffffffffffffffffffffffffffffffffff16815260200160445481526020018581526020015f815250908060018154018082558091505060019003905f5260205f2090600402015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015550505b604454858573ffffffffffffffffffffffffffffffffffffffff167f53d7e12b48de8b91fcdb4f254d62b1a73b83ce93def79899dba9a49f630319d486604051612b4f9190613bc4565b60405180910390a45050505050565b60455481565b612b6c61314a565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612bdc575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401612bd39190613ee8565b60405180910390fd5b612be5816131d1565b50565b5f5f5f604e5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f208054905090505f5b81811015612cd357604e5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8681526020019081526020015f208181548110612ca557612ca461413d565b5b905f5260205f2090600302015f01548603612cc857600181935093505050612cdc565b806001019050612c3f565b505f5f92509250505b935093915050565b60025f5403612d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1f906145c8565b60405180910390fd5b60025f81905550565b5f604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f208054905090505f5b818110156130fa57604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f208181548110612dec57612deb61413d565b5b905f5260205f2090600302016002015f9054906101000a900460ff1615612e3f576040517f23eb246c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f208281548110612e9e57612e9d61413d565b5b905f5260205f2090600302015f015490505f612ebb338387610a2a565b90506001604e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8781526020019081526020015f208481548110612f1d57612f1c61413d565b5b905f5260205f2090600302016002015f6101000a81548160ff0219169083151502179055505f815190505f5b818110156130eb575f838281518110612f6557612f6461413d565b5b60200260200101516040015111156130e057828181518110612f8a57612f8961413d565b5b602002602001015160400151604d5f8981526020019081526020015f205f8681526020019081526020015f208281548110612fc857612fc761413d565b5b905f5260205f2090600402016003015f828254612fe59190614268565b92505081905550613052338483815181106130035761300261413d565b5b6020026020010151604001518584815181106130225761302161413d565b5b60200260200101515f015173ffffffffffffffffffffffffffffffffffffffff1661362e9092919063ffffffff16565b83873373ffffffffffffffffffffffffffffffffffffffff167f8f62d91ae48a7294bb9327b1e922ff909fa07eed33dbf02378ab8b2e26c1a7a886858151811061309f5761309e61413d565b5b60200260200101515f01518786815181106130bd576130bc61413d565b5b6020026020010151604001516040516130d79291906145e6565b60405180910390a45b806001019050612f49565b50505050806001019050612d86565b5081604b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505050565b60015f81905550565b6131526136b4565b73ffffffffffffffffffffffffffffffffffffffff1661317061160e565b73ffffffffffffffffffffffffffffffffffffffff16146131cf576131936136b4565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016131c69190613ee8565b60405180910390fd5b565b5f6131da6132a2565b90505f815f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082825f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300905090565b5f60495f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f8103613343576040517f4a067ce300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60495f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505050565b8160495f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546133d59190614268565b9250508190555060465f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aa68acde83836040518363ffffffff1660e01b815260040161343892919061460d565b5f604051808303815f87803b15801561344f575f5ffd5b505af1158015613461573d5f5f3e3d5ffd5b505050505050565b5f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00905090565b6134986136bb565b6134a1816136fb565b50565b6134ac6136bb565b6134b461377f565b565b5f5f5f604d5f8581526020019081526020015f205f8681526020019081526020015f208054905090505f5b81811015613594578673ffffffffffffffffffffffffffffffffffffffff16604d5f8781526020019081526020015f205f8881526020019081526020015f2082815481106135325761353161413d565b5b905f5260205f2090600402015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036135895760018193509350505061359d565b8060010190506134e1565b505f5f92509250505b935093915050565b613628846323b872dd60e01b8585856040516024016135c693929190614634565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613790565b50505050565b6136af8363a9059cbb60e01b848460405160240161364d9291906145e6565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613790565b505050565b5f33905090565b6136c3613856565b6136f9576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6137036136bb565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613773575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161376a9190613ee8565b60405180910390fd5b61377c816131d1565b50565b6137876136bb565b60015f81905550565b5f6137f1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166138749092919063ffffffff16565b90505f81511480613812575080806020019051810190613811919061438f565b5b613851576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613848906146d9565b60405180910390fd5b505050565b5f61385f613469565b5f0160089054906101000a900460ff16905090565b606061388284845f8561388b565b90509392505050565b6060824710156138d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138c790614767565b60405180910390fd5b5f5f8673ffffffffffffffffffffffffffffffffffffffff1685876040516138f891906147d7565b5f6040518083038185875af1925050503d805f8114613932576040519150601f19603f3d011682016040523d82523d5f602084013e613937565b606091505b509150915061394887838387613954565b92505050949350505050565b606083156139b5575f8351036139ad5761396d856139c8565b6139ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139a390614837565b60405180910390fd5b5b8290506139c0565b6139bf83836139ea565b5b949350505050565b5f5f8273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f825111156139fc5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3091906148a7565b60405180910390fd5b60405180608001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81525090565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f840112613a9c57613a9b613a7b565b5b8235905067ffffffffffffffff811115613ab957613ab8613a7f565b5b602083019150836060820283011115613ad557613ad4613a83565b5b9250929050565b5f5f60208385031215613af257613af1613a73565b5b5f83013567ffffffffffffffff811115613b0f57613b0e613a77565b5b613b1b85828601613a87565b92509250509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613b5082613b27565b9050919050565b613b6081613b46565b8114613b6a575f5ffd5b50565b5f81359050613b7b81613b57565b92915050565b5f60208284031215613b9657613b95613a73565b5b5f613ba384828501613b6d565b91505092915050565b5f819050919050565b613bbe81613bac565b82525050565b5f602082019050613bd75f830184613bb5565b92915050565b613be681613bac565b8114613bf0575f5ffd5b50565b5f81359050613c0181613bdd565b92915050565b5f5f5f60608486031215613c1e57613c1d613a73565b5b5f613c2b86828701613b6d565b9350506020613c3c86828701613bf3565b9250506040613c4d86828701613bf3565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613c8981613b46565b82525050565b613c9881613bac565b82525050565b608082015f820151613cb25f850182613c80565b506020820151613cc56020850182613c8f565b506040820151613cd86040850182613c8f565b506060820151613ceb6060850182613c8f565b50505050565b5f613cfc8383613c9e565b60808301905092915050565b5f602082019050919050565b5f613d1e82613c57565b613d288185613c61565b9350613d3383613c71565b805f5b83811015613d63578151613d4a8882613cf1565b9750613d5583613d08565b925050600181019050613d36565b5085935050505092915050565b5f6020820190508181035f830152613d888184613d14565b905092915050565b5f819050919050565b5f613db3613dae613da984613b27565b613d90565b613b27565b9050919050565b5f613dc482613d99565b9050919050565b5f613dd582613dba565b9050919050565b613de581613dcb565b82525050565b5f602082019050613dfe5f830184613ddc565b92915050565b5f60208284031215613e1957613e18613a73565b5b5f613e2684828501613bf3565b91505092915050565b5f8115159050919050565b613e4381613e2f565b82525050565b5f602082019050613e5c5f830184613e3a565b92915050565b5f5f60408385031215613e7857613e77613a73565b5b5f613e8585828601613bf3565b9250506020613e9685828601613bf3565b9150509250929050565b5f613eaa82613dba565b9050919050565b613eba81613ea0565b82525050565b5f602082019050613ed35f830184613eb1565b92915050565b613ee281613b46565b82525050565b5f602082019050613efb5f830184613ed9565b92915050565b613f0a81613e2f565b8114613f14575f5ffd5b50565b5f81359050613f2581613f01565b92915050565b5f5f60408385031215613f4157613f40613a73565b5b5f613f4e85828601613b6d565b9250506020613f5f85828601613f17565b9150509250929050565b5f5f5f60608486031215613f8057613f7f613a73565b5b5f613f8d86828701613bf3565b9350506020613f9e86828701613bf3565b9250506040613faf86828701613bf3565b9150509250925092565b5f608082019050613fcc5f830187613ed9565b613fd96020830186613bb5565b613fe66040830185613bb5565b613ff36060830184613bb5565b95945050505050565b5f60608201905061400f5f830186613bb5565b61401c6020830185613bb5565b6140296040830184613e3a565b949350505050565b5f5f5f6060848603121561404857614047613a73565b5b5f61405586828701613b6d565b935050602061406686828701613bf3565b925050604061407786828701613b6d565b9150509250925092565b5f5f5f6060848603121561409857614097613a73565b5b5f6140a586828701613bf3565b93505060206140b686828701613b6d565b92505060406140c786828701613bf3565b9150509250925092565b5f815190506140df81613bdd565b92915050565b5f602082840312156140fa576140f9613a73565b5b5f614107848285016140d1565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6141a182613bac565b91506141ac83613bac565b92508282039050818111156141c4576141c361416a565b5b92915050565b5f6141d482613bac565b91506141df83613bac565b92508282026141ed81613bac565b915082820484148315176142045761420361416a565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61424282613bac565b915061424d83613bac565b92508261425d5761425c61420b565b5b828204905092915050565b5f61427282613bac565b915061427d83613bac565b92508282019050808211156142955761429461416a565b5b92915050565b5f82825260208201905092915050565b7f4e6f7420417070726f76656420746f2057686974656c697374000000000000005f82015250565b5f6142df60198361429b565b91506142ea826142ab565b602082019050919050565b5f6020820190508181035f83015261430c816142d3565b9050919050565b7f416c7265616479207365740000000000000000000000000000000000000000005f82015250565b5f614347600b8361429b565b915061435282614313565b602082019050919050565b5f6020820190508181035f8301526143748161433b565b9050919050565b5f8151905061438981613f01565b92915050565b5f602082840312156143a4576143a3613a73565b5b5f6143b18482850161437b565b91505092915050565b7f5a65726f206164647265737320636865660000000000000000000000000000005f82015250565b5f6143ee60118361429b565b91506143f9826143ba565b602082019050919050565b5f6020820190508181035f83015261441b816143e2565b9050919050565b7f5a65726f206164647265737320746f6b656e00000000000000000000000000005f82015250565b5f61445660128361429b565b915061446182614422565b602082019050919050565b5f6020820190508181035f8301526144838161444a565b9050919050565b7f45706f636820746f6f2073686f727400000000000000000000000000000000005f82015250565b5f6144be600f8361429b565b91506144c98261448a565b602082019050919050565b5f6020820190508181035f8301526144eb816144b2565b9050919050565b5f819050919050565b5f67ffffffffffffffff82169050919050565b5f61452861452361451e846144f2565b613d90565b6144fb565b9050919050565b6145388161450e565b82525050565b5f6020820190506145515f83018461452f565b92915050565b5f60408201905061456a5f830185613bb5565b6145776020830184613bb5565b9392505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6145b2601f8361429b565b91506145bd8261457e565b602082019050919050565b5f6020820190508181035f8301526145df816145a6565b9050919050565b5f6040820190506145f95f830185613ed9565b6146066020830184613bb5565b9392505050565b5f6040820190506146205f830185613bb5565b61462d6020830184613ed9565b9392505050565b5f6060820190506146475f830186613ed9565b6146546020830185613ed9565b6146616040830184613bb5565b949350505050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f6146c3602a8361429b565b91506146ce82614669565b604082019050919050565b5f6020820190508181035f8301526146f0816146b7565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f61475160268361429b565b915061475c826146f7565b604082019050919050565b5f6020820190508181035f83015261477e81614745565b9050919050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f6147b182614785565b6147bb818561478f565b93506147cb818560208601614799565b80840191505092915050565b5f6147e282846147a7565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f614821601d8361429b565b915061482c826147ed565b602082019050919050565b5f6020820190508181035f83015261484e81614815565b9050919050565b5f81519050919050565b5f601f19601f8301169050919050565b5f61487982614855565b614883818561429b565b9350614893818560208601614799565b61489c8161485f565b840191505092915050565b5f6020820190508181035f8301526148bf818461486f565b90509291505056fea2646970667358221220c6aaaf92aea2ee86c8cd550b71b62b61b1577d6044eb507334006ac19aba2b4064736f6c634300081b0033
Deployed Bytecode Sourcemap
46384:14791:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51347:501;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47528:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47264:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56640:1236;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60673:88;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60573:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47445:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52773:445;;;:::i;:::-;;47959:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47471:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47685:66;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47421:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47198:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47295:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47634:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56117:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47089:51;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55891:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60769:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47361:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13141:103;;;:::i;:::-;;54680:1203;;;:::i;:::-;;46808:48;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47758:71;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;47579:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47836:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;46976:50;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46918:51;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12406:147;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47328:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47907:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47231:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50152:1187;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60465:99;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47033:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56529:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49520:625;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59999:254;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56369:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53226:1446;;;:::i;:::-;;51856:909;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47388:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13399:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51347:501;51410:14;51427:5;;:12;;51410:29;;51450:18;51471:4;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51450:38;;51499:22;51535:10;51524:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51499:47;;51572:9;51567:274;51587:6;51583:1;:10;51567:274;;;51615:11;51629:5;;51635:1;51629:8;;;;;;;:::i;:::-;;;;;;;:12;;;51615:26;;51667:10;51660:3;:17;51656:42;;51686:12;;;;;;;;;;;;;;51656:42;51717:8;51726:3;51717:13;;;;;;;;:::i;:::-;;;;;;;;51713:40;;;51739:14;;;;;;;;;;;;;;51713:40;51784:4;51768:8;51777:3;51768:13;;;;;;;;:::i;:::-;;;;;;;:20;;;;;;;;;;;51803:26;51808:3;51813:5;;51819:1;51813:8;;;;;;;:::i;:::-;;;;;;;:15;;;51803:4;:26::i;:::-;51600:241;51595:3;;;;;51567:274;;;;51399:449;;;51347:501;;:::o;47528:44::-;;;;;;;;;;;;;;;;;:::o;47264:24::-;;;;:::o;56640:1236::-;56726:18;56757:19;56779:12;:19;56792:5;56779:19;;;;;;;;;;;:24;56799:3;56779:24;;;;;;;;;;;:31;;;;56757:53;;56821:25;56865:11;56849:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;56821:56;;56898:18;56919:11;:18;56931:5;56919:18;;;;;;;;;;;:23;56938:3;56919:23;;;;;;;;;;;;56898:44;;56971:1;56957:10;:15;56953:34;;56981:6;56974:13;;;;;;;56953:34;57008:19;57039:10;57051:14;57069:35;57087:4;57093:3;57098:5;57069:17;:35::i;:::-;57038:66;;;;57119:5;57115:89;;;57155:9;:15;57165:4;57155:15;;;;;;;;;;;;;;;:22;57171:5;57155:22;;;;;;;;;;;57178:6;57155:30;;;;;;;;:::i;:::-;;;;;;;;;;;;:37;;;57141:51;;57115:89;57229:9;57224:611;57244:11;57240:1;:15;57224:611;;;57277:24;57304:12;:19;57317:5;57304:19;;;;;;;;;;;:24;57324:3;57304:24;;;;;;;;;;;57329:1;57304:27;;;;;;;;:::i;:::-;;;;;;;;;;;;57277:54;;57346:23;57388:6;:14;;;57372:6;:13;;;:30;;;;:::i;:::-;57346:56;;57439:1;57421:15;:19;57417:407;;;57518:17;57552:15;57538:11;:29;;;;:::i;:::-;57518:49;;57617:15;57602:11;57590:9;:23;;;;:::i;:::-;:42;57586:65;;57641:10;;;;;;;;;;;;;;57586:65;57688:18;57721:10;57709:9;:22;;;;:::i;:::-;57688:43;;57762:46;;;;;;;;57772:6;:13;;;;;;;;;;;;57762:46;;;;;;57787:5;57762:46;;;;57794:10;57762:46;;;;57806:1;57762:46;;;57750:6;57757:1;57750:9;;;;;;;;:::i;:::-;;;;;;;:58;;;;57442:382;;57417:407;57262:573;;57257:3;;;;;57224:611;;;;57862:6;57855:13;;;;;;;;56640:1236;;;;;;:::o;60673:88::-;60718:7;60744:9;;60737:16;;60673:88;:::o;60573:92::-;60619:7;60646:11;;60639:18;;60573:92;:::o;47445:17::-;;;;;;;;;;;;;:::o;52773:445::-;52884:1;47019:7;52865:20;;;;:::i;:::-;52850:11;;52838:9;;:23;;;;:::i;:::-;:48;;;;:::i;:::-;52820:15;:66;52816:101;;;52895:22;;;;;;;;;;;;;;52816:101;52962:11;;52950:9;;:23;;;;:::i;:::-;52932:15;:41;52928:75;;;52982:21;;;;;;;;;;;;;;52928:75;53018:13;:20;53032:5;;53018:20;;;;;;;;;;;;;;;;;;;;;53014:46;;;53047:13;;;;;;;;;;;;;;53014:46;53097:4;53074:13;:20;53088:5;;53074:20;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;53126:15;53112:11;:29;;;;53187:5;;53167:43;53194:15;53167:43;;;;;;:::i;:::-;;;;;;;;52773:445::o;47959:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;47471:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;47685:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47421:17::-;;;;;;;;;;;;;:::o;47198:25::-;;;;;;;;;;;;;:::o;47295:26::-;;;;:::o;47634:44::-;;;;;;;;;;;;;;;;;:::o;56117:244::-;61029:14;61046:7;:5;:7::i;:::-;61029:24;;61087:6;61073:20;;:10;:20;;;:48;;;;61111:10;;;;;;;;;;;61097:24;;:10;:24;;;61073:48;61064:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;56231:1:::1;56214:19;;:5;:19;;::::0;56210:46:::1;;56242:14;;;;;;;;;;;;;;56210:46;56295:6;56267:18;:25;56286:5;56267:25;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;56339:5;56317:36;;;56346:6;56317:36;;;;;;:::i;:::-;;;;;;;;61018:154:::0;56117:244;;:::o;47089:51::-;47135:5;47089:51;:::o;55891:218::-;39471:21;:19;:21::i;:::-;55971:5:::1;;55962;:14;55958:42;;55985:15;;;;;;;;;;;;;;55958:42;56016:16;:23;56033:5;56016:23;;;;;;;;;;;;;;;;;;;;;56011:52;;56048:15;;;;;;;;;;;;;;56011:52;56074:27;56095:5;56074:20;:27::i;:::-;39515:20:::0;:18;:20::i;:::-;55891:218;:::o;60769:214::-;60839:14;12292:13;:11;:13::i;:::-;60893:1:::1;60880:9;;:14;60871:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;60943:9;60931;:21;;;;60970:4;60963:11;;60769:214:::0;;;:::o;47361:20::-;;;;:::o;13141:103::-;12292:13;:11;:13::i;:::-;13206:30:::1;13233:1;13206:18;:30::i;:::-;13141:103::o:0;54680:1203::-;39471:21;:19;:21::i;:::-;54740:19:::1;54762:9;:21;54772:10;54762:21;;;;;;;;;;;;;;;;54740:43;;54813:5;;54798:11;:20;54794:48;;54827:15;;;;;;;;;;;;;;54794:48;54863:18;54898:1;54884:11;:15;;;;:::i;:::-;54863:36;;54910:16;54929:5;;54910:24;;54973:8;54959:10;:22;54955:54;;54990:19;;;;;;;;;;;;;;54955:54;55027:20;55050:10;55027:33;;55022:797;55077:8;55062:12;:23;55022:797;;;55123:16;:30;55140:12;55123:30;;;;;;;;;;;;;;;;;;;;;55118:130;;55192:12;55179:26;;;;;;;;;;55224:8;;55118:130;55264:14;55281:9;:21;55291:10;55281:21;;;;;;;;;;;;;;;:35;55303:12;55281:35;;;;;;;;;;;:42;;;;55264:59;;55338:22;55363:5;55338:30;;55402:9;55414:1;55402:13;;55397:219;55421:6;55417:1;:10;55397:219;;;55458:9;:21;55468:10;55458:21;;;;;;;;;;;;;;;:35;55480:12;55458:35;;;;;;;;;;;55494:1;55458:38;;;;;;;;:::i;:::-;;;;;;;;;;;;:46;;;;;;;;;;;;55453:148;;55549:4;55529:24;;55576:5;;55453:148;55429:3;;;;;;;55397:219;;;;55648:17;55644:164;;;55686:34;55707:12;55686:20;:34::i;:::-;55644:164;;;55779:12;55766:26;;;;;;;;;;55644:164;55103:716;;55022:797;55087:14;;;;;;;55022:797;;;;55874:1;55863:8;:12;;;;:::i;:::-;55839:9;:21;55849:10;55839:21;;;;;;;;;;;;;;;:36;;;;54729:1154;;;39515:20:::0;:18;:20::i;:::-;54680:1203::o;46808:48::-;46854:2;46808:48;:::o;47758:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47579:48::-;;;;;;;;;;;;;;;;;:::o;47836:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46976:50::-;47019:7;46976:50;:::o;46918:51::-;46965:4;46918:51;:::o;12406:147::-;12452:7;12472:24;12499:20;:18;:20::i;:::-;12472:47;;12537:1;:8;;;;;;;;;;;;12530:15;;;12406:147;:::o;47328:26::-;;;;:::o;47907:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;47231:26::-;;;;;;;;;;;;;:::o;50152:1187::-;50224:4;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50217:3;:24;50213:49;;50250:12;;;;;;;;;;;;;;50213:49;50301:6;50277:21;50287:10;50277:9;:21::i;:::-;:30;50273:62;;;50316:19;;;;;;;;;;;;;;50273:62;47135:5;50350:6;:28;50346:61;;;50387:20;;;;;;;;;;;;;;50346:61;50422:13;:20;50436:5;;50422:20;;;;;;;;;;;;;;;;;;;;;50418:46;;;50451:13;;;;;;;;;;;;;;50418:46;47019:7;50510:11;;50498:9;;:23;;;;:::i;:::-;:42;;;;:::i;:::-;50479:15;:61;50475:96;;50549:22;;;;;;;;;;;;;;50475:96;50586:4;;;;;;;;;;;:18;;;50605:10;50586:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50582:64;;;50619:25;50633:10;50619:13;:25::i;:::-;50582:64;50666:31;50678:6;50686:10;50666:11;:31::i;:::-;50712:10;50724:14;50742:41;50760:10;50772:3;50777:5;;50742:17;:41::i;:::-;50711:72;;;;50809:5;50804:350;;50831:9;:21;50841:10;50831:21;;;;;;;;;;;;;;;:28;50853:5;;50831:28;;;;;;;;;;;50865:25;;;;;;;;50871:3;50865:25;;;;50876:6;50865:25;;;;50884:5;50865:25;;;;;50831:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50804:350;;;50924:16;50989:6;50943:9;:21;50953:10;50943:21;;;;;;;;;;;;;;;:28;50965:5;;50943:28;;;;;;;;;;;50972:6;50943:36;;;;;;;;:::i;:::-;;;;;;;;;;;;:43;;;:52;;;;:::i;:::-;50924:71;;47135:5;51014:8;:30;51010:63;;;51053:20;;;;;;;;;;;;;;51010:63;51134:8;51088:9;:21;51098:10;51088:21;;;;;;;;;;;;;;;:28;51110:5;;51088:28;;;;;;;;;;;51117:6;51088:36;;;;;;;;:::i;:::-;;;;;;;;;;;;:43;;:54;;;;50909:245;50804:350;51201:6;51174:11;:18;51186:5;;51174:18;;;;;;;;;;;:23;51193:3;51174:23;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;51242:6;51218:13;:20;51232:5;;51218:20;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;51274:6;51259:11;;:21;;;;;;;:::i;:::-;;;;;;;;51319:3;51307:10;51298:33;;;51324:6;51298:33;;;;;;:::i;:::-;;;;;;;;50202:1137;;50152:1187;;:::o;60465:99::-;60509:12;60541:4;;;;;;;;;;;:11;;;60553:2;60541:15;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60534:22;;60465:99;;;:::o;47033:49::-;47075:7;47033:49;:::o;56529:103::-;56582:7;56609:9;:15;56619:4;56609:15;;;;;;;;;;;;;;;;56602:22;;56529:103;;;:::o;49520:625::-;4184:30;4217:26;:24;:26::i;:::-;4184:59;;4308:19;4331:1;:15;;;;;;;;;;;;4330:16;4308:38;;4357:18;4378:1;:14;;;;;;;;;;;;4357:35;;4743:17;4778:1;4763:11;:16;;;:34;;;;;4783:14;4763:34;4743:54;;4808:17;4843:1;4828:11;:16;;;:50;;;;;4877:1;4856:4;4848:25;;;:30;4828:50;4808:70;;4896:12;4895:13;:30;;;;;4913:12;4912:13;4895:30;4891:93;;;4949:23;;;;;;;;;;;;;;4891:93;5011:1;4994;:14;;;:18;;;;;;;;;;;;;;;;;;5027:14;5023:69;;;5076:4;5058:1;:15;;;:22;;;;;;;;;;;;;;;;;;5023:69;49694:1:::1;49671:25;;:11;:25;;::::0;49663:55:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;49755:1;49737:20;;:6;:20;;::::0;49729:51:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;49837:7;49833:1;47019:7;49814:20;;;;:::i;:::-;:30;;;;:::i;:::-;49799:12;:45;49791:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49885:26;49900:10;49885:14;:26::i;:::-;49923:24;:22;:24::i;:::-;49981:11;49968:10;;:24;;;;;;;;;;;;;;;;;;50017:12;50003:11;:26;;;;50055:6;50041:11;;:20;;;;;;;;;;;;;;;;;;50085:6;50072:4;;:20;;;;;;;;;;;;;;;;;;50116:11;50103:4;;:25;;;;;;;;;;;;;;;;;;5118:14:::0;5114:104;;;5167:5;5149:1;:15;;;:23;;;;;;;;;;;;;;;;;;5192:14;5204:1;5192:14;;;;;;:::i;:::-;;;;;;;;5114:104;4116:1109;;;;;49520:625;;;:::o;59999:254::-;60073:11;;;;;;;;;;;60059:25;;:10;:25;;;60055:53;;60093:15;;;;;;;;;;;;;;60055:53;60119:20;60142:9;:15;60152:4;60142:15;;;;;;;;;;;;;;;;60119:38;;60188:1;60172:12;:17;60168:47;;60198:17;;;;;;;;;;;;;;60168:47;60244:1;60226:9;:15;60236:4;60226:15;;;;;;;;;;;;;;;:19;;;;60044:209;59999:254;:::o;56369:152::-;56422:7;56498:15;56508:4;56498:9;:15::i;:::-;56467:11;;;;;;;;;;;56449:40;;;56490:4;56449:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:64;;;;:::i;:::-;56442:71;;56369:152;;;:::o;53226:1446::-;53267:13;:20;53281:5;;53267:20;;;;;;;;;;;;;;;;;;;;;53262:49;;53296:15;;;;;;;;;;;;;;53262:49;53326:16;:23;53343:5;;53326:23;;;;;;;;;;;;;;;;;;;;;53322:59;;;53358:23;;;;;;;;;;;;;;53322:59;47019:7;53414:11;;:30;;;;:::i;:::-;53396:15;:48;53392:83;;;53453:22;;;;;;;;;;;;;;53392:83;47075:7;53508:11;;:29;;;;:::i;:::-;53490:15;:47;53486:81;;;53546:21;;;;;;;;;;;;;;53486:81;53597:1;53582:11;;:16;53578:47;;53607:18;;;;;;;;;;;;;;53578:47;53646:14;53663:4;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53646:34;;53705:1;53695:6;:11;53691:36;;53715:12;;;;;;;;;;;;;;53691:36;53748:18;53769:13;:20;53783:5;;53769:20;;;;;;;;;;;;53748:41;;53818:1;53804:10;:15;53800:39;;53828:11;;;;;;;;;;;;;;53800:39;53909:9;53904:433;53924:6;53920:1;:10;53904:433;;;53952:21;53976:11;:18;53988:5;;53976:18;;;;;;;;;;;:21;53995:1;53976:21;;;;;;;;;;;;53952:45;;54012:18;54065:1;54049:13;:17;54045:243;;;54137:10;46907:4;54101:13;:32;;;;:::i;:::-;54100:47;;;;:::i;:::-;54087:60;;46907:4;54170:10;:29;54166:107;;;46907:4;54224:29;;54166:107;54045:243;54302:4;;;;;;;;;;;:8;;;54311:1;54314:10;54302:23;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53937:400;;53932:3;;;;;53904:433;;;;54383:4;54357:16;:23;54374:5;;54357:23;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;54418:5;;54403:38;54425:15;54403:38;;;;;;:::i;:::-;;;;;;;;54462:16;54489:1;54481:5;;:9;;;;:::i;:::-;54462:28;;54509:8;54501:5;:16;;;;54542:1;54528:11;:15;;;;54566;54554:9;:27;;;;54606:1;54592:11;:15;;;;54638:8;54625:39;54648:15;54625:39;;;;;;:::i;:::-;;;;;;;;53251:1421;;;53226:1446::o;51856:909::-;51941:18;:26;51960:6;51941:26;;;;;;;;;;;;;;;;;;;;;;;;;51936:61;;51976:21;;;;;;;;;;;;;;51936:61;52019:4;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52012:3;:24;52008:49;;52045:12;;;;;;;;;;;;;;52008:49;46965:4;52072:6;:29;52068:57;;;52110:15;;;;;;;;;;;;;;52068:57;52140:13;:20;52154:5;;52140:20;;;;;;;;;;;;;;;;;;;;;52136:46;;;52169:13;;;;;;;;;;;;;;52136:46;52204:12;52218:14;52236:28;52245:6;52253:3;52258:5;;52236:8;:28::i;:::-;52203:61;;;;52280:7;52279:8;:66;;;;;46854:2;52291:12;:19;52304:5;;52291:19;;;;;;;;;;;:24;52311:3;52291:24;;;;;;;;;;;:31;;;;:54;;52279:66;52275:121;;;52369:15;;;;;;;;;;;;;;52275:121;52416:77;52459:10;52479:4;52486:6;52434;52416:42;;;;:77;;;;;;:::i;:::-;52518:7;52514:188;;;52585:6;52542:12;:19;52555:5;;52542:19;;;;;;;;;;;:24;52562:3;52542:24;;;;;;;;;;;52567:6;52542:32;;;;;;;;:::i;:::-;;;;;;;;;;;;:39;;;:49;;;;;;;:::i;:::-;;;;;;;;52514:188;;;52624:12;:19;52637:5;;52624:19;;;;;;;;;;;:24;52644:3;52624:24;;;;;;;;;;;52654:35;;;;;;;;52664:6;52654:35;;;;;;52672:5;;52654:35;;;;52679:6;52654:35;;;;52687:1;52654:35;;;52624:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52514:188;52743:5;;52738:3;52730:6;52719:38;;;52750:6;52719:38;;;;;;:::i;:::-;;;;;;;;51925:840;;51856:909;;;:::o;47388:26::-;;;;:::o;13399:220::-;12292:13;:11;:13::i;:::-;13504:1:::1;13484:22;;:8;:22;;::::0;13480:93:::1;;13558:1;13530:31;;;;;;;;;;;:::i;:::-;;;;;;;;13480:93;13583:28;13602:8;13583:18;:28::i;:::-;13399:220:::0;:::o;59076:375::-;59168:10;59180:14;59207;59224:9;:15;59234:4;59224:15;;;;;;;;;;;;;;;:22;59240:5;59224:22;;;;;;;;;;;:29;;;;59207:46;;59269:9;59264:152;59284:6;59280:1;:10;59264:152;;;59323:9;:15;59333:4;59323:15;;;;;;;;;;;;;;;:22;59339:5;59323:22;;;;;;;;;;;59346:1;59323:25;;;;;;;;:::i;:::-;;;;;;;;;;;;:29;;;59316:3;:36;59312:93;;59381:4;59387:1;59373:16;;;;;;;;59312:93;59292:3;;;;;59264:152;;;;59434:5;59441:1;59426:17;;;;;59076:375;;;;;;;:::o;39551:293::-;38776:1;39685:7;;:19;39677:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;38776:1;39818:7;:18;;;;39551:293::o;57884:1184::-;57949:14;57966:9;:21;57976:10;57966:21;;;;;;;;;;;;;;;:28;57988:5;57966:28;;;;;;;;;;;:35;;;;57949:52;;58017:9;58012:999;58032:6;58028:1;:10;58012:999;;;58064:9;:21;58074:10;58064:21;;;;;;;;;;;;;;;:28;58086:5;58064:28;;;;;;;;;;;58093:1;58064:31;;;;;;;;:::i;:::-;;;;;;;;;;;;:39;;;;;;;;;;;;58060:74;;;58112:22;;;;;;;;;;;;;;58060:74;58163:12;58178:9;:21;58188:10;58178:21;;;;;;;;;;;;;;;:28;58200:5;58178:28;;;;;;;;;;;58207:1;58178:31;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;58163:50;;58228:25;58256:39;58271:10;58283:4;58289:5;58256:14;:39::i;:::-;58228:67;;58420:4;58378:9;:21;58388:10;58378:21;;;;;;;;;;;;;;;:28;58400:5;58378:28;;;;;;;;;;;58407:1;58378:31;;;;;;;;:::i;:::-;;;;;;;;;;;;:39;;;:46;;;;;;;;;;;;;;;;;;58453:19;58475:6;:13;58453:35;;58508:9;58503:497;58523:11;58519:1;:15;58503:497;;;58583:1;58564:6;58571:1;58564:9;;;;;;;;:::i;:::-;;;;;;;;:16;;;:20;58560:425;;;58706:6;58713:1;58706:9;;;;;;;;:::i;:::-;;;;;;;;:16;;;58666:12;:19;58679:5;58666:19;;;;;;;;;;;:25;58686:4;58666:25;;;;;;;;;;;58692:1;58666:28;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;:56;;;;;;;:::i;:::-;;;;;;;;58786:78;58835:10;58847:6;58854:1;58847:9;;;;;;;;:::i;:::-;;;;;;;;:16;;;58804:6;58811:1;58804:9;;;;;;;;:::i;:::-;;;;;;;;:16;;;58786:48;;;;:78;;;;;:::i;:::-;58924:4;58917:5;58905:10;58892:73;;;58930:6;58937:1;58930:9;;;;;;;;:::i;:::-;;;;;;;;:16;;;58948:6;58955:1;58948:9;;;;;;;;:::i;:::-;;;;;;;;:16;;;58892:73;;;;;;;:::i;:::-;;;;;;;;58560:425;58536:3;;;;;58503:497;;;;58045:966;;;58040:3;;;;;58012:999;;;;59055:5;59031:9;:21;59041:10;59031:21;;;;;;;;;;;;;;;:29;;;;57938:1130;57884:1184;:::o;39852:213::-;38732:1;40035:7;:22;;;;39852:213::o;12631:166::-;12702:12;:10;:12::i;:::-;12691:23;;:7;:5;:7::i;:::-;:23;;;12687:103;;12765:12;:10;:12::i;:::-;12738:40;;;;;;;;;;;:::i;:::-;;;;;;;;12687:103;12631:166::o;13779:253::-;13853:24;13880:20;:18;:20::i;:::-;13853:47;;13911:16;13930:1;:8;;;;;;;;;;;;13911:27;;13960:8;13949:1;:8;;;:19;;;;;;;;;;;;;;;;;;14015:8;13984:40;;14005:8;13984:40;;;;;;;;;;;;13842:190;;13779:253;:::o;11114:163::-;11166:24;11237:22;11227:32;;11114:163;:::o;60262:191::-;60319:20;60342:9;:15;60352:4;60342:15;;;;;;;;;;;;;;;;60319:38;;60388:1;60372:12;:17;60368:47;;60398:17;;;;;;;;;;;;;;60368:47;60444:1;60426:9;:15;60436:4;60426:15;;;;;;;;;;;;;;;:19;;;;60308:145;60262:191;:::o;59459:144::-;59549:6;59530:9;:15;59540:4;59530:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;59566:4;;;;;;;;;;;:15;;;59582:6;59590:4;59566:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59459:144;;:::o;8880:174::-;8938:30;9015:21;9005:31;;8880:174;:::o;11790:129::-;7022:20;:18;:20::i;:::-;11873:38:::1;11898:12;11873:24;:38::i;:::-;11790:129:::0;:::o;38818:113::-;7022:20;:18;:20::i;:::-;38889:34:::1;:32;:34::i;:::-;38818:113::o:0;59611:380::-;59696:12;59710:14;59737;59754:12;:19;59767:5;59754:19;;;;;;;;;;;:24;59774:3;59754:24;;;;;;;;;;;:31;;;;59737:48;;59801:9;59796:160;59816:6;59812:1;:10;59796:160;;;59886:6;59848:44;;:12;:19;59861:5;59848:19;;;;;;;;;;;:24;59868:3;59848:24;;;;;;;;;;;59873:1;59848:27;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;;;;;;;;;;;:44;;;59844:101;;59921:4;59927:1;59913:16;;;;;;;;59844:101;59824:3;;;;;59796:160;;;;59974:5;59981:1;59966:17;;;;;59611:380;;;;;;;:::o;31272:216::-;31384:96;31404:5;31434:27;;;31463:4;31469:2;31473:5;31411:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31384:19;:96::i;:::-;31272:216;;;;:::o;30839:188::-;30933:86;30953:5;30983:23;;;31008:2;31012:5;30960:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30933:19;:86::i;:::-;30839:188;;;:::o;9807:98::-;9860:7;9887:10;9880:17;;9807:98;:::o;7182:145::-;7250:17;:15;:17::i;:::-;7245:75;;7291:17;;;;;;;;;;;;;;7245:75;7182:145::o;11927:240::-;7022:20;:18;:20::i;:::-;12048:1:::1;12024:26;;:12;:26;;::::0;12020:97:::1;;12102:1;12074:31;;;;;;;;;;;:::i;:::-;;;;;;;;12020:97;12127:32;12146:12;12127:18;:32::i;:::-;11927:240:::0;:::o;38939:111::-;7022:20;:18;:20::i;:::-;38732:1:::1;39020:7;:22;;;;38939:111::o:0;35262:660::-;35697:23;35723:69;35751:4;35723:69;;;;;;;;;;;;;;;;;35731:5;35723:27;;;;:69;;;;;:::i;:::-;35697:95;;35832:1;35811:10;:17;:22;:56;;;;35848:10;35837:30;;;;;;;;;;;;:::i;:::-;35811:56;35803:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35343:579;35262:660;;:::o;8622:122::-;8672:4;8696:26;:24;:26::i;:::-;:40;;;;;;;;;;;;8689:47;;8622:122;:::o;24662:229::-;24799:12;24831:52;24853:6;24861:4;24867:1;24870:12;24831:21;:52::i;:::-;24824:59;;24662:229;;;;;:::o;25748:455::-;25918:12;25976:5;25951:21;:30;;25943:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;26036:12;26050:23;26077:6;:11;;26096:5;26103:4;26077:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26035:73;;;;26126:69;26153:6;26161:7;26170:10;26182:12;26126:26;:69::i;:::-;26119:76;;;;25748:455;;;;;;:::o;28321:644::-;28506:12;28535:7;28531:427;;;28584:1;28563:10;:17;:22;28559:290;;28781:18;28792:6;28781:10;:18::i;:::-;28773:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;28559:290;28870:10;28863:17;;;;28531:427;28913:33;28921:10;28933:12;28913:7;:33::i;:::-;28321:644;;;;;;;:::o;21907:326::-;21967:4;22224:1;22202:7;:19;;;:23;22195:30;;21907:326;;;:::o;29507:552::-;29688:1;29668:10;:17;:21;29664:388;;;29900:10;29894:17;29957:15;29944:10;29940:2;29936:19;29929:44;29664:388;30027:12;30020:20;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;88:117:1:-;197:1;194;187:12;211:117;320:1;317;310:12;334:117;443:1;440;433:12;457:117;566:1;563;556:12;580:117;689:1;686;679:12;742:593;840:8;850:6;900:3;893:4;885:6;881:17;877:27;867:122;;908:79;;:::i;:::-;867:122;1021:6;1008:20;998:30;;1051:18;1043:6;1040:30;1037:117;;;1073:79;;:::i;:::-;1037:117;1187:4;1179:6;1175:17;1163:29;;1241:3;1233:4;1225:6;1221:17;1211:8;1207:32;1204:41;1201:128;;;1248:79;;:::i;:::-;1201:128;742:593;;;;;:::o;1341:609::-;1452:6;1460;1509:2;1497:9;1488:7;1484:23;1480:32;1477:119;;;1515:79;;:::i;:::-;1477:119;1663:1;1652:9;1648:17;1635:31;1693:18;1685:6;1682:30;1679:117;;;1715:79;;:::i;:::-;1679:117;1828:105;1925:7;1916:6;1905:9;1901:22;1828:105;:::i;:::-;1810:123;;;;1606:337;1341:609;;;;;:::o;1956:126::-;1993:7;2033:42;2026:5;2022:54;2011:65;;1956:126;;;:::o;2088:96::-;2125:7;2154:24;2172:5;2154:24;:::i;:::-;2143:35;;2088:96;;;:::o;2190:122::-;2263:24;2281:5;2263:24;:::i;:::-;2256:5;2253:35;2243:63;;2302:1;2299;2292:12;2243:63;2190:122;:::o;2318:139::-;2364:5;2402:6;2389:20;2380:29;;2418:33;2445:5;2418:33;:::i;:::-;2318:139;;;;:::o;2463:329::-;2522:6;2571:2;2559:9;2550:7;2546:23;2542:32;2539:119;;;2577:79;;:::i;:::-;2539:119;2697:1;2722:53;2767:7;2758:6;2747:9;2743:22;2722:53;:::i;:::-;2712:63;;2668:117;2463:329;;;;:::o;2798:77::-;2835:7;2864:5;2853:16;;2798:77;;;:::o;2881:118::-;2968:24;2986:5;2968:24;:::i;:::-;2963:3;2956:37;2881:118;;:::o;3005:222::-;3098:4;3136:2;3125:9;3121:18;3113:26;;3149:71;3217:1;3206:9;3202:17;3193:6;3149:71;:::i;:::-;3005:222;;;;:::o;3233:122::-;3306:24;3324:5;3306:24;:::i;:::-;3299:5;3296:35;3286:63;;3345:1;3342;3335:12;3286:63;3233:122;:::o;3361:139::-;3407:5;3445:6;3432:20;3423:29;;3461:33;3488:5;3461:33;:::i;:::-;3361:139;;;;:::o;3506:619::-;3583:6;3591;3599;3648:2;3636:9;3627:7;3623:23;3619:32;3616:119;;;3654:79;;:::i;:::-;3616:119;3774:1;3799:53;3844:7;3835:6;3824:9;3820:22;3799:53;:::i;:::-;3789:63;;3745:117;3901:2;3927:53;3972:7;3963:6;3952:9;3948:22;3927:53;:::i;:::-;3917:63;;3872:118;4029:2;4055:53;4100:7;4091:6;4080:9;4076:22;4055:53;:::i;:::-;4045:63;;4000:118;3506:619;;;;;:::o;4131:141::-;4225:6;4259:5;4253:12;4243:22;;4131:141;;;:::o;4278:211::-;4404:11;4438:6;4433:3;4426:19;4478:4;4473:3;4469:14;4454:29;;4278:211;;;;:::o;4495:159::-;4589:4;4612:3;4604:11;;4642:4;4637:3;4633:14;4625:22;;4495:159;;;:::o;4660:108::-;4737:24;4755:5;4737:24;:::i;:::-;4732:3;4725:37;4660:108;;:::o;4774:::-;4851:24;4869:5;4851:24;:::i;:::-;4846:3;4839:37;4774:108;;:::o;4966:857::-;5107:4;5102:3;5098:14;5196:4;5189:5;5185:16;5179:23;5215:63;5272:4;5267:3;5263:14;5249:12;5215:63;:::i;:::-;5122:166;5371:4;5364:5;5360:16;5354:23;5390:63;5447:4;5442:3;5438:14;5424:12;5390:63;:::i;:::-;5298:165;5547:4;5540:5;5536:16;5530:23;5566:63;5623:4;5618:3;5614:14;5600:12;5566:63;:::i;:::-;5473:166;5724:4;5717:5;5713:16;5707:23;5743:63;5800:4;5795:3;5791:14;5777:12;5743:63;:::i;:::-;5649:167;5076:747;4966:857;;:::o;5829:287::-;5952:10;5973:100;6069:3;6061:6;5973:100;:::i;:::-;6105:4;6100:3;6096:14;6082:28;;5829:287;;;;:::o;6122:140::-;6219:4;6251;6246:3;6242:14;6234:22;;6122:140;;;:::o;6350:948::-;6523:3;6552:81;6627:5;6552:81;:::i;:::-;6649:113;6755:6;6750:3;6649:113;:::i;:::-;6642:120;;6786:83;6863:5;6786:83;:::i;:::-;6892:7;6923:1;6908:365;6933:6;6930:1;6927:13;6908:365;;;7009:6;7003:13;7036:117;7149:3;7134:13;7036:117;:::i;:::-;7029:124;;7176:87;7256:6;7176:87;:::i;:::-;7166:97;;6968:305;6955:1;6952;6948:9;6943:14;;6908:365;;;6912:14;7289:3;7282:10;;6528:770;;;6350:948;;;;:::o;7304:481::-;7501:4;7539:2;7528:9;7524:18;7516:26;;7588:9;7582:4;7578:20;7574:1;7563:9;7559:17;7552:47;7616:162;7773:4;7764:6;7616:162;:::i;:::-;7608:170;;7304:481;;;;:::o;7791:60::-;7819:3;7840:5;7833:12;;7791:60;;;:::o;7857:142::-;7907:9;7940:53;7958:34;7967:24;7985:5;7967:24;:::i;:::-;7958:34;:::i;:::-;7940:53;:::i;:::-;7927:66;;7857:142;;;:::o;8005:126::-;8055:9;8088:37;8119:5;8088:37;:::i;:::-;8075:50;;8005:126;;;:::o;8137:140::-;8201:9;8234:37;8265:5;8234:37;:::i;:::-;8221:50;;8137:140;;;:::o;8283:159::-;8384:51;8429:5;8384:51;:::i;:::-;8379:3;8372:64;8283:159;;:::o;8448:250::-;8555:4;8593:2;8582:9;8578:18;8570:26;;8606:85;8688:1;8677:9;8673:17;8664:6;8606:85;:::i;:::-;8448:250;;;;:::o;8704:329::-;8763:6;8812:2;8800:9;8791:7;8787:23;8783:32;8780:119;;;8818:79;;:::i;:::-;8780:119;8938:1;8963:53;9008:7;8999:6;8988:9;8984:22;8963:53;:::i;:::-;8953:63;;8909:117;8704:329;;;;:::o;9039:90::-;9073:7;9116:5;9109:13;9102:21;9091:32;;9039:90;;;:::o;9135:109::-;9216:21;9231:5;9216:21;:::i;:::-;9211:3;9204:34;9135:109;;:::o;9250:210::-;9337:4;9375:2;9364:9;9360:18;9352:26;;9388:65;9450:1;9439:9;9435:17;9426:6;9388:65;:::i;:::-;9250:210;;;;:::o;9466:474::-;9534:6;9542;9591:2;9579:9;9570:7;9566:23;9562:32;9559:119;;;9597:79;;:::i;:::-;9559:119;9717:1;9742:53;9787:7;9778:6;9767:9;9763:22;9742:53;:::i;:::-;9732:63;;9688:117;9844:2;9870:53;9915:7;9906:6;9895:9;9891:22;9870:53;:::i;:::-;9860:63;;9815:118;9466:474;;;;;:::o;9946:140::-;10010:9;10043:37;10074:5;10043:37;:::i;:::-;10030:50;;9946:140;;;:::o;10092:159::-;10193:51;10238:5;10193:51;:::i;:::-;10188:3;10181:64;10092:159;;:::o;10257:250::-;10364:4;10402:2;10391:9;10387:18;10379:26;;10415:85;10497:1;10486:9;10482:17;10473:6;10415:85;:::i;:::-;10257:250;;;;:::o;10513:118::-;10600:24;10618:5;10600:24;:::i;:::-;10595:3;10588:37;10513:118;;:::o;10637:222::-;10730:4;10768:2;10757:9;10753:18;10745:26;;10781:71;10849:1;10838:9;10834:17;10825:6;10781:71;:::i;:::-;10637:222;;;;:::o;10865:116::-;10935:21;10950:5;10935:21;:::i;:::-;10928:5;10925:32;10915:60;;10971:1;10968;10961:12;10915:60;10865:116;:::o;10987:133::-;11030:5;11068:6;11055:20;11046:29;;11084:30;11108:5;11084:30;:::i;:::-;10987:133;;;;:::o;11126:468::-;11191:6;11199;11248:2;11236:9;11227:7;11223:23;11219:32;11216:119;;;11254:79;;:::i;:::-;11216:119;11374:1;11399:53;11444:7;11435:6;11424:9;11420:22;11399:53;:::i;:::-;11389:63;;11345:117;11501:2;11527:50;11569:7;11560:6;11549:9;11545:22;11527:50;:::i;:::-;11517:60;;11472:115;11126:468;;;;;:::o;11600:619::-;11677:6;11685;11693;11742:2;11730:9;11721:7;11717:23;11713:32;11710:119;;;11748:79;;:::i;:::-;11710:119;11868:1;11893:53;11938:7;11929:6;11918:9;11914:22;11893:53;:::i;:::-;11883:63;;11839:117;11995:2;12021:53;12066:7;12057:6;12046:9;12042:22;12021:53;:::i;:::-;12011:63;;11966:118;12123:2;12149:53;12194:7;12185:6;12174:9;12170:22;12149:53;:::i;:::-;12139:63;;12094:118;11600:619;;;;;:::o;12225:553::-;12402:4;12440:3;12429:9;12425:19;12417:27;;12454:71;12522:1;12511:9;12507:17;12498:6;12454:71;:::i;:::-;12535:72;12603:2;12592:9;12588:18;12579:6;12535:72;:::i;:::-;12617;12685:2;12674:9;12670:18;12661:6;12617:72;:::i;:::-;12699;12767:2;12756:9;12752:18;12743:6;12699:72;:::i;:::-;12225:553;;;;;;;:::o;12784:430::-;12927:4;12965:2;12954:9;12950:18;12942:26;;12978:71;13046:1;13035:9;13031:17;13022:6;12978:71;:::i;:::-;13059:72;13127:2;13116:9;13112:18;13103:6;13059:72;:::i;:::-;13141:66;13203:2;13192:9;13188:18;13179:6;13141:66;:::i;:::-;12784:430;;;;;;:::o;13220:619::-;13297:6;13305;13313;13362:2;13350:9;13341:7;13337:23;13333:32;13330:119;;;13368:79;;:::i;:::-;13330:119;13488:1;13513:53;13558:7;13549:6;13538:9;13534:22;13513:53;:::i;:::-;13503:63;;13459:117;13615:2;13641:53;13686:7;13677:6;13666:9;13662:22;13641:53;:::i;:::-;13631:63;;13586:118;13743:2;13769:53;13814:7;13805:6;13794:9;13790:22;13769:53;:::i;:::-;13759:63;;13714:118;13220:619;;;;;:::o;13845:::-;13922:6;13930;13938;13987:2;13975:9;13966:7;13962:23;13958:32;13955:119;;;13993:79;;:::i;:::-;13955:119;14113:1;14138:53;14183:7;14174:6;14163:9;14159:22;14138:53;:::i;:::-;14128:63;;14084:117;14240:2;14266:53;14311:7;14302:6;14291:9;14287:22;14266:53;:::i;:::-;14256:63;;14211:118;14368:2;14394:53;14439:7;14430:6;14419:9;14415:22;14394:53;:::i;:::-;14384:63;;14339:118;13845:619;;;;;:::o;14470:143::-;14527:5;14558:6;14552:13;14543:22;;14574:33;14601:5;14574:33;:::i;:::-;14470:143;;;;:::o;14619:351::-;14689:6;14738:2;14726:9;14717:7;14713:23;14709:32;14706:119;;;14744:79;;:::i;:::-;14706:119;14864:1;14889:64;14945:7;14936:6;14925:9;14921:22;14889:64;:::i;:::-;14879:74;;14835:128;14619:351;;;;:::o;14976:180::-;15024:77;15021:1;15014:88;15121:4;15118:1;15111:15;15145:4;15142:1;15135:15;15162:180;15210:77;15207:1;15200:88;15307:4;15304:1;15297:15;15331:4;15328:1;15321:15;15348:180;15396:77;15393:1;15386:88;15493:4;15490:1;15483:15;15517:4;15514:1;15507:15;15534:194;15574:4;15594:20;15612:1;15594:20;:::i;:::-;15589:25;;15628:20;15646:1;15628:20;:::i;:::-;15623:25;;15672:1;15669;15665:9;15657:17;;15696:1;15690:4;15687:11;15684:37;;;15701:18;;:::i;:::-;15684:37;15534:194;;;;:::o;15734:410::-;15774:7;15797:20;15815:1;15797:20;:::i;:::-;15792:25;;15831:20;15849:1;15831:20;:::i;:::-;15826:25;;15886:1;15883;15879:9;15908:30;15926:11;15908:30;:::i;:::-;15897:41;;16087:1;16078:7;16074:15;16071:1;16068:22;16048:1;16041:9;16021:83;15998:139;;16117:18;;:::i;:::-;15998:139;15782:362;15734:410;;;;:::o;16150:180::-;16198:77;16195:1;16188:88;16295:4;16292:1;16285:15;16319:4;16316:1;16309:15;16336:185;16376:1;16393:20;16411:1;16393:20;:::i;:::-;16388:25;;16427:20;16445:1;16427:20;:::i;:::-;16422:25;;16466:1;16456:35;;16471:18;;:::i;:::-;16456:35;16513:1;16510;16506:9;16501:14;;16336:185;;;;:::o;16527:191::-;16567:3;16586:20;16604:1;16586:20;:::i;:::-;16581:25;;16620:20;16638:1;16620:20;:::i;:::-;16615:25;;16663:1;16660;16656:9;16649:16;;16684:3;16681:1;16678:10;16675:36;;;16691:18;;:::i;:::-;16675:36;16527:191;;;;:::o;16724:169::-;16808:11;16842:6;16837:3;16830:19;16882:4;16877:3;16873:14;16858:29;;16724:169;;;;:::o;16899:175::-;17039:27;17035:1;17027:6;17023:14;17016:51;16899:175;:::o;17080:366::-;17222:3;17243:67;17307:2;17302:3;17243:67;:::i;:::-;17236:74;;17319:93;17408:3;17319:93;:::i;:::-;17437:2;17432:3;17428:12;17421:19;;17080:366;;;:::o;17452:419::-;17618:4;17656:2;17645:9;17641:18;17633:26;;17705:9;17699:4;17695:20;17691:1;17680:9;17676:17;17669:47;17733:131;17859:4;17733:131;:::i;:::-;17725:139;;17452:419;;;:::o;17877:161::-;18017:13;18013:1;18005:6;18001:14;17994:37;17877:161;:::o;18044:366::-;18186:3;18207:67;18271:2;18266:3;18207:67;:::i;:::-;18200:74;;18283:93;18372:3;18283:93;:::i;:::-;18401:2;18396:3;18392:12;18385:19;;18044:366;;;:::o;18416:419::-;18582:4;18620:2;18609:9;18605:18;18597:26;;18669:9;18663:4;18659:20;18655:1;18644:9;18640:17;18633:47;18697:131;18823:4;18697:131;:::i;:::-;18689:139;;18416:419;;;:::o;18841:137::-;18895:5;18926:6;18920:13;18911:22;;18942:30;18966:5;18942:30;:::i;:::-;18841:137;;;;:::o;18984:345::-;19051:6;19100:2;19088:9;19079:7;19075:23;19071:32;19068:119;;;19106:79;;:::i;:::-;19068:119;19226:1;19251:61;19304:7;19295:6;19284:9;19280:22;19251:61;:::i;:::-;19241:71;;19197:125;18984:345;;;;:::o;19335:167::-;19475:19;19471:1;19463:6;19459:14;19452:43;19335:167;:::o;19508:366::-;19650:3;19671:67;19735:2;19730:3;19671:67;:::i;:::-;19664:74;;19747:93;19836:3;19747:93;:::i;:::-;19865:2;19860:3;19856:12;19849:19;;19508:366;;;:::o;19880:419::-;20046:4;20084:2;20073:9;20069:18;20061:26;;20133:9;20127:4;20123:20;20119:1;20108:9;20104:17;20097:47;20161:131;20287:4;20161:131;:::i;:::-;20153:139;;19880:419;;;:::o;20305:168::-;20445:20;20441:1;20433:6;20429:14;20422:44;20305:168;:::o;20479:366::-;20621:3;20642:67;20706:2;20701:3;20642:67;:::i;:::-;20635:74;;20718:93;20807:3;20718:93;:::i;:::-;20836:2;20831:3;20827:12;20820:19;;20479:366;;;:::o;20851:419::-;21017:4;21055:2;21044:9;21040:18;21032:26;;21104:9;21098:4;21094:20;21090:1;21079:9;21075:17;21068:47;21132:131;21258:4;21132:131;:::i;:::-;21124:139;;20851:419;;;:::o;21276:165::-;21416:17;21412:1;21404:6;21400:14;21393:41;21276:165;:::o;21447:366::-;21589:3;21610:67;21674:2;21669:3;21610:67;:::i;:::-;21603:74;;21686:93;21775:3;21686:93;:::i;:::-;21804:2;21799:3;21795:12;21788:19;;21447:366;;;:::o;21819:419::-;21985:4;22023:2;22012:9;22008:18;22000:26;;22072:9;22066:4;22062:20;22058:1;22047:9;22043:17;22036:47;22100:131;22226:4;22100:131;:::i;:::-;22092:139;;21819:419;;;:::o;22244:85::-;22289:7;22318:5;22307:16;;22244:85;;;:::o;22335:101::-;22371:7;22411:18;22404:5;22400:30;22389:41;;22335:101;;;:::o;22442:156::-;22499:9;22532:60;22549:42;22558:32;22584:5;22558:32;:::i;:::-;22549:42;:::i;:::-;22532:60;:::i;:::-;22519:73;;22442:156;;;:::o;22604:145::-;22698:44;22736:5;22698:44;:::i;:::-;22693:3;22686:57;22604:145;;:::o;22755:236::-;22855:4;22893:2;22882:9;22878:18;22870:26;;22906:78;22981:1;22970:9;22966:17;22957:6;22906:78;:::i;:::-;22755:236;;;;:::o;22997:332::-;23118:4;23156:2;23145:9;23141:18;23133:26;;23169:71;23237:1;23226:9;23222:17;23213:6;23169:71;:::i;:::-;23250:72;23318:2;23307:9;23303:18;23294:6;23250:72;:::i;:::-;22997:332;;;;;:::o;23335:181::-;23475:33;23471:1;23463:6;23459:14;23452:57;23335:181;:::o;23522:366::-;23664:3;23685:67;23749:2;23744:3;23685:67;:::i;:::-;23678:74;;23761:93;23850:3;23761:93;:::i;:::-;23879:2;23874:3;23870:12;23863:19;;23522:366;;;:::o;23894:419::-;24060:4;24098:2;24087:9;24083:18;24075:26;;24147:9;24141:4;24137:20;24133:1;24122:9;24118:17;24111:47;24175:131;24301:4;24175:131;:::i;:::-;24167:139;;23894:419;;;:::o;24319:332::-;24440:4;24478:2;24467:9;24463:18;24455:26;;24491:71;24559:1;24548:9;24544:17;24535:6;24491:71;:::i;:::-;24572:72;24640:2;24629:9;24625:18;24616:6;24572:72;:::i;:::-;24319:332;;;;;:::o;24657:::-;24778:4;24816:2;24805:9;24801:18;24793:26;;24829:71;24897:1;24886:9;24882:17;24873:6;24829:71;:::i;:::-;24910:72;24978:2;24967:9;24963:18;24954:6;24910:72;:::i;:::-;24657:332;;;;;:::o;24995:442::-;25144:4;25182:2;25171:9;25167:18;25159:26;;25195:71;25263:1;25252:9;25248:17;25239:6;25195:71;:::i;:::-;25276:72;25344:2;25333:9;25329:18;25320:6;25276:72;:::i;:::-;25358;25426:2;25415:9;25411:18;25402:6;25358:72;:::i;:::-;24995:442;;;;;;:::o;25443:229::-;25583:34;25579:1;25571:6;25567:14;25560:58;25652:12;25647:2;25639:6;25635:15;25628:37;25443:229;:::o;25678:366::-;25820:3;25841:67;25905:2;25900:3;25841:67;:::i;:::-;25834:74;;25917:93;26006:3;25917:93;:::i;:::-;26035:2;26030:3;26026:12;26019:19;;25678:366;;;:::o;26050:419::-;26216:4;26254:2;26243:9;26239:18;26231:26;;26303:9;26297:4;26293:20;26289:1;26278:9;26274:17;26267:47;26331:131;26457:4;26331:131;:::i;:::-;26323:139;;26050:419;;;:::o;26475:225::-;26615:34;26611:1;26603:6;26599:14;26592:58;26684:8;26679:2;26671:6;26667:15;26660:33;26475:225;:::o;26706:366::-;26848:3;26869:67;26933:2;26928:3;26869:67;:::i;:::-;26862:74;;26945:93;27034:3;26945:93;:::i;:::-;27063:2;27058:3;27054:12;27047:19;;26706:366;;;:::o;27078:419::-;27244:4;27282:2;27271:9;27267:18;27259:26;;27331:9;27325:4;27321:20;27317:1;27306:9;27302:17;27295:47;27359:131;27485:4;27359:131;:::i;:::-;27351:139;;27078:419;;;:::o;27503:98::-;27554:6;27588:5;27582:12;27572:22;;27503:98;;;:::o;27607:147::-;27708:11;27745:3;27730:18;;27607:147;;;;:::o;27760:139::-;27849:6;27844:3;27839;27833:23;27890:1;27881:6;27876:3;27872:16;27865:27;27760:139;;;:::o;27905:386::-;28009:3;28037:38;28069:5;28037:38;:::i;:::-;28091:88;28172:6;28167:3;28091:88;:::i;:::-;28084:95;;28188:65;28246:6;28241:3;28234:4;28227:5;28223:16;28188:65;:::i;:::-;28278:6;28273:3;28269:16;28262:23;;28013:278;27905:386;;;;:::o;28297:271::-;28427:3;28449:93;28538:3;28529:6;28449:93;:::i;:::-;28442:100;;28559:3;28552:10;;28297:271;;;;:::o;28574:179::-;28714:31;28710:1;28702:6;28698:14;28691:55;28574:179;:::o;28759:366::-;28901:3;28922:67;28986:2;28981:3;28922:67;:::i;:::-;28915:74;;28998:93;29087:3;28998:93;:::i;:::-;29116:2;29111:3;29107:12;29100:19;;28759:366;;;:::o;29131:419::-;29297:4;29335:2;29324:9;29320:18;29312:26;;29384:9;29378:4;29374:20;29370:1;29359:9;29355:17;29348:47;29412:131;29538:4;29412:131;:::i;:::-;29404:139;;29131:419;;;:::o;29556:99::-;29608:6;29642:5;29636:12;29626:22;;29556:99;;;:::o;29661:102::-;29702:6;29753:2;29749:7;29744:2;29737:5;29733:14;29729:28;29719:38;;29661:102;;;:::o;29769:377::-;29857:3;29885:39;29918:5;29885:39;:::i;:::-;29940:71;30004:6;29999:3;29940:71;:::i;:::-;29933:78;;30020:65;30078:6;30073:3;30066:4;30059:5;30055:16;30020:65;:::i;:::-;30110:29;30132:6;30110:29;:::i;:::-;30105:3;30101:39;30094:46;;29861:285;29769:377;;;;:::o;30152:313::-;30265:4;30303:2;30292:9;30288:18;30280:26;;30352:9;30346:4;30342:20;30338:1;30327:9;30323:17;30316:47;30380:78;30453:4;30444:6;30380:78;:::i;:::-;30372:86;;30152:313;;;;:::o
Swarm Source
ipfs://c6aaaf92aea2ee86c8cd550b71b62b61b1577d6044eb507334006ac19aba2b40
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.