More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 562 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw All | 14189732 | 1107 days ago | IN | 0 ETH | 0.0016439 | ||||
Withdraw All | 14189669 | 1107 days ago | IN | 0 ETH | 0.00166264 | ||||
Withdraw All | 13996890 | 1137 days ago | IN | 0 ETH | 0.00402649 | ||||
Withdraw All | 13996884 | 1137 days ago | IN | 0 ETH | 0.00378078 | ||||
Withdraw | 13892366 | 1153 days ago | IN | 0 ETH | 0.00219689 | ||||
Withdraw All | 13892305 | 1153 days ago | IN | 0 ETH | 0.00226471 | ||||
Withdraw All | 13852563 | 1159 days ago | IN | 0 ETH | 0.00221984 | ||||
Withdraw All | 13802766 | 1167 days ago | IN | 0 ETH | 0.00125315 | ||||
Withdraw All | 13682614 | 1186 days ago | IN | 0 ETH | 0.00379603 | ||||
Withdraw All | 13681232 | 1186 days ago | IN | 0 ETH | 0.00378672 | ||||
Withdraw All | 13676578 | 1187 days ago | IN | 0 ETH | 0.00324978 | ||||
Withdraw All | 13676571 | 1187 days ago | IN | 0 ETH | 0.00346337 | ||||
Withdraw All | 13676557 | 1187 days ago | IN | 0 ETH | 0.00272331 | ||||
Withdraw All | 13676543 | 1187 days ago | IN | 0 ETH | 0.00300884 | ||||
Withdraw All | 13676315 | 1187 days ago | IN | 0 ETH | 0.00349126 | ||||
Withdraw All | 13676281 | 1187 days ago | IN | 0 ETH | 0.00316408 | ||||
Withdraw All | 13676263 | 1187 days ago | IN | 0 ETH | 0.00362635 | ||||
Withdraw All | 13676080 | 1187 days ago | IN | 0 ETH | 0.00263239 | ||||
Withdraw All | 13676078 | 1187 days ago | IN | 0 ETH | 0.00243211 | ||||
Withdraw All | 13676057 | 1187 days ago | IN | 0 ETH | 0.00348845 | ||||
Withdraw All | 13676054 | 1187 days ago | IN | 0 ETH | 0.00295976 | ||||
Withdraw All | 13675760 | 1187 days ago | IN | 0 ETH | 0.00335769 | ||||
Withdraw All | 13675181 | 1187 days ago | IN | 0 ETH | 0.00357348 | ||||
Withdraw All | 13669964 | 1188 days ago | IN | 0 ETH | 0.00313577 | ||||
Withdraw All | 13669833 | 1188 days ago | IN | 0 ETH | 0.0030766 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
HubPool
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-22 */ // Sources flattened with hardhat v2.0.8 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File @openzeppelin/contracts/access/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/math/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File @openzeppelin/contracts/utils/[email protected] pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity >=0.6.0 <0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File contracts/HubCommon.sol pragma solidity 0.6.12; pragma experimental ABIEncoderV2; abstract contract AuthHub is Ownable { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; // controller 合约地址 address public controller; // 冶理地址 address public governance; //自动触发收益匹配 bool public paused = false; constructor() public { governance = msg.sender; } modifier notPause() { require(paused == false, "Mining has been suspended"); _; } function checkGovernance() virtual public view { require(msg.sender == owner() || msg.sender == governance, 'not allow'); } function checkController() public view { require(governance != address(0) && controller != address(0), 'not allow'); require( msg.sender == governance || msg.sender == controller, 'not allow'); } // 设置权限控制合约 function setGovernance(address _governance) public { require(address(0) != _governance, "governance address is zero"); checkGovernance(); governance = _governance; } function setController(address _controller) public { require(_controller != address(0), "controller is the zero address"); checkGovernance(); controller = _controller; } function setPause() public { require(msg.sender == owner() || msg.sender == governance, 'not allow'); paused = !paused; } // 提现转任意erc20 function inCaseTokensGetStuck(address account, address _token, uint _amount) public { require(address(0) != account, "account address is zero"); checkGovernance(); IERC20(_token).safeTransfer(account, _amount); } } // Info of each user. struct UserInfo { // 用户本金 uint256 amount; // 用户负债 uint256 mdxDebt; // cow负债 uint cowDebt; //用户最大收益 0 不限制 uint256 mdxProfit; uint256 cowProfit; //用户未提收益 uint256 mdxReward; uint256 cowReward; } // 每个池子的信息 struct PoolInfo { // 用户质押币种 IERC20 token; // 上一次结算收益的块高 uint256 lastRewardBlock; // 上一次结算的用户总收益占比 uint256 accMdxPerShare; // 上一次结算累计的mdx收益 uint256 accMdxShare; // 所有用户质押总数量 uint256 totalAmount; // 所有用户质押总数量上限,0表示不限 uint256 totalAmountLimit; //cow 收益数据 uint256 accCowPerShare; // cow累计收益 uint256 accCowShare; //每个块奖励cow uint256 blockCowReward; //每个块奖励mdx uint256 blockMdxReward; // 预留备付金 uint256 earnLowerlimit; } interface IERC20Full is IERC20 { function decimals() external view returns (uint8); } interface IHubPoolExtend { function deposit(uint _pid, uint _amount, address user) external; function withdraw(uint _pid, uint _amount, address user) external returns (uint); function emergencyWithdraw(uint _pid, uint _amount, address user) external returns (uint); } interface IStrategy { function balanceOf() external view returns (uint); function balanceOfToken(address token) external view returns (uint); function paused() external returns(bool); function want() external view returns (address, address); function contain(address) external view returns (bool); function deposit() external; function withdraw(address, uint) external returns (uint); function withdrawAll() external returns (uint); function withdrawMDXReward() external returns (uint, uint); function governance()external view returns (address) ; function owner()external view returns (address) ; function pid()external view returns (uint); function strategyName() external view returns (string memory) ; function burnNFTToken() external; function mitNFTToken(uint24 fee, int24 tickLower, int24 tickUpper) external; function mitNFTTokenWithPriceA(uint24 fee, uint priceLower, uint priceUpper) external; function getAmount() external view returns (uint128, uint, uint); function historyRewardA() external view returns (uint); function historyRewardB() external view returns (uint); function getPool() external view returns (address); function positionManager() external view returns (address); } interface IHubPool { function earn(address token) external; function poolLength() external view returns (uint256); function poolInfo(uint index) view external returns (PoolInfo memory); function TokenOfPid(address token) view external returns (uint); function controller() view external returns (address); function governance() view external returns (address) ; function owner()external view returns (address) ; function getPoolId(address token) external view returns (uint256) ; function pending(uint256 _pid, address _user) external view returns (uint256, uint256); function pendingCow(uint256 _pid, address _user) external view returns (uint256); function getMdxBlockReward(address token) external view returns (uint256); function userInfo(uint pid, address user) external view returns (UserInfo memory); function withdraw(address token, uint amount) external ; function deposit(address token, uint amount) external ; function available(address token) view external returns (uint); function withdrawAll(address token) external; function depositAll(address token) external; function withdrawWithPid(uint256 pid, uint256 amount) external; function getApy(address token) external view returns (uint256); function getCowApy(address token) external view returns (uint256); function userTotalCowProfit() external view returns (uint256); function userTotalProfit() external view returns (uint256); function getBlockReward (uint pid) external view returns (uint256, uint256); } interface IController { // 释放投资本金,用于提现 function withdrawLp(address token, uint _amount) external; // 触发投资 function earn(address token) external; // 触发发收益 function withdrawPending(address token, address user, uint256 userPending, uint256 govPending) external; // 获取策略 function strategyLength() external view returns (uint) ; function strategieList(uint id) external view returns (address) ; function governance() external view returns (address) ; function mdxToken() external view returns (address) ; function owner() external view returns (address) ; function vaults() external view returns (address) ; function rewardAccount() external view returns (address) ; function sid(address _strategy) external view returns (uint); } // File contracts/HubPool.sol pragma solidity 0.6.12; contract HubPool is AuthHub { using SafeMath for uint256; using SafeERC20 for IERC20; modifier checkToken(address token) { require(token != address(0) && address(poolInfo[TokenOfPid[token]].token) == token, "token not exists"); _; } // 池子信息列表 PoolInfo[] public poolInfo; // token对应的 poolInfo索引 mapping(address => uint256) public TokenOfPid; // 每个池子的用户数量 mapping(uint256 => mapping(address => UserInfo)) public userInfo; // 扩展合约,预留 address public hupPoolExtend; constructor() public { controller = address(0x4613e2eD453EbC8b7A03B071C5CE7Cb092499D6C); governance =address(0x601e4b30bD70B78DC28dE9e663Dc8D2dC8323C87); } // 设置扩展合约 function setHupPoolExtend(address _hupPoolExtend) external { checkGovernance(); hupPoolExtend = _hupPoolExtend; } function poolLength() public view returns (uint256) { return poolInfo.length; } function getPoolInfo(address token) internal view checkToken(token) returns(PoolInfo storage) { return poolInfo[TokenOfPid[token]]; } function getPoolId(address token) public view checkToken(token) returns (uint256){ return TokenOfPid[token]; } function getBlockReward (uint pid) public view returns (uint256, uint256) { return (poolInfo[pid].blockMdxReward, poolInfo[pid].blockCowReward); } function setTotalAmountLimit(address token, uint256 _limit) public { checkGovernance(); PoolInfo storage pool = getPoolInfo(token); pool.totalAmountLimit = _limit; } // 更新cow用户收益率 function setCowBlockReward(address token, uint256 _reward, bool _withUpdate) public { checkGovernance(); PoolInfo storage pool = getPoolInfo(token); if (_withUpdate) { massUpdatePools(); } pool.blockCowReward = _reward; } // 更新cow用户收益率 function setMdxBlockReward(address token, uint256 _reward, bool _withUpdate) public { checkGovernance(); PoolInfo storage pool = getPoolInfo(token); if (_withUpdate) { massUpdatePools(); } pool.blockMdxReward = _reward; } // 设置单个用户分成比例 function setUserProfit(address token, address _user, bool _mdxProfit, bool _cowProfit) public { checkGovernance(); uint _pid = getPoolId(token); updatePool(_pid); UserInfo storage user = userInfo[_pid][_user]; if(_mdxProfit){ //开启用户收益 user.mdxProfit = 0; }else{ // 关闭用户收益 PoolInfo storage pool = poolInfo[_pid]; user.mdxProfit = pool.accMdxPerShare; } if(_cowProfit){ //开启用户收益 user.cowProfit = 0; }else{ // 关闭用户收益 PoolInfo storage pool = poolInfo[_pid]; user.cowProfit = pool.accCowPerShare; } } // 设置单个用户分成比例 function setUserAllProfit(address _user, bool _mdxProfit, bool _cowProfit) public { checkGovernance(); for(uint _pid=0; _pid < poolInfo.length; _pid++){ PoolInfo storage pool = poolInfo[_pid]; setUserProfit(address(pool.token), _user, _mdxProfit, _cowProfit); } } function setEarnLowerlimit(address token, uint256 _earnLowerlimit) public { checkGovernance(); PoolInfo storage pool = getPoolInfo(token); pool.earnLowerlimit = _earnLowerlimit; } // 给controller授权 function approveCtr(address token) public { // 授权 IERC20(token).safeApprove(controller, uint256(0)); IERC20(token).safeApprove(controller, uint256(-1)); } // 添加token到池子,不能重复添加同一个token, 重复添加将会导致用户收益错乱 function add(IERC20 _token, uint256, uint256 _earnLowerlimit, uint256, bool _withUpdate) public { require(address(_token) != address(0), "token is the zero address"); checkGovernance(); if (_withUpdate) { massUpdatePools(); } poolInfo.push(PoolInfo({ token : _token, lastRewardBlock : block.number, accMdxPerShare : 0, accMdxShare : 0, totalAmount : 0, totalAmountLimit : 0, accCowPerShare : 0, accCowShare : 0, blockMdxReward : 0, blockCowReward : 0, earnLowerlimit : _earnLowerlimit })); TokenOfPid[address(_token)] = poolLength() - 1; } // 结算所有币种的收益 function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount); // 用户总收益 uint256 public userTotalProfit; // 用户已发放收益 uint256 public userTotalSendProfit; // 用户总cow收益 uint256 public userTotalCowProfit; // 用户已发放cow收益 uint256 public userTotalSendCowProfit; function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.number <= pool.lastRewardBlock) { return; } updatePoolInfo(pool); updateCowInfo(pool); pool.lastRewardBlock = block.number; } // 结算单个币种的收益 function updatePoolInfo(PoolInfo storage pool) internal { if(pool.blockMdxReward <= 0 || pool.totalAmount == 0){ return; } uint256 blockReward = pool.blockMdxReward.mul(block.number.sub(pool.lastRewardBlock)); // 所有池子用户总收益 userTotalProfit = userTotalProfit.add(blockReward); // 单池子用户总收益 pool.accMdxShare = pool.accMdxShare.add(blockReward); // 每个质押量 获取收益 pool.accMdxPerShare = blockReward.mul(1e18).div(pool.totalAmount).add(pool.accMdxPerShare); } //结算cow function updateCowInfo(PoolInfo storage pool) internal { if(pool.blockCowReward <= 0 || pool.totalAmount == 0){ return; } uint256 blockReward = pool.blockCowReward.mul(block.number.sub(pool.lastRewardBlock)); // 所有池子用户总收益 userTotalCowProfit = userTotalCowProfit.add(blockReward); // 单池子用户总收益 pool.accCowShare = pool.accCowShare.add(blockReward); // 每个质押量 获取收益 pool.accCowPerShare = blockReward.mul(1e18).div(pool.totalAmount).add(pool.accCowPerShare); } // 查询用户收益,返回用户收益,本金 function pending(uint256 _pid, address _user) public view returns (uint256, uint256) { UserInfo storage user = userInfo[_pid][_user]; PoolInfo storage pool = poolInfo[_pid]; if (user.amount == 0 || pool.totalAmount == 0 ) { return (0, 0); } // 增量收益 uint256 blockReward = pool.blockMdxReward.mul(block.number.sub(pool.lastRewardBlock)); uint256 reward = countPending(pool, user, blockReward.mul(1e18).div(pool.totalAmount)); return (reward, user.amount); } // 查询用户收益,返回用户收益,本金 function pendingCow(uint256 _pid, address _user) public view returns (uint256) { UserInfo storage user = userInfo[_pid][_user]; PoolInfo storage pool = poolInfo[_pid]; if (user.amount == 0 || pool.totalAmount == 0 ) { return 0; } // 增量收益 uint256 blockReward = pool.blockCowReward.mul(block.number.sub(pool.lastRewardBlock)); return countCowPending(pool, user, blockReward.mul(1e18).div(pool.totalAmount)); } // 计算用户的cow收益 function countCowPending(PoolInfo storage pool, UserInfo storage user, uint blockReward) internal view returns (uint) { uint256 accCowPerShare; if(user.cowProfit > 0){ //用户已禁止收益 accCowPerShare = user.cowProfit; }else{ accCowPerShare = pool.accCowPerShare.add(blockReward); } uint pendingCowAmount = 0; uint256 totalDebt = user.amount.mul(accCowPerShare).div(1e18); if(totalDebt > user.cowDebt){ pendingCowAmount = totalDebt.sub(user.cowDebt); } return pendingCowAmount.add(user.cowReward); } // 计算用户的mdx收益 function countPending(PoolInfo storage pool, UserInfo storage user, uint blockReward) internal view returns (uint) { uint256 accMdxPerShare; if(user.mdxProfit > 0) { //用户已禁止收益 accMdxPerShare = user.mdxProfit; }else{ // 每个质押量 获取收益 accMdxPerShare = pool.accMdxPerShare.add(blockReward); } uint pendingAmount = 0; uint256 totalDebt = user.amount.mul(accMdxPerShare).div(1e18); if(totalDebt > user.mdxDebt){ pendingAmount = totalDebt.sub(user.mdxDebt); } return pendingAmount.add(user.mdxReward); } // 用户充值,当amount为0 时只是提取用户收益 function depositWithPid(uint256 _pid, uint256 _amount) public notPause { require(_amount >= 0, "deposit: not good"); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; if(pool.totalAmountLimit > 0 ){ //限制投资总量 require(pool.totalAmountLimit >= (pool.totalAmount.add(_amount)), "deposit amount limit"); } updatePool(_pid); if(hupPoolExtend != address(0)){ IHubPoolExtend(hupPoolExtend).deposit(_pid, _amount, msg.sender); } // 先结算用户先前的投资 if (user.amount > 0) { // 给用户发放收益与平台分润 uint256 pendingAmount = countPending(pool, user, uint(0)); uint256 pendingCowAmount = countCowPending(pool, user, uint(0)); // 记录未提收益 //safeMdxTransfer(address(pool.token), msg.sender, pendingAmount, pendingCowAmount); user.mdxReward = pendingAmount; user.cowReward = pendingCowAmount; } // 执行扣用户的token if (_amount > 0) { uint256 beforeToken = pool.token.balanceOf(address(this)); pool.token.safeTransferFrom(msg.sender, address(this), _amount); uint256 afterToken = pool.token.balanceOf(address(this)); _amount = afterToken.sub(beforeToken); if(_amount > 0) { user.amount = user.amount.add(_amount); pool.totalAmount = pool.totalAmount.add(_amount); } } // 重新触发投资 earn(address(pool.token)); // 更新用户负债 user.cowDebt = user.amount.mul(pool.accCowPerShare).div(1e18); user.mdxDebt = user.amount.mul(pool.accMdxPerShare).div(1e18); emit Deposit(msg.sender, _pid, _amount); } // 提现本金,默认触发提现收益,传0只提现收益 function withdrawWithPid(uint256 _pid, uint256 _amount) public notPause { require(_amount >= 0, "withdraw: not good"); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, "withdraw: Insufficient balance"); updatePool(_pid); uint256 transferAmount = _amount; if(hupPoolExtend != address(0)){ transferAmount = IHubPoolExtend(hupPoolExtend).withdraw(_pid, _amount, msg.sender); } if(user.amount > 0){ // 给用户发放收益与平台分润 uint256 pendingAmount = countPending(pool, user, uint(0)); uint256 pendingCowAmount = countCowPending(pool, user, uint(0)); user.mdxReward = 0; user.cowReward = 0; safeMdxTransfer(address(pool.token), msg.sender, pendingAmount, pendingCowAmount); } // 提现本金 if (_amount > 0) { uint256 poolBalance = pool.token.balanceOf(address(this)); if(poolBalance < _amount) { // 当前合约余额不足,调用上游释放投资 IController(controller).withdrawLp(address(pool.token), _amount.sub(poolBalance)); poolBalance = pool.token.balanceOf(address(this)); //上游资金不足 需要对冲 require(poolBalance >= _amount, "withdraw: need hedge"); } user.amount = user.amount.sub(_amount); pool.totalAmount = pool.totalAmount.sub(_amount); pool.token.safeTransfer(msg.sender, transferAmount); } // 重新触发投资 earn(address(pool.token)); // 更新用户负债 user.cowDebt = user.amount.mul(pool.accCowPerShare).div(1e18); user.mdxDebt = user.amount.mul(pool.accMdxPerShare).div(1e18); emit Withdraw(msg.sender, _pid, _amount); } // 用户紧急提现,放弃收益 function emergencyWithdraw(uint256 _pid) public notPause { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 amount = user.amount; uint256 transferAmount = amount; if(hupPoolExtend != address(0)){ transferAmount = IHubPoolExtend(hupPoolExtend).emergencyWithdraw(_pid, amount, msg.sender); } uint256 poolBalance = pool.token.balanceOf(address(this)); if(poolBalance < amount){ // 当前合约余额不足,调用上游释放投资 IController(controller).withdrawLp(address(pool.token), amount.sub(poolBalance)); poolBalance = pool.token.balanceOf(address(this)); // 上游资金不足 需要对冲 require(poolBalance >= amount, "withdraw: need hedge"); } user.amount = 0; user.mdxDebt = 0; user.cowDebt = 0; user.mdxReward = 0; user.cowReward = 0; pool.token.safeTransfer(msg.sender, transferAmount); pool.totalAmount = pool.totalAmount.sub(amount); emit EmergencyWithdraw(msg.sender, _pid, amount); } // 给用户发放收益与平台分润 function safeMdxTransfer(address _token, address _to, uint256 _userPendingAmount, uint256 _userCowPendingAmount) private { if(_userPendingAmount > 0 || _userCowPendingAmount > 0) { userTotalSendProfit = userTotalSendProfit.add(_userPendingAmount); userTotalSendCowProfit = userTotalSendCowProfit.add(_userCowPendingAmount); IController(controller).withdrawPending(_token, _to, _userPendingAmount, _userCowPendingAmount); } } // 获取token累计的mdx收益,调用controller获取 function getMdxBlockReward(address token) public view returns (uint256) { PoolInfo storage pool = getPoolInfo(token); return pool.accMdxShare; } // 触发投资,调用controller获取 function earn(address token) public { approveCtr(token); IController(controller).earn(token); } // 计算用于投资的金额 function available(address token) public view returns (uint256) { PoolInfo storage pool = getPoolInfo(token); uint b = pool.token.balanceOf(address(this)); if(pool.earnLowerlimit >= b){ return uint(0); } return b; } /*********************** 封装给web3j调用的接口 ********************/ // 查询币种对应年化收益率 function getApy(address token) external view returns (uint256) { PoolInfo storage pool = getPoolInfo(token); //计算年化利率万分比,按10秒一个块算 *86400*365/10 return pool.blockMdxReward.mul(10000).mul(3153600).div(pool.totalAmount.add(1)); } // 查询币种对应年化收益率 function getCowApy(address token) external view returns (uint256) { PoolInfo storage pool = getPoolInfo(token); //计算年化利率万分比,按10秒一个块算 *86400*365/10 return pool.blockCowReward.mul(10000).mul(3153600).div(pool.totalAmount.add(1)); } // 查询用户已收益 function earned(address token, address userAddress) external view returns (uint256) { (uint256 reward,) = pending(getPoolId(token), userAddress); return reward; } // 查询用户已存入资金 function getDepositAsset(address token, address userAddress) external view returns (uint256) { UserInfo storage user = userInfo[getPoolId(token)][userAddress]; return user.amount; } // 用户存入操作 function deposit(address token, uint256 _amount) external { uint _pid = getPoolId(token); return depositWithPid(_pid, _amount); } // 用户存所有 function depositAll(address token) external { uint _pid = getPoolId(token); return depositWithPid(_pid, IERC20(token).balanceOf(msg.sender)); } // 用户提现操作 function withdraw(address token, uint256 _amount) external { uint _pid = getPoolId(token); return withdrawWithPid(_pid, _amount); } // 用户提现所有 function withdrawAll(address token) external { uint _pid = getPoolId(token); UserInfo storage user = userInfo[_pid][msg.sender]; return withdrawWithPid(_pid, user.amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"TokenOfPid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_earnLowerlimit","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"approveCtr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"available","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkController","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkGovernance","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositWithPid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"earn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"userAddress","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getApy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"getBlockReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getCowApy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"userAddress","type":"address"}],"name":"getDepositAsset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getMdxBlockReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getPoolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hupPoolExtend","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"inCaseTokensGetStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pending","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingCow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accMdxPerShare","type":"uint256"},{"internalType":"uint256","name":"accMdxShare","type":"uint256"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"totalAmountLimit","type":"uint256"},{"internalType":"uint256","name":"accCowPerShare","type":"uint256"},{"internalType":"uint256","name":"accCowShare","type":"uint256"},{"internalType":"uint256","name":"blockCowReward","type":"uint256"},{"internalType":"uint256","name":"blockMdxReward","type":"uint256"},{"internalType":"uint256","name":"earnLowerlimit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"_reward","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"setCowBlockReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"_earnLowerlimit","type":"uint256"}],"name":"setEarnLowerlimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hupPoolExtend","type":"address"}],"name":"setHupPoolExtend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"_reward","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"setMdxBlockReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setTotalAmountLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_mdxProfit","type":"bool"},{"internalType":"bool","name":"_cowProfit","type":"bool"}],"name":"setUserAllProfit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_mdxProfit","type":"bool"},{"internalType":"bool","name":"_cowProfit","type":"bool"}],"name":"setUserProfit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"mdxDebt","type":"uint256"},{"internalType":"uint256","name":"cowDebt","type":"uint256"},{"internalType":"uint256","name":"mdxProfit","type":"uint256"},{"internalType":"uint256","name":"cowProfit","type":"uint256"},{"internalType":"uint256","name":"mdxReward","type":"uint256"},{"internalType":"uint256","name":"cowReward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"userTotalCowProfit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"userTotalProfit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"userTotalSendCowProfit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"userTotalSendProfit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawWithPid","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600260146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b5060006200003f620001ce60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550734613e2ed453ebc8b7a03b071c5ce7cb092499d6c600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073601e4b30bd70b78dc28de9e663dc8d2dc8323c87600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001d6565b600033905090565b61519f80620001e66000396000f3fe608060405234801561001057600080fd5b50600436106102d65760003560e01c806392eefe9b11610182578063caa9a08d116100e9578063e6910d25116100a2578063f587268a1161007c578063f587268a146108b1578063f77c4791146108cd578063fa09e630146108eb578063fdb5fefc14610907576102d6565b8063e6910d251461085d578063f2fde38b14610879578063f3fef3a314610895576102d6565b8063caa9a08d1461079a578063cb9b08cc146107ca578063d2d3bb44146107e6578063d431b1ac14610804578063de34f54d1461080e578063e4c75c271461082c576102d6565b80639f0d5f271161013b5780639f0d5f2714610702578063ab033ea91461071e578063af067ba91461073a578063bf63616d14610756578063c0c52e3b14610760578063c38c12d11461077e576102d6565b806392eefe9b1461060357806393f1a40b1461061f57806394f7f62b146106555780639742962c1461068657806397c86061146106b65780639bbc32dc146106d2576102d6565b806351eb05a611610241578063630b5ba1116101fa578063715018a6116101d4578063715018a61461058f57806386b278f21461059957806387264639146105c95780638da5cb5b146105e5576102d6565b8063630b5ba11461054b578063649c4905146105555780636aa9ba9614610585576102d6565b806351eb05a61461049f5780635312ea8e146104bb5780635aa6e675146104d75780635b8d3aa9146104f55780635c975abb146105115780635da7c1691461052f576102d6565b80631a90d1d1116102935780631a90d1d1146103cd578063211dc32d146103e957806329da6642146104195780632c943ec5146104495780632e9724401461046557806347e7ef2414610483576102d6565b80630184f5ff146102db578063081e3eda146102f75780630b5551fa1461031557806310098ad514610333578063148c99b2146103635780631526fe2714610393575b600080fd5b6102f560048036038101906102f09190613fe8565b610923565b005b6102ff6109e1565b60405161030c9190614ef9565b60405180910390f35b61031d6109ee565b60405161032a9190614ef9565b60405180910390f35b61034d60048036038101906103489190613fe8565b6109f4565b60405161035a9190614ef9565b60405180910390f35b61037d60048036038101906103789190614011565b610ad4565b60405161038a9190614ef9565b60405180910390f35b6103ad60048036038101906103a89190614279565b610b3f565b6040516103c49b9a99989796959493929190614b6c565b60405180910390f35b6103e760048036038101906103e2919061418a565b610bc6565b005b61040360048036038101906103fe9190614011565b610bf9565b6040516104109190614ef9565b60405180910390f35b610433600480360381019061042e9190613fe8565b610c1b565b6040516104409190614ef9565b60405180910390f35b610463600480360381019061045e9190613fe8565b610c33565b005b61046d610c7f565b60405161047a9190614a4d565b60405180910390f35b61049d6004803603810190610498919061414e565b610ca5565b005b6104b960048036038101906104b49190614279565b610cc1565b005b6104d560048036038101906104d09190614279565b610d11565b005b6104df61125a565b6040516104ec9190614a4d565b60405180910390f35b61050f600480360381019061050a91906140ff565b611280565b005b6105196112fb565b6040516105269190614b51565b60405180910390f35b61054960048036038101906105449190614202565b61130e565b005b61055361152f565b005b61056f600480360381019061056a9190613fe8565b61155c565b60405161057c9190614ef9565b60405180910390f35b61058d6115c9565b005b6105976117a0565b005b6105b360048036038101906105ae9190613fe8565b6118da565b6040516105c09190614ef9565b60405180910390f35b6105e360048036038101906105de919061414e565b6118f5565b005b6105ed611918565b6040516105fa9190614a4d565b60405180910390f35b61061d60048036038101906106189190613fe8565b611941565b005b610639600480360381019061063491906142cb565b6119fd565b60405161064c9796959493929190614f74565b60405180910390f35b61066f600480360381019061066a9190614279565b611a4c565b60405161067d929190614f14565b60405180910390f35b6106a0600480360381019061069b91906142cb565b611a96565b6040516106ad9190614ef9565b60405180910390f35b6106d060048036038101906106cb919061404d565b611ba9565b005b6106ec60048036038101906106e79190613fe8565b611ca9565b6040516106f99190614ef9565b60405180910390f35b61071c60048036038101906107179190613fe8565b611d16565b005b61073860048036038101906107339190613fe8565b611db9565b005b610754600480360381019061074f919061418a565b611e75565b005b61075e611ea8565b005b610768611f77565b6040516107759190614ef9565b60405180910390f35b6107986004803603810190610793919061414e565b611f7d565b005b6107b460048036038101906107af9190613fe8565b611fa0565b6040516107c19190614ef9565b60405180910390f35b6107e460048036038101906107df9190614307565b61210f565b005b6107ee6126d2565b6040516107fb9190614ef9565b60405180910390f35b61080c6126d8565b005b6108166127d1565b6040516108239190614ef9565b60405180910390f35b610846600480360381019061084191906142cb565b6127d7565b604051610854929190614f14565b60405180910390f35b61087760048036038101906108729190614307565b6128fd565b005b610893600480360381019061088e9190613fe8565b612fe3565b005b6108af60048036038101906108aa919061414e565b61318c565b005b6108cb60048036038101906108c691906140b0565b6131a8565b005b6108d5613250565b6040516108e29190614a4d565b60405180910390f35b61090560048036038101906109009190613fe8565b613276565b005b610921600480360381019061091c9190613fe8565b6132ea565b005b610971600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660008373ffffffffffffffffffffffffffffffffffffffff166133839092919063ffffffff16565b6109de600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8373ffffffffffffffffffffffffffffffffffffffff166133839092919063ffffffff16565b50565b6000600380549050905090565b60095481565b600080610a00836134e1565b905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a619190614a4d565b60206040518083038186803b158015610a7957600080fd5b505afa158015610a8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab191906142a2565b90508082600a015410610ac957600092505050610acf565b80925050505b919050565b60008060056000610ae486611fa0565b815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015491505092915050565b60038181548110610b4c57fe5b90600052602060002090600b02016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a015490508b565b610bce611ea8565b6000610bd9846134e1565b90508115610bea57610be961152f565b5b82816009018190555050505050565b600080610c0e610c0885611fa0565b846127d7565b5090508091505092915050565b60046020528060005260406000206000915090505481565b610c3b611ea8565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610cb083611fa0565b9050610cbc818361210f565b505050565b600060038281548110610cd057fe5b90600052602060002090600b0201905080600101544311610cf15750610d0e565b610cfa8161366a565b610d038161374b565b438160010181905550505b50565b60001515600260149054906101000a900460ff16151514610d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5e90614c59565b60405180910390fd5b600060038281548110610d7657fe5b90600052602060002090600b0201905060006005600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490506000819050600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ef257600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f72b2a4c8684336040518463ffffffff1660e01b8152600401610e9d93929190614f3d565b602060405180830381600087803b158015610eb757600080fd5b505af1158015610ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eef91906142a2565b90505b60008460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f519190614a4d565b60206040518083038186803b158015610f6957600080fd5b505afa158015610f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa191906142a2565b90508281101561116357600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449631708660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611021848761382c90919063ffffffff16565b6040518363ffffffff1660e01b815260040161103e929190614b28565b600060405180830381600087803b15801561105857600080fd5b505af115801561106c573d6000803e3d6000fd5b505050508460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110cd9190614a4d565b60206040518083038186803b1580156110e557600080fd5b505afa1580156110f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111d91906142a2565b905082811015611162576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115990614e39565b60405180910390fd5b5b60008460000181905550600084600101819055506000846002018190555060008460050181905550600084600601819055506111e433838760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661387c9092919063ffffffff16565b6111fb83866004015461382c90919063ffffffff16565b8560040181905550853373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05958560405161124a9190614ef9565b60405180910390a3505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611288611ea8565b60005b6003805490508110156112f5576000600382815481106112a757fe5b90600052602060002090600b020190506112e78160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868686611ba9565b50808060010191505061128b565b50505050565b600260149054906101000a900460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137590614e99565b60405180910390fd5b611386611ea8565b80156113955761139461152f565b5b60036040518061016001604052808773ffffffffffffffffffffffffffffffffffffffff16815260200143815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020018581525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0155505060016114e46109e1565b03600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050505050565b6000600380549050905060005b818110156115585761154d81610cc1565b80600101905061153c565b5050565b600080611568836134e1565b90506115c16115856001836004015461390290919063ffffffff16565b6115b362301ec06115a5612710866009015461395790919063ffffffff16565b61395790919063ffffffff16565b6139c790919063ffffffff16565b915050919050565b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141580156116775750600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b6116b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ad90614d99565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061175f5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61179e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179590614d99565b60405180910390fd5b565b6117a8613a1d565b73ffffffffffffffffffffffffffffffffffffffff166117c6611918565b73ffffffffffffffffffffffffffffffffffffffff161461181c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181390614df9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000806118e6836134e1565b90508060030154915050919050565b6118fd611ea8565b6000611908836134e1565b9050818160050181905550505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a890614c79565b60405180910390fd5b6119b9611ea8565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6005602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b60008060038381548110611a5c57fe5b90600052602060002090600b02016009015460038481548110611a7b57fe5b90600052602060002090600b02016008015491509150915091565b6000806005600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600060038581548110611afa57fe5b90600052602060002090600b02019050600082600001541480611b21575060008160040154145b15611b3157600092505050611ba3565b6000611b60611b4d83600101544361382c90919063ffffffff16565b836008015461395790919063ffffffff16565b9050611b9d8284611b988560040154611b8a670de0b6b3a76400008761395790919063ffffffff16565b6139c790919063ffffffff16565b613a25565b93505050505b92915050565b611bb1611ea8565b6000611bbc85611fa0565b9050611bc781610cc1565b60006005600083815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508315611c305760008160030181905550611c5e565b600060038381548110611c3f57fe5b90600052602060002090600b0201905080600201548260030181905550505b8215611c735760008160040181905550611ca1565b600060038381548110611c8257fe5b90600052602060002090600b0201905080600601548260040181905550505b505050505050565b600080611cb5836134e1565b9050611d0e611cd26001836004015461390290919063ffffffff16565b611d0062301ec0611cf2612710866008015461395790919063ffffffff16565b61395790919063ffffffff16565b6139c790919063ffffffff16565b915050919050565b6000611d2182611fa0565b9050611db5818373ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611d609190614a68565b60206040518083038186803b158015611d7857600080fd5b505afa158015611d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db091906142a2565b61210f565b5050565b8073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff161415611e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2090614cf9565b60405180910390fd5b611e31611ea8565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611e7d611ea8565b6000611e88846134e1565b90508115611e9957611e9861152f565b5b82816008018190555050505050565b611eb0611918565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611f365750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611f75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6c90614d99565b60405180910390fd5b565b600a5481565b611f85611ea8565b6000611f90836134e1565b90508181600a0181905550505050565b600081600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561208857508073ffffffffffffffffffffffffffffffffffffffff166003600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548154811061203e57fe5b90600052602060002090600b020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6120c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120be90614db9565b60405180910390fd5b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054915050919050565b60001515600260149054906101000a900460ff16151514612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215c90614c59565b60405180910390fd5b60008110156121a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a090614c39565b60405180910390fd5b6000600383815481106121b857fe5b90600052602060002090600b0201905060006005600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000826005015411156122875761224083836004015461390290919063ffffffff16565b82600501541015612286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227d90614d79565b60405180910390fd5b5b61229084610cc1565b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461237857600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638dbdbe6d8585336040518463ffffffff1660e01b815260040161234593929190614f3d565b600060405180830381600087803b15801561235f57600080fd5b505af1158015612373573d6000803e3d6000fd5b505050505b6000816000015411156123ba57600061239383836000613ada565b905060006123a384846000613a25565b905081836005018190555080836006018190555050505b60008311156125d65760008260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016124229190614a4d565b60206040518083038186803b15801561243a57600080fd5b505afa15801561244e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247291906142a2565b90506124c53330868660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613b8f909392919063ffffffff16565b60008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016125249190614a4d565b60206040518083038186803b15801561253c57600080fd5b505afa158015612550573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257491906142a2565b9050612589828261382c90919063ffffffff16565b945060008511156125d3576125ab85846000015461390290919063ffffffff16565b83600001819055506125ca85856004015461390290919063ffffffff16565b84600401819055505b50505b6126038260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166132ea565b612638670de0b6b3a764000061262a8460060154846000015461395790919063ffffffff16565b6139c790919063ffffffff16565b8160020181905550612675670de0b6b3a76400006126678460020154846000015461395790919063ffffffff16565b6139c790919063ffffffff16565b8160010181905550833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040516126c49190614ef9565b60405180910390a350505050565b60085481565b6126e0611918565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127665750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6127a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279c90614d99565b60405180910390fd5b600260149054906101000a900460ff1615600260146101000a81548160ff021916908315150217905550565b60075481565b60008060006005600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006003868154811061283d57fe5b90600052602060002090600b02019050600082600001541480612864575060008160040154145b15612877576000809350935050506128f6565b60006128a661289383600101544361382c90919063ffffffff16565b836009015461395790919063ffffffff16565b905060006128e583856128e086600401546128d2670de0b6b3a76400008861395790919063ffffffff16565b6139c790919063ffffffff16565b613ada565b905080846000015495509550505050505b9250929050565b60001515600260149054906101000a900460ff16151514612953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294a90614c59565b60405180910390fd5b6000811015612997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298e90614e79565b60405180910390fd5b6000600383815481106129a657fe5b90600052602060002090600b0201905060006005600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600001541015612a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4890614e19565b60405180910390fd5b612a5a84610cc1565b6000839050600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b6957600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630ad58d2f8686336040518463ffffffff1660e01b8152600401612b1493929190614f3d565b602060405180830381600087803b158015612b2e57600080fd5b505af1158015612b42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6691906142a2565b90505b600082600001541115612bdd576000612b8484846000613ada565b90506000612b9485856000613a25565b90506000846005018190555060008460060181905550612bda8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16338484613c18565b50505b6000841115612ee65760008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612c459190614a4d565b60206040518083038186803b158015612c5d57600080fd5b505afa158015612c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c9591906142a2565b905084811015612e5757600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449631708560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612d15848961382c90919063ffffffff16565b6040518363ffffffff1660e01b8152600401612d32929190614b28565b600060405180830381600087803b158015612d4c57600080fd5b505af1158015612d60573d6000803e3d6000fd5b505050508360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612dc19190614a4d565b60206040518083038186803b158015612dd957600080fd5b505afa158015612ded573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1191906142a2565b905084811015612e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4d90614e39565b60405180910390fd5b5b612e6e85846000015461382c90919063ffffffff16565b8360000181905550612e8d85856004015461382c90919063ffffffff16565b8460040181905550612ee433838660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661387c9092919063ffffffff16565b505b612f138360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166132ea565b612f48670de0b6b3a7640000612f3a8560060154856000015461395790919063ffffffff16565b6139c790919063ffffffff16565b8260020181905550612f85670de0b6b3a7640000612f778560020154856000015461395790919063ffffffff16565b6139c790919063ffffffff16565b8260010181905550843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56886604051612fd49190614ef9565b60405180910390a35050505050565b612feb613a1d565b73ffffffffffffffffffffffffffffffffffffffff16613009611918565b73ffffffffffffffffffffffffffffffffffffffff161461305f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305690614df9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156130cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c690614c99565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061319783611fa0565b90506131a381836128fd565b505050565b8273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff161415613218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320f90614cb9565b60405180910390fd5b613220611ea8565b61324b83828473ffffffffffffffffffffffffffffffffffffffff1661387c9092919063ffffffff16565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061328182611fa0565b905060006005600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506132e58282600001546128fd565b505050565b6132f381610923565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fdb5fefc826040518263ffffffff1660e01b815260040161334e9190614a4d565b600060405180830381600087803b15801561336857600080fd5b505af115801561337c573d6000803e3d6000fd5b5050505050565b600081148061341c575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b81526004016133ca929190614a83565b60206040518083038186803b1580156133e257600080fd5b505afa1580156133f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061341a91906142a2565b145b61345b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345290614ed9565b60405180910390fd5b6134dc8363095ea7b360e01b848460405160240161347a929190614b28565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613cfc565b505050565b600081600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156135c957508073ffffffffffffffffffffffffffffffffffffffff166003600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548154811061357f57fe5b90600052602060002090600b020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b613608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ff90614db9565b60405180910390fd5b6003600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548154811061365457fe5b90600052602060002090600b0201915050919050565b60008160090154111580613682575060008160040154145b1561368c57613748565b60006136bb6136a883600101544361382c90919063ffffffff16565b836009015461395790919063ffffffff16565b90506136d28160075461390290919063ffffffff16565b6007819055506136ef81836003015461390290919063ffffffff16565b826003018190555061373e82600201546137308460040154613722670de0b6b3a76400008661395790919063ffffffff16565b6139c790919063ffffffff16565b61390290919063ffffffff16565b8260020181905550505b50565b60008160080154111580613763575060008160040154145b1561376d57613829565b600061379c61378983600101544361382c90919063ffffffff16565b836008015461395790919063ffffffff16565b90506137b38160095461390290919063ffffffff16565b6009819055506137d081836007015461390290919063ffffffff16565b826007018190555061381f82600601546138118460040154613803670de0b6b3a76400008661395790919063ffffffff16565b6139c790919063ffffffff16565b61390290919063ffffffff16565b8260060181905550505b50565b600082821115613871576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161386890614d19565b60405180910390fd5b818303905092915050565b6138fd8363a9059cbb60e01b848460405160240161389b929190614b28565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613cfc565b505050565b60008082840190508381101561394d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161394490614cd9565b60405180910390fd5b8091505092915050565b60008083141561396a57600090506139c1565b600082840290508284828161397b57fe5b04146139bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139b390614dd9565b60405180910390fd5b809150505b92915050565b6000808211613a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0290614d59565b60405180910390fd5b818381613a1457fe5b04905092915050565b600033905090565b600080600084600401541115613a415783600401549050613a5b565b613a5883866006015461390290919063ffffffff16565b90505b600080613a8f670de0b6b3a7640000613a8185896000015461395790919063ffffffff16565b6139c790919063ffffffff16565b90508560020154811115613ab757613ab486600201548261382c90919063ffffffff16565b91505b613ace86600601548361390290919063ffffffff16565b93505050509392505050565b600080600084600301541115613af65783600301549050613b10565b613b0d83866002015461390290919063ffffffff16565b90505b600080613b44670de0b6b3a7640000613b3685896000015461395790919063ffffffff16565b6139c790919063ffffffff16565b90508560010154811115613b6c57613b6986600101548261382c90919063ffffffff16565b91505b613b8386600501548361390290919063ffffffff16565b93505050509392505050565b613c12846323b872dd60e01b858585604051602401613bb093929190614aac565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613cfc565b50505050565b6000821180613c275750600081115b15613cf657613c418260085461390290919063ffffffff16565b600881905550613c5c81600a5461390290919063ffffffff16565b600a81905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d190e157858585856040518563ffffffff1660e01b8152600401613cc39493929190614ae3565b600060405180830381600087803b158015613cdd57600080fd5b505af1158015613cf1573d6000803e3d6000fd5b505050505b50505050565b6060613d5e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613dc39092919063ffffffff16565b9050600081511115613dbe5780806020019051810190613d7e91906141d9565b613dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613db490614eb9565b60405180910390fd5b5b505050565b6060613dd28484600085613ddb565b90509392505050565b606082471015613e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e1790614d39565b60405180910390fd5b613e2985613ef0565b613e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e5f90614e59565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff168587604051613e929190614a36565b60006040518083038185875af1925050503d8060008114613ecf576040519150601f19603f3d011682016040523d82523d6000602084013e613ed4565b606091505b5091509150613ee4828286613f03565b92505050949350505050565b600080823b905060008111915050919050565b60608315613f1357829050613f63565b600083511115613f265782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f5a9190614c17565b60405180910390fd5b9392505050565b600081359050613f798161510d565b92915050565b600081359050613f8e81615124565b92915050565b600081519050613fa381615124565b92915050565b600081359050613fb88161513b565b92915050565b600081359050613fcd81615152565b92915050565b600081519050613fe281615152565b92915050565b600060208284031215613ffa57600080fd5b600061400884828501613f6a565b91505092915050565b6000806040838503121561402457600080fd5b600061403285828601613f6a565b925050602061404385828601613f6a565b9150509250929050565b6000806000806080858703121561406357600080fd5b600061407187828801613f6a565b945050602061408287828801613f6a565b935050604061409387828801613f7f565b92505060606140a487828801613f7f565b91505092959194509250565b6000806000606084860312156140c557600080fd5b60006140d386828701613f6a565b93505060206140e486828701613f6a565b92505060406140f586828701613fbe565b9150509250925092565b60008060006060848603121561411457600080fd5b600061412286828701613f6a565b935050602061413386828701613f7f565b925050604061414486828701613f7f565b9150509250925092565b6000806040838503121561416157600080fd5b600061416f85828601613f6a565b925050602061418085828601613fbe565b9150509250929050565b60008060006060848603121561419f57600080fd5b60006141ad86828701613f6a565b93505060206141be86828701613fbe565b92505060406141cf86828701613f7f565b9150509250925092565b6000602082840312156141eb57600080fd5b60006141f984828501613f94565b91505092915050565b600080600080600060a0868803121561421a57600080fd5b600061422888828901613fa9565b955050602061423988828901613fbe565b945050604061424a88828901613fbe565b935050606061425b88828901613fbe565b925050608061426c88828901613f7f565b9150509295509295909350565b60006020828403121561428b57600080fd5b600061429984828501613fbe565b91505092915050565b6000602082840312156142b457600080fd5b60006142c284828501613fd3565b91505092915050565b600080604083850312156142de57600080fd5b60006142ec85828601613fbe565b92505060206142fd85828601613f6a565b9150509250929050565b6000806040838503121561431a57600080fd5b600061432885828601613fbe565b925050602061433985828601613fbe565b9150509250929050565b61434c8161506f565b82525050565b61435b81615015565b82525050565b61436a81615027565b82525050565b600061437b82614fe3565b6143858185614ff9565b93506143958185602086016150c9565b80840191505092915050565b6143aa81615081565b82525050565b60006143bb82614fee565b6143c58185615004565b93506143d58185602086016150c9565b6143de816150fc565b840191505092915050565b60006143f6601183615004565b91507f6465706f7369743a206e6f7420676f6f640000000000000000000000000000006000830152602082019050919050565b6000614436601983615004565b91507f4d696e696e6720686173206265656e2073757370656e646564000000000000006000830152602082019050919050565b6000614476601e83615004565b91507f636f6e74726f6c6c657220697320746865207a65726f206164647265737300006000830152602082019050919050565b60006144b6602683615004565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061451c601783615004565b91507f6163636f756e742061646472657373206973207a65726f0000000000000000006000830152602082019050919050565b600061455c601b83615004565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600061459c601a83615004565b91507f676f7665726e616e63652061646472657373206973207a65726f0000000000006000830152602082019050919050565b60006145dc601e83615004565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b600061461c602683615004565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614682601a83615004565b91507f536166654d6174683a206469766973696f6e206279207a65726f0000000000006000830152602082019050919050565b60006146c2601483615004565b91507f6465706f73697420616d6f756e74206c696d69740000000000000000000000006000830152602082019050919050565b6000614702600983615004565b91507f6e6f7420616c6c6f7700000000000000000000000000000000000000000000006000830152602082019050919050565b6000614742601083615004565b91507f746f6b656e206e6f7420657869737473000000000000000000000000000000006000830152602082019050919050565b6000614782602183615004565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006147e8602083615004565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614828601e83615004565b91507f77697468647261773a20496e73756666696369656e742062616c616e636500006000830152602082019050919050565b6000614868601483615004565b91507f77697468647261773a206e6565642068656467650000000000000000000000006000830152602082019050919050565b60006148a8601d83615004565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b60006148e8601283615004565b91507f77697468647261773a206e6f7420676f6f6400000000000000000000000000006000830152602082019050919050565b6000614928601983615004565b91507f746f6b656e20697320746865207a65726f2061646472657373000000000000006000830152602082019050919050565b6000614968602a83615004565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b60006149ce603683615004565b91507f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008301527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006020830152604082019050919050565b614a3081615065565b82525050565b6000614a428284614370565b915081905092915050565b6000602082019050614a626000830184614352565b92915050565b6000602082019050614a7d6000830184614343565b92915050565b6000604082019050614a986000830185614352565b614aa56020830184614352565b9392505050565b6000606082019050614ac16000830186614352565b614ace6020830185614352565b614adb6040830184614a27565b949350505050565b6000608082019050614af86000830187614352565b614b056020830186614352565b614b126040830185614a27565b614b1f6060830184614a27565b95945050505050565b6000604082019050614b3d6000830185614352565b614b4a6020830184614a27565b9392505050565b6000602082019050614b666000830184614361565b92915050565b600061016082019050614b82600083018e6143a1565b614b8f602083018d614a27565b614b9c604083018c614a27565b614ba9606083018b614a27565b614bb6608083018a614a27565b614bc360a0830189614a27565b614bd060c0830188614a27565b614bdd60e0830187614a27565b614beb610100830186614a27565b614bf9610120830185614a27565b614c07610140830184614a27565b9c9b505050505050505050505050565b60006020820190508181036000830152614c3181846143b0565b905092915050565b60006020820190508181036000830152614c52816143e9565b9050919050565b60006020820190508181036000830152614c7281614429565b9050919050565b60006020820190508181036000830152614c9281614469565b9050919050565b60006020820190508181036000830152614cb2816144a9565b9050919050565b60006020820190508181036000830152614cd28161450f565b9050919050565b60006020820190508181036000830152614cf28161454f565b9050919050565b60006020820190508181036000830152614d128161458f565b9050919050565b60006020820190508181036000830152614d32816145cf565b9050919050565b60006020820190508181036000830152614d528161460f565b9050919050565b60006020820190508181036000830152614d7281614675565b9050919050565b60006020820190508181036000830152614d92816146b5565b9050919050565b60006020820190508181036000830152614db2816146f5565b9050919050565b60006020820190508181036000830152614dd281614735565b9050919050565b60006020820190508181036000830152614df281614775565b9050919050565b60006020820190508181036000830152614e12816147db565b9050919050565b60006020820190508181036000830152614e328161481b565b9050919050565b60006020820190508181036000830152614e528161485b565b9050919050565b60006020820190508181036000830152614e728161489b565b9050919050565b60006020820190508181036000830152614e92816148db565b9050919050565b60006020820190508181036000830152614eb28161491b565b9050919050565b60006020820190508181036000830152614ed28161495b565b9050919050565b60006020820190508181036000830152614ef2816149c1565b9050919050565b6000602082019050614f0e6000830184614a27565b92915050565b6000604082019050614f296000830185614a27565b614f366020830184614a27565b9392505050565b6000606082019050614f526000830186614a27565b614f5f6020830185614a27565b614f6c6040830184614343565b949350505050565b600060e082019050614f89600083018a614a27565b614f966020830189614a27565b614fa36040830188614a27565b614fb06060830187614a27565b614fbd6080830186614a27565b614fca60a0830185614a27565b614fd760c0830184614a27565b98975050505050505050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600061502082615045565b9050919050565b60008115159050919050565b600061503e82615015565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061507a826150a5565b9050919050565b600061508c82615093565b9050919050565b600061509e82615045565b9050919050565b60006150b0826150b7565b9050919050565b60006150c282615045565b9050919050565b60005b838110156150e75780820151818401526020810190506150cc565b838111156150f6576000848401525b50505050565b6000601f19601f8301169050919050565b61511681615015565b811461512157600080fd5b50565b61512d81615027565b811461513857600080fd5b50565b61514481615033565b811461514f57600080fd5b50565b61515b81615065565b811461516657600080fd5b5056fea26469706673582212209194bf3c55a4e30dd28be8c655c4441ba2158f0601b4634f116f816b5198b5b164736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102d65760003560e01c806392eefe9b11610182578063caa9a08d116100e9578063e6910d25116100a2578063f587268a1161007c578063f587268a146108b1578063f77c4791146108cd578063fa09e630146108eb578063fdb5fefc14610907576102d6565b8063e6910d251461085d578063f2fde38b14610879578063f3fef3a314610895576102d6565b8063caa9a08d1461079a578063cb9b08cc146107ca578063d2d3bb44146107e6578063d431b1ac14610804578063de34f54d1461080e578063e4c75c271461082c576102d6565b80639f0d5f271161013b5780639f0d5f2714610702578063ab033ea91461071e578063af067ba91461073a578063bf63616d14610756578063c0c52e3b14610760578063c38c12d11461077e576102d6565b806392eefe9b1461060357806393f1a40b1461061f57806394f7f62b146106555780639742962c1461068657806397c86061146106b65780639bbc32dc146106d2576102d6565b806351eb05a611610241578063630b5ba1116101fa578063715018a6116101d4578063715018a61461058f57806386b278f21461059957806387264639146105c95780638da5cb5b146105e5576102d6565b8063630b5ba11461054b578063649c4905146105555780636aa9ba9614610585576102d6565b806351eb05a61461049f5780635312ea8e146104bb5780635aa6e675146104d75780635b8d3aa9146104f55780635c975abb146105115780635da7c1691461052f576102d6565b80631a90d1d1116102935780631a90d1d1146103cd578063211dc32d146103e957806329da6642146104195780632c943ec5146104495780632e9724401461046557806347e7ef2414610483576102d6565b80630184f5ff146102db578063081e3eda146102f75780630b5551fa1461031557806310098ad514610333578063148c99b2146103635780631526fe2714610393575b600080fd5b6102f560048036038101906102f09190613fe8565b610923565b005b6102ff6109e1565b60405161030c9190614ef9565b60405180910390f35b61031d6109ee565b60405161032a9190614ef9565b60405180910390f35b61034d60048036038101906103489190613fe8565b6109f4565b60405161035a9190614ef9565b60405180910390f35b61037d60048036038101906103789190614011565b610ad4565b60405161038a9190614ef9565b60405180910390f35b6103ad60048036038101906103a89190614279565b610b3f565b6040516103c49b9a99989796959493929190614b6c565b60405180910390f35b6103e760048036038101906103e2919061418a565b610bc6565b005b61040360048036038101906103fe9190614011565b610bf9565b6040516104109190614ef9565b60405180910390f35b610433600480360381019061042e9190613fe8565b610c1b565b6040516104409190614ef9565b60405180910390f35b610463600480360381019061045e9190613fe8565b610c33565b005b61046d610c7f565b60405161047a9190614a4d565b60405180910390f35b61049d6004803603810190610498919061414e565b610ca5565b005b6104b960048036038101906104b49190614279565b610cc1565b005b6104d560048036038101906104d09190614279565b610d11565b005b6104df61125a565b6040516104ec9190614a4d565b60405180910390f35b61050f600480360381019061050a91906140ff565b611280565b005b6105196112fb565b6040516105269190614b51565b60405180910390f35b61054960048036038101906105449190614202565b61130e565b005b61055361152f565b005b61056f600480360381019061056a9190613fe8565b61155c565b60405161057c9190614ef9565b60405180910390f35b61058d6115c9565b005b6105976117a0565b005b6105b360048036038101906105ae9190613fe8565b6118da565b6040516105c09190614ef9565b60405180910390f35b6105e360048036038101906105de919061414e565b6118f5565b005b6105ed611918565b6040516105fa9190614a4d565b60405180910390f35b61061d60048036038101906106189190613fe8565b611941565b005b610639600480360381019061063491906142cb565b6119fd565b60405161064c9796959493929190614f74565b60405180910390f35b61066f600480360381019061066a9190614279565b611a4c565b60405161067d929190614f14565b60405180910390f35b6106a0600480360381019061069b91906142cb565b611a96565b6040516106ad9190614ef9565b60405180910390f35b6106d060048036038101906106cb919061404d565b611ba9565b005b6106ec60048036038101906106e79190613fe8565b611ca9565b6040516106f99190614ef9565b60405180910390f35b61071c60048036038101906107179190613fe8565b611d16565b005b61073860048036038101906107339190613fe8565b611db9565b005b610754600480360381019061074f919061418a565b611e75565b005b61075e611ea8565b005b610768611f77565b6040516107759190614ef9565b60405180910390f35b6107986004803603810190610793919061414e565b611f7d565b005b6107b460048036038101906107af9190613fe8565b611fa0565b6040516107c19190614ef9565b60405180910390f35b6107e460048036038101906107df9190614307565b61210f565b005b6107ee6126d2565b6040516107fb9190614ef9565b60405180910390f35b61080c6126d8565b005b6108166127d1565b6040516108239190614ef9565b60405180910390f35b610846600480360381019061084191906142cb565b6127d7565b604051610854929190614f14565b60405180910390f35b61087760048036038101906108729190614307565b6128fd565b005b610893600480360381019061088e9190613fe8565b612fe3565b005b6108af60048036038101906108aa919061414e565b61318c565b005b6108cb60048036038101906108c691906140b0565b6131a8565b005b6108d5613250565b6040516108e29190614a4d565b60405180910390f35b61090560048036038101906109009190613fe8565b613276565b005b610921600480360381019061091c9190613fe8565b6132ea565b005b610971600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660008373ffffffffffffffffffffffffffffffffffffffff166133839092919063ffffffff16565b6109de600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8373ffffffffffffffffffffffffffffffffffffffff166133839092919063ffffffff16565b50565b6000600380549050905090565b60095481565b600080610a00836134e1565b905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a619190614a4d565b60206040518083038186803b158015610a7957600080fd5b505afa158015610a8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab191906142a2565b90508082600a015410610ac957600092505050610acf565b80925050505b919050565b60008060056000610ae486611fa0565b815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015491505092915050565b60038181548110610b4c57fe5b90600052602060002090600b02016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a015490508b565b610bce611ea8565b6000610bd9846134e1565b90508115610bea57610be961152f565b5b82816009018190555050505050565b600080610c0e610c0885611fa0565b846127d7565b5090508091505092915050565b60046020528060005260406000206000915090505481565b610c3b611ea8565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610cb083611fa0565b9050610cbc818361210f565b505050565b600060038281548110610cd057fe5b90600052602060002090600b0201905080600101544311610cf15750610d0e565b610cfa8161366a565b610d038161374b565b438160010181905550505b50565b60001515600260149054906101000a900460ff16151514610d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5e90614c59565b60405180910390fd5b600060038281548110610d7657fe5b90600052602060002090600b0201905060006005600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490506000819050600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ef257600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f72b2a4c8684336040518463ffffffff1660e01b8152600401610e9d93929190614f3d565b602060405180830381600087803b158015610eb757600080fd5b505af1158015610ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eef91906142a2565b90505b60008460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f519190614a4d565b60206040518083038186803b158015610f6957600080fd5b505afa158015610f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa191906142a2565b90508281101561116357600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449631708660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611021848761382c90919063ffffffff16565b6040518363ffffffff1660e01b815260040161103e929190614b28565b600060405180830381600087803b15801561105857600080fd5b505af115801561106c573d6000803e3d6000fd5b505050508460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110cd9190614a4d565b60206040518083038186803b1580156110e557600080fd5b505afa1580156110f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111d91906142a2565b905082811015611162576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115990614e39565b60405180910390fd5b5b60008460000181905550600084600101819055506000846002018190555060008460050181905550600084600601819055506111e433838760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661387c9092919063ffffffff16565b6111fb83866004015461382c90919063ffffffff16565b8560040181905550853373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05958560405161124a9190614ef9565b60405180910390a3505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611288611ea8565b60005b6003805490508110156112f5576000600382815481106112a757fe5b90600052602060002090600b020190506112e78160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868686611ba9565b50808060010191505061128b565b50505050565b600260149054906101000a900460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137590614e99565b60405180910390fd5b611386611ea8565b80156113955761139461152f565b5b60036040518061016001604052808773ffffffffffffffffffffffffffffffffffffffff16815260200143815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020018581525090806001815401808255809150506001900390600052602060002090600b020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0155505060016114e46109e1565b03600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050505050565b6000600380549050905060005b818110156115585761154d81610cc1565b80600101905061153c565b5050565b600080611568836134e1565b90506115c16115856001836004015461390290919063ffffffff16565b6115b362301ec06115a5612710866009015461395790919063ffffffff16565b61395790919063ffffffff16565b6139c790919063ffffffff16565b915050919050565b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141580156116775750600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b6116b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ad90614d99565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061175f5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61179e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179590614d99565b60405180910390fd5b565b6117a8613a1d565b73ffffffffffffffffffffffffffffffffffffffff166117c6611918565b73ffffffffffffffffffffffffffffffffffffffff161461181c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181390614df9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000806118e6836134e1565b90508060030154915050919050565b6118fd611ea8565b6000611908836134e1565b9050818160050181905550505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a890614c79565b60405180910390fd5b6119b9611ea8565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6005602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b60008060038381548110611a5c57fe5b90600052602060002090600b02016009015460038481548110611a7b57fe5b90600052602060002090600b02016008015491509150915091565b6000806005600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600060038581548110611afa57fe5b90600052602060002090600b02019050600082600001541480611b21575060008160040154145b15611b3157600092505050611ba3565b6000611b60611b4d83600101544361382c90919063ffffffff16565b836008015461395790919063ffffffff16565b9050611b9d8284611b988560040154611b8a670de0b6b3a76400008761395790919063ffffffff16565b6139c790919063ffffffff16565b613a25565b93505050505b92915050565b611bb1611ea8565b6000611bbc85611fa0565b9050611bc781610cc1565b60006005600083815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508315611c305760008160030181905550611c5e565b600060038381548110611c3f57fe5b90600052602060002090600b0201905080600201548260030181905550505b8215611c735760008160040181905550611ca1565b600060038381548110611c8257fe5b90600052602060002090600b0201905080600601548260040181905550505b505050505050565b600080611cb5836134e1565b9050611d0e611cd26001836004015461390290919063ffffffff16565b611d0062301ec0611cf2612710866008015461395790919063ffffffff16565b61395790919063ffffffff16565b6139c790919063ffffffff16565b915050919050565b6000611d2182611fa0565b9050611db5818373ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611d609190614a68565b60206040518083038186803b158015611d7857600080fd5b505afa158015611d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db091906142a2565b61210f565b5050565b8073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff161415611e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2090614cf9565b60405180910390fd5b611e31611ea8565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611e7d611ea8565b6000611e88846134e1565b90508115611e9957611e9861152f565b5b82816008018190555050505050565b611eb0611918565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611f365750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611f75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6c90614d99565b60405180910390fd5b565b600a5481565b611f85611ea8565b6000611f90836134e1565b90508181600a0181905550505050565b600081600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561208857508073ffffffffffffffffffffffffffffffffffffffff166003600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548154811061203e57fe5b90600052602060002090600b020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6120c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120be90614db9565b60405180910390fd5b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054915050919050565b60001515600260149054906101000a900460ff16151514612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215c90614c59565b60405180910390fd5b60008110156121a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a090614c39565b60405180910390fd5b6000600383815481106121b857fe5b90600052602060002090600b0201905060006005600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000826005015411156122875761224083836004015461390290919063ffffffff16565b82600501541015612286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227d90614d79565b60405180910390fd5b5b61229084610cc1565b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461237857600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638dbdbe6d8585336040518463ffffffff1660e01b815260040161234593929190614f3d565b600060405180830381600087803b15801561235f57600080fd5b505af1158015612373573d6000803e3d6000fd5b505050505b6000816000015411156123ba57600061239383836000613ada565b905060006123a384846000613a25565b905081836005018190555080836006018190555050505b60008311156125d65760008260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016124229190614a4d565b60206040518083038186803b15801561243a57600080fd5b505afa15801561244e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247291906142a2565b90506124c53330868660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613b8f909392919063ffffffff16565b60008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016125249190614a4d565b60206040518083038186803b15801561253c57600080fd5b505afa158015612550573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257491906142a2565b9050612589828261382c90919063ffffffff16565b945060008511156125d3576125ab85846000015461390290919063ffffffff16565b83600001819055506125ca85856004015461390290919063ffffffff16565b84600401819055505b50505b6126038260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166132ea565b612638670de0b6b3a764000061262a8460060154846000015461395790919063ffffffff16565b6139c790919063ffffffff16565b8160020181905550612675670de0b6b3a76400006126678460020154846000015461395790919063ffffffff16565b6139c790919063ffffffff16565b8160010181905550833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040516126c49190614ef9565b60405180910390a350505050565b60085481565b6126e0611918565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127665750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6127a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279c90614d99565b60405180910390fd5b600260149054906101000a900460ff1615600260146101000a81548160ff021916908315150217905550565b60075481565b60008060006005600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006003868154811061283d57fe5b90600052602060002090600b02019050600082600001541480612864575060008160040154145b15612877576000809350935050506128f6565b60006128a661289383600101544361382c90919063ffffffff16565b836009015461395790919063ffffffff16565b905060006128e583856128e086600401546128d2670de0b6b3a76400008861395790919063ffffffff16565b6139c790919063ffffffff16565b613ada565b905080846000015495509550505050505b9250929050565b60001515600260149054906101000a900460ff16151514612953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294a90614c59565b60405180910390fd5b6000811015612997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298e90614e79565b60405180910390fd5b6000600383815481106129a657fe5b90600052602060002090600b0201905060006005600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600001541015612a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4890614e19565b60405180910390fd5b612a5a84610cc1565b6000839050600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b6957600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630ad58d2f8686336040518463ffffffff1660e01b8152600401612b1493929190614f3d565b602060405180830381600087803b158015612b2e57600080fd5b505af1158015612b42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6691906142a2565b90505b600082600001541115612bdd576000612b8484846000613ada565b90506000612b9485856000613a25565b90506000846005018190555060008460060181905550612bda8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16338484613c18565b50505b6000841115612ee65760008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612c459190614a4d565b60206040518083038186803b158015612c5d57600080fd5b505afa158015612c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c9591906142a2565b905084811015612e5757600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663449631708560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612d15848961382c90919063ffffffff16565b6040518363ffffffff1660e01b8152600401612d32929190614b28565b600060405180830381600087803b158015612d4c57600080fd5b505af1158015612d60573d6000803e3d6000fd5b505050508360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612dc19190614a4d565b60206040518083038186803b158015612dd957600080fd5b505afa158015612ded573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1191906142a2565b905084811015612e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4d90614e39565b60405180910390fd5b5b612e6e85846000015461382c90919063ffffffff16565b8360000181905550612e8d85856004015461382c90919063ffffffff16565b8460040181905550612ee433838660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661387c9092919063ffffffff16565b505b612f138360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166132ea565b612f48670de0b6b3a7640000612f3a8560060154856000015461395790919063ffffffff16565b6139c790919063ffffffff16565b8260020181905550612f85670de0b6b3a7640000612f778560020154856000015461395790919063ffffffff16565b6139c790919063ffffffff16565b8260010181905550843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56886604051612fd49190614ef9565b60405180910390a35050505050565b612feb613a1d565b73ffffffffffffffffffffffffffffffffffffffff16613009611918565b73ffffffffffffffffffffffffffffffffffffffff161461305f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305690614df9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156130cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c690614c99565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061319783611fa0565b90506131a381836128fd565b505050565b8273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff161415613218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320f90614cb9565b60405180910390fd5b613220611ea8565b61324b83828473ffffffffffffffffffffffffffffffffffffffff1661387c9092919063ffffffff16565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061328182611fa0565b905060006005600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506132e58282600001546128fd565b505050565b6132f381610923565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fdb5fefc826040518263ffffffff1660e01b815260040161334e9190614a4d565b600060405180830381600087803b15801561336857600080fd5b505af115801561337c573d6000803e3d6000fd5b5050505050565b600081148061341c575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b81526004016133ca929190614a83565b60206040518083038186803b1580156133e257600080fd5b505afa1580156133f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061341a91906142a2565b145b61345b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345290614ed9565b60405180910390fd5b6134dc8363095ea7b360e01b848460405160240161347a929190614b28565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613cfc565b505050565b600081600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156135c957508073ffffffffffffffffffffffffffffffffffffffff166003600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548154811061357f57fe5b90600052602060002090600b020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b613608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ff90614db9565b60405180910390fd5b6003600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548154811061365457fe5b90600052602060002090600b0201915050919050565b60008160090154111580613682575060008160040154145b1561368c57613748565b60006136bb6136a883600101544361382c90919063ffffffff16565b836009015461395790919063ffffffff16565b90506136d28160075461390290919063ffffffff16565b6007819055506136ef81836003015461390290919063ffffffff16565b826003018190555061373e82600201546137308460040154613722670de0b6b3a76400008661395790919063ffffffff16565b6139c790919063ffffffff16565b61390290919063ffffffff16565b8260020181905550505b50565b60008160080154111580613763575060008160040154145b1561376d57613829565b600061379c61378983600101544361382c90919063ffffffff16565b836008015461395790919063ffffffff16565b90506137b38160095461390290919063ffffffff16565b6009819055506137d081836007015461390290919063ffffffff16565b826007018190555061381f82600601546138118460040154613803670de0b6b3a76400008661395790919063ffffffff16565b6139c790919063ffffffff16565b61390290919063ffffffff16565b8260060181905550505b50565b600082821115613871576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161386890614d19565b60405180910390fd5b818303905092915050565b6138fd8363a9059cbb60e01b848460405160240161389b929190614b28565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613cfc565b505050565b60008082840190508381101561394d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161394490614cd9565b60405180910390fd5b8091505092915050565b60008083141561396a57600090506139c1565b600082840290508284828161397b57fe5b04146139bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139b390614dd9565b60405180910390fd5b809150505b92915050565b6000808211613a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0290614d59565b60405180910390fd5b818381613a1457fe5b04905092915050565b600033905090565b600080600084600401541115613a415783600401549050613a5b565b613a5883866006015461390290919063ffffffff16565b90505b600080613a8f670de0b6b3a7640000613a8185896000015461395790919063ffffffff16565b6139c790919063ffffffff16565b90508560020154811115613ab757613ab486600201548261382c90919063ffffffff16565b91505b613ace86600601548361390290919063ffffffff16565b93505050509392505050565b600080600084600301541115613af65783600301549050613b10565b613b0d83866002015461390290919063ffffffff16565b90505b600080613b44670de0b6b3a7640000613b3685896000015461395790919063ffffffff16565b6139c790919063ffffffff16565b90508560010154811115613b6c57613b6986600101548261382c90919063ffffffff16565b91505b613b8386600501548361390290919063ffffffff16565b93505050509392505050565b613c12846323b872dd60e01b858585604051602401613bb093929190614aac565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613cfc565b50505050565b6000821180613c275750600081115b15613cf657613c418260085461390290919063ffffffff16565b600881905550613c5c81600a5461390290919063ffffffff16565b600a81905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d190e157858585856040518563ffffffff1660e01b8152600401613cc39493929190614ae3565b600060405180830381600087803b158015613cdd57600080fd5b505af1158015613cf1573d6000803e3d6000fd5b505050505b50505050565b6060613d5e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613dc39092919063ffffffff16565b9050600081511115613dbe5780806020019051810190613d7e91906141d9565b613dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613db490614eb9565b60405180910390fd5b5b505050565b6060613dd28484600085613ddb565b90509392505050565b606082471015613e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e1790614d39565b60405180910390fd5b613e2985613ef0565b613e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e5f90614e59565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff168587604051613e929190614a36565b60006040518083038185875af1925050503d8060008114613ecf576040519150601f19603f3d011682016040523d82523d6000602084013e613ed4565b606091505b5091509150613ee4828286613f03565b92505050949350505050565b600080823b905060008111915050919050565b60608315613f1357829050613f63565b600083511115613f265782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f5a9190614c17565b60405180910390fd5b9392505050565b600081359050613f798161510d565b92915050565b600081359050613f8e81615124565b92915050565b600081519050613fa381615124565b92915050565b600081359050613fb88161513b565b92915050565b600081359050613fcd81615152565b92915050565b600081519050613fe281615152565b92915050565b600060208284031215613ffa57600080fd5b600061400884828501613f6a565b91505092915050565b6000806040838503121561402457600080fd5b600061403285828601613f6a565b925050602061404385828601613f6a565b9150509250929050565b6000806000806080858703121561406357600080fd5b600061407187828801613f6a565b945050602061408287828801613f6a565b935050604061409387828801613f7f565b92505060606140a487828801613f7f565b91505092959194509250565b6000806000606084860312156140c557600080fd5b60006140d386828701613f6a565b93505060206140e486828701613f6a565b92505060406140f586828701613fbe565b9150509250925092565b60008060006060848603121561411457600080fd5b600061412286828701613f6a565b935050602061413386828701613f7f565b925050604061414486828701613f7f565b9150509250925092565b6000806040838503121561416157600080fd5b600061416f85828601613f6a565b925050602061418085828601613fbe565b9150509250929050565b60008060006060848603121561419f57600080fd5b60006141ad86828701613f6a565b93505060206141be86828701613fbe565b92505060406141cf86828701613f7f565b9150509250925092565b6000602082840312156141eb57600080fd5b60006141f984828501613f94565b91505092915050565b600080600080600060a0868803121561421a57600080fd5b600061422888828901613fa9565b955050602061423988828901613fbe565b945050604061424a88828901613fbe565b935050606061425b88828901613fbe565b925050608061426c88828901613f7f565b9150509295509295909350565b60006020828403121561428b57600080fd5b600061429984828501613fbe565b91505092915050565b6000602082840312156142b457600080fd5b60006142c284828501613fd3565b91505092915050565b600080604083850312156142de57600080fd5b60006142ec85828601613fbe565b92505060206142fd85828601613f6a565b9150509250929050565b6000806040838503121561431a57600080fd5b600061432885828601613fbe565b925050602061433985828601613fbe565b9150509250929050565b61434c8161506f565b82525050565b61435b81615015565b82525050565b61436a81615027565b82525050565b600061437b82614fe3565b6143858185614ff9565b93506143958185602086016150c9565b80840191505092915050565b6143aa81615081565b82525050565b60006143bb82614fee565b6143c58185615004565b93506143d58185602086016150c9565b6143de816150fc565b840191505092915050565b60006143f6601183615004565b91507f6465706f7369743a206e6f7420676f6f640000000000000000000000000000006000830152602082019050919050565b6000614436601983615004565b91507f4d696e696e6720686173206265656e2073757370656e646564000000000000006000830152602082019050919050565b6000614476601e83615004565b91507f636f6e74726f6c6c657220697320746865207a65726f206164647265737300006000830152602082019050919050565b60006144b6602683615004565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061451c601783615004565b91507f6163636f756e742061646472657373206973207a65726f0000000000000000006000830152602082019050919050565b600061455c601b83615004565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b600061459c601a83615004565b91507f676f7665726e616e63652061646472657373206973207a65726f0000000000006000830152602082019050919050565b60006145dc601e83615004565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b600061461c602683615004565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614682601a83615004565b91507f536166654d6174683a206469766973696f6e206279207a65726f0000000000006000830152602082019050919050565b60006146c2601483615004565b91507f6465706f73697420616d6f756e74206c696d69740000000000000000000000006000830152602082019050919050565b6000614702600983615004565b91507f6e6f7420616c6c6f7700000000000000000000000000000000000000000000006000830152602082019050919050565b6000614742601083615004565b91507f746f6b656e206e6f7420657869737473000000000000000000000000000000006000830152602082019050919050565b6000614782602183615004565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006147e8602083615004565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614828601e83615004565b91507f77697468647261773a20496e73756666696369656e742062616c616e636500006000830152602082019050919050565b6000614868601483615004565b91507f77697468647261773a206e6565642068656467650000000000000000000000006000830152602082019050919050565b60006148a8601d83615004565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b60006148e8601283615004565b91507f77697468647261773a206e6f7420676f6f6400000000000000000000000000006000830152602082019050919050565b6000614928601983615004565b91507f746f6b656e20697320746865207a65726f2061646472657373000000000000006000830152602082019050919050565b6000614968602a83615004565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b60006149ce603683615004565b91507f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008301527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006020830152604082019050919050565b614a3081615065565b82525050565b6000614a428284614370565b915081905092915050565b6000602082019050614a626000830184614352565b92915050565b6000602082019050614a7d6000830184614343565b92915050565b6000604082019050614a986000830185614352565b614aa56020830184614352565b9392505050565b6000606082019050614ac16000830186614352565b614ace6020830185614352565b614adb6040830184614a27565b949350505050565b6000608082019050614af86000830187614352565b614b056020830186614352565b614b126040830185614a27565b614b1f6060830184614a27565b95945050505050565b6000604082019050614b3d6000830185614352565b614b4a6020830184614a27565b9392505050565b6000602082019050614b666000830184614361565b92915050565b600061016082019050614b82600083018e6143a1565b614b8f602083018d614a27565b614b9c604083018c614a27565b614ba9606083018b614a27565b614bb6608083018a614a27565b614bc360a0830189614a27565b614bd060c0830188614a27565b614bdd60e0830187614a27565b614beb610100830186614a27565b614bf9610120830185614a27565b614c07610140830184614a27565b9c9b505050505050505050505050565b60006020820190508181036000830152614c3181846143b0565b905092915050565b60006020820190508181036000830152614c52816143e9565b9050919050565b60006020820190508181036000830152614c7281614429565b9050919050565b60006020820190508181036000830152614c9281614469565b9050919050565b60006020820190508181036000830152614cb2816144a9565b9050919050565b60006020820190508181036000830152614cd28161450f565b9050919050565b60006020820190508181036000830152614cf28161454f565b9050919050565b60006020820190508181036000830152614d128161458f565b9050919050565b60006020820190508181036000830152614d32816145cf565b9050919050565b60006020820190508181036000830152614d528161460f565b9050919050565b60006020820190508181036000830152614d7281614675565b9050919050565b60006020820190508181036000830152614d92816146b5565b9050919050565b60006020820190508181036000830152614db2816146f5565b9050919050565b60006020820190508181036000830152614dd281614735565b9050919050565b60006020820190508181036000830152614df281614775565b9050919050565b60006020820190508181036000830152614e12816147db565b9050919050565b60006020820190508181036000830152614e328161481b565b9050919050565b60006020820190508181036000830152614e528161485b565b9050919050565b60006020820190508181036000830152614e728161489b565b9050919050565b60006020820190508181036000830152614e92816148db565b9050919050565b60006020820190508181036000830152614eb28161491b565b9050919050565b60006020820190508181036000830152614ed28161495b565b9050919050565b60006020820190508181036000830152614ef2816149c1565b9050919050565b6000602082019050614f0e6000830184614a27565b92915050565b6000604082019050614f296000830185614a27565b614f366020830184614a27565b9392505050565b6000606082019050614f526000830186614a27565b614f5f6020830185614a27565b614f6c6040830184614343565b949350505050565b600060e082019050614f89600083018a614a27565b614f966020830189614a27565b614fa36040830188614a27565b614fb06060830187614a27565b614fbd6080830186614a27565b614fca60a0830185614a27565b614fd760c0830184614a27565b98975050505050505050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600061502082615045565b9050919050565b60008115159050919050565b600061503e82615015565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061507a826150a5565b9050919050565b600061508c82615093565b9050919050565b600061509e82615045565b9050919050565b60006150b0826150b7565b9050919050565b60006150c282615045565b9050919050565b60005b838110156150e75780820151818401526020810190506150cc565b838111156150f6576000848401525b50505050565b6000601f19601f8301169050919050565b61511681615015565b811461512157600080fd5b50565b61512d81615027565b811461513857600080fd5b50565b61514481615033565b811461514f57600080fd5b50565b61515b81615065565b811461516657600080fd5b5056fea26469706673582212209194bf3c55a4e30dd28be8c655c4441ba2158f0601b4634f116f816b5198b5b164736f6c634300060c0033
Deployed Bytecode Sourcemap
32616:18475:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36440:190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33581:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38167:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48759:279;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50070:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32924:26;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;34703:284;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49841:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32995:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33436:137;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33186:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50309:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38286:290;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46563:1199;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25806:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35863:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25870:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36747:777;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37568:180;;;:::i;:::-;;49170:290;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26234:218;;;:::i;:::-;;2859:148;;;:::i;:::-;;48372:167;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34139:198;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2208:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26698:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33083:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;33971:160;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;40534:498;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35034:782;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49510:293;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50493:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26493:197;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34378:284;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26089:137;;;:::i;:::-;;38240:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36192:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33838:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42513:1932;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38097:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26907:145;;;:::i;:::-;;38030:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39915:556;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;44523:1990;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3162:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50694:154;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27089:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25753:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50883:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48593:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36440:190;36512:49;36538:10;;;;;;;;;;;36558:1;36519:5;36512:25;;;;:49;;;;;:::i;:::-;36572:50;36598:10;;;;;;;;;;;36618:2;36579:5;36572:25;;;;:50;;;;;:::i;:::-;36440:190;:::o;33581:93::-;33624:7;33651:8;:15;;;;33644:22;;33581:93;:::o;38167:33::-;;;;:::o;48759:279::-;48814:7;48834:21;48858:18;48870:5;48858:11;:18::i;:::-;48834:42;;48887:6;48896:4;:10;;;;;;;;;;;;:20;;;48925:4;48896:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48887:44;;48969:1;48946:4;:19;;;:24;48943:69;;48998:1;48986:14;;;;;;48943:69;49029:1;49022:8;;;;48759:279;;;;:::o;50070:204::-;50154:7;50174:21;50198:8;:26;50207:16;50217:5;50207:9;:16::i;:::-;50198:26;;;;;;;;;;;:39;50225:11;50198:39;;;;;;;;;;;;;;;50174:63;;50255:4;:11;;;50248:18;;;50070:204;;;;:::o;32924:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34703:284::-;34798:17;:15;:17::i;:::-;34826:21;34850:18;34862:5;34850:11;:18::i;:::-;34826:42;;34883:11;34879:61;;;34911:17;:15;:17::i;:::-;34879:61;34972:7;34950:4;:19;;:29;;;;34703:284;;;;:::o;49841:185::-;49916:7;49937:14;49956:38;49964:16;49974:5;49964:9;:16::i;:::-;49982:11;49956:7;:38::i;:::-;49936:58;;;50012:6;50005:13;;;49841:185;;;;:::o;32995:45::-;;;;;;;;;;;;;;;;;:::o;33436:137::-;33507:17;:15;:17::i;:::-;33551:14;33535:13;;:30;;;;;;;;;;;;;;;;;;33436:137;:::o;33186:28::-;;;;;;;;;;;;;:::o;50309:152::-;50378:9;50390:16;50400:5;50390:9;:16::i;:::-;50378:28;;50424:29;50439:4;50445:7;50424:14;:29::i;:::-;50417:36;50309:152;;:::o;38286:290::-;38338:21;38362:8;38371:4;38362:14;;;;;;;;;;;;;;;;;;38338:38;;38407:4;:20;;;38391:12;:36;38387:75;;38444:7;;;38387:75;38472:20;38487:4;38472:14;:20::i;:::-;38503:19;38517:4;38503:13;:19::i;:::-;38556:12;38533:4;:20;;:35;;;;38286:290;;;:::o;46563:1199::-;26026:5;26016:15;;:6;;;;;;;;;;;:15;;;26008:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;46631:21:::1;46655:8;46664:4;46655:14;;;;;;;;;;;;;;;;;;46631:38;;46680:21;46704:8;:14;46713:4;46704:14;;;;;;;;;;;:26;46719:10;46704:26;;;;;;;;;;;;;;;46680:50;;46741:14;46758:4;:11;;;46741:28;;46780:22;46805:6;46780:31;;46852:1;46827:27;;:13;;;;;;;;;;;:27;;;46824:148;;46902:13;;;;;;;;;;;46887:47;;;46935:4;46941:6;46949:10;46887:73;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46870:90;;46824:148;46984:19;47006:4;:10;;;;;;;;;;;;:20;;;47035:4;47006:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46984:57;;47069:6;47055:11;:20;47052:382;;;47171:10;;;;;;;;;;;47159:34;;;47202:4;:10;;;;;;;;;;;;47215:23;47226:11;47215:6;:10;;:23;;;;:::i;:::-;47159:80;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47270:4;:10;;;;;;;;;;;;:20;;;47299:4;47270:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47256:49;;47391:6;47376:11;:21;;47368:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;47052:382;47460:1;47446:4;:11;;:15;;;;47487:1;47472:4;:12;;:16;;;;47514:1;47499:4;:12;;:16;;;;47543:1;47526:4;:14;;:18;;;;47572:1;47555:4;:14;;:18;;;;47586:51;47610:10;47622:14;47586:4;:10;;;;;;;;;;;;:23;;;;:51;;;;;:::i;:::-;47667:28;47688:6;47667:4;:16;;;:20;;:28;;;;:::i;:::-;47648:4;:16;;:47;;;;47741:4;47729:10;47711:43;;;47747:6;47711:43;;;;;;:::i;:::-;;;;;;;;26072:1;;;;;46563:1199:::0;:::o;25806:25::-;;;;;;;;;;;;;:::o;35863:321::-;35956:17;:15;:17::i;:::-;35988:9;35984:193;36008:8;:15;;;;36001:4;:22;35984:193;;;36047:21;36071:8;36080:4;36071:14;;;;;;;;;;;;;;;;;;36047:38;;36100:65;36122:4;:10;;;;;;;;;;;;36135:5;36142:10;36154;36100:13;:65::i;:::-;35984:193;36025:6;;;;;;;35984:193;;;;35863:321;;;:::o;25870:26::-;;;;;;;;;;;;;:::o;36747:777::-;36890:1;36863:29;;36871:6;36863:29;;;;36855:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36933:17;:15;:17::i;:::-;36967:11;36963:61;;;36995:17;:15;:17::i;:::-;36963:61;37044:8;37058:400;;;;;;;;37090:6;37058:400;;;;;;37130:12;37058:400;;;;37174:1;37058:400;;;;37204:1;37058:400;;;;37234:1;37058:400;;;;37269:1;37058:400;;;;37302:1;37058:400;;;;37332:1;37058:400;;;;37398:1;37058:400;;;;37365:1;37058:400;;;;37431:15;37058:400;;;37044:415;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37515:1;37500:12;:10;:12::i;:::-;:16;37470:10;:27;37489:6;37470:27;;;;;;;;;;;;;;;:46;;;;36747:777;;;;;:::o;37568:180::-;37613:14;37630:8;:15;;;;37613:32;;37661:11;37656:85;37684:6;37678:3;:12;37656:85;;;37714:15;37725:3;37714:10;:15::i;:::-;37692:5;;;;;37656:85;;;;37568:180;:::o;49170:290::-;49224:7;49244:21;49268:18;49280:5;49268:11;:18::i;:::-;49244:42;;49380:72;49428:23;49449:1;49428:4;:16;;;:20;;:23;;;;:::i;:::-;49380:43;49415:7;49380:30;49404:5;49380:4;:19;;;:23;;:30;;;;:::i;:::-;:34;;:43;;;;:::i;:::-;:47;;:72;;;;:::i;:::-;49373:79;;;49170:290;;;:::o;26234:218::-;26314:1;26292:24;;:10;;;;;;;;;;;:24;;;;:52;;;;;26342:1;26320:24;;:10;;;;;;;;;;;:24;;;;26292:52;26284:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;26392:10;;;;;;;;;;;26378:24;;:10;:24;;;:52;;;;26420:10;;;;;;;;;;;26406:24;;:10;:24;;;26378:52;26369:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;26234:218::o;2859:148::-;2439:12;:10;:12::i;:::-;2428:23;;:7;:5;:7::i;:::-;:23;;;2420:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2966:1:::1;2929:40;;2950:6;::::0;::::1;;;;;;;;2929:40;;;;;;;;;;;;2997:1;2980:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;2859:148::o:0;48372:167::-;48435:7;48455:21;48479:18;48491:5;48479:11;:18::i;:::-;48455:42;;48515:4;:16;;;48508:23;;;48372:167;;;:::o;34139:198::-;34218:17;:15;:17::i;:::-;34246:21;34270:18;34282:5;34270:11;:18::i;:::-;34246:42;;34323:6;34299:4;:21;;:30;;;;34139:198;;;:::o;2208:87::-;2254:7;2281:6;;;;;;;;;;;2274:13;;2208:87;:::o;26698:201::-;26791:1;26768:25;;:11;:25;;;;26760:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26839:17;:15;:17::i;:::-;26880:11;26867:10;;:24;;;;;;;;;;;;;;;;;;26698:201;:::o;33083:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33971:160::-;34027:7;34036;34064:8;34073:3;34064:13;;;;;;;;;;;;;;;;;;:28;;;34094:8;34103:3;34094:13;;;;;;;;;;;;;;;;;;:28;;;34056:67;;;;33971:160;;;:::o;40534:498::-;40604:7;40624:21;40648:8;:14;40657:4;40648:14;;;;;;;;;;;:21;40663:5;40648:21;;;;;;;;;;;;;;;40624:45;;40680:21;40704:8;40713:4;40704:14;;;;;;;;;;;;;;;;;;40680:38;;40748:1;40733:4;:11;;;:16;:41;;;;40773:1;40753:4;:16;;;:21;40733:41;40729:83;;;40799:1;40792:8;;;;;;40729:83;40849:19;40871:63;40895:38;40912:4;:20;;;40895:12;:16;;:38;;;;:::i;:::-;40871:4;:19;;;:23;;:63;;;;:::i;:::-;40849:85;;40952:72;40968:4;40974;40980:43;41006:4;:16;;;40980:21;40996:4;40980:11;:15;;:21;;;;:::i;:::-;:25;;:43;;;;:::i;:::-;40952:15;:72::i;:::-;40945:79;;;;;40534:498;;;;;:::o;35034:782::-;35139:17;:15;:17::i;:::-;35167:9;35179:16;35189:5;35179:9;:16::i;:::-;35167:28;;35216:16;35227:4;35216:10;:16::i;:::-;35243:21;35267:8;:14;35276:4;35267:14;;;;;;;;;;;:21;35282:5;35267:21;;;;;;;;;;;;;;;35243:45;;35304:10;35301:248;;;35381:1;35364:4;:14;;:18;;;;35301:248;;;35448:21;35472:8;35481:4;35472:14;;;;;;;;;;;;;;;;;;35448:38;;35518:4;:19;;;35501:4;:14;;:36;;;;35301:248;;35564:10;35561:248;;;35641:1;35624:4;:14;;:18;;;;35561:248;;;35708:21;35732:8;35741:4;35732:14;;;;;;;;;;;;;;;;;;35708:38;;35778:4;:19;;;35761:4;:14;;:36;;;;35561:248;;35034:782;;;;;;:::o;49510:293::-;49567:7;49587:21;49611:18;49623:5;49611:11;:18::i;:::-;49587:42;;49723:72;49771:23;49792:1;49771:4;:16;;;:20;;:23;;;;:::i;:::-;49723:43;49758:7;49723:30;49747:5;49723:4;:19;;;:23;;:30;;;;:::i;:::-;:34;;:43;;;;:::i;:::-;:47;;:72;;;;:::i;:::-;49716:79;;;49510:293;;;:::o;50493:166::-;50548:9;50560:16;50570:5;50560:9;:16::i;:::-;50548:28;;50594:57;50609:4;50622:5;50615:23;;;50639:10;50615:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50594:14;:57::i;:::-;50587:64;50493:166;:::o;26493:197::-;26577:11;26563:25;;26571:1;26563:25;;;;26555:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;26630:17;:15;:17::i;:::-;26671:11;26658:10;;:24;;;;;;;;;;;;;;;;;;26493:197;:::o;34378:284::-;34473:17;:15;:17::i;:::-;34501:21;34525:18;34537:5;34525:11;:18::i;:::-;34501:42;;34558:11;34554:61;;;34586:17;:15;:17::i;:::-;34554:61;34647:7;34625:4;:19;;:29;;;;34378:284;;;;:::o;26089:137::-;26169:7;:5;:7::i;:::-;26155:21;;:10;:21;;;:49;;;;26194:10;;;;;;;;;;;26180:24;;:10;:24;;;26155:49;26147:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;26089:137::o;38240:37::-;;;;:::o;36192:212::-;36278:17;:15;:17::i;:::-;36306:21;36330:18;36342:5;36330:11;:18::i;:::-;36306:42;;36381:15;36359:4;:19;;:37;;;;36192:212;;;:::o;33838:124::-;33911:7;33895:5;32791:1;32774:19;;:5;:19;;;;:74;;;;;32843:5;32797:51;;32805:8;32814:10;:17;32825:5;32814:17;;;;;;;;;;;;;;;;32805:27;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;32797:51;;;32774:74;32766:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33937:10:::1;:17;33948:5;33937:17;;;;;;;;;;;;;;;;33930:24;;33838:124:::0;;;;:::o;42513:1932::-;26026:5;26016:15;;:6;;;;;;;;;;;:15;;;26008:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;42614:1:::1;42603:7;:12;;42595:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;42648:21;42672:8;42681:4;42672:14;;;;;;;;;;;;;;;;;;42648:38;;42697:21;42721:8;:14;42730:4;42721:14;;;;;;;;;;;:26;42736:10;42721:26;;;;;;;;;;;;;;;42697:50;;42787:1;42763:4;:21;;;:25;42760:180;;;42873:29;42894:7;42873:4;:16;;;:20;;:29;;;;:::i;:::-;42847:4;:21;;;:56;;42839:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;42760:180;42952:16;42963:4;42952:10;:16::i;:::-;43007:1;42982:27;;:13;;;;;;;;;;;:27;;;42979:122;;43040:13;;;;;;;;;;;43025:37;;;43063:4;43069:7;43078:10;43025:64;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42979:122;43174:1;43160:4;:11;;;:15;43156:464;;;43245:21;43269:33;43282:4;43288;43299:1;43269:12;:33::i;:::-;43245:57;;43317:24;43344:36;43360:4;43366;43377:1;43344:15;:36::i;:::-;43317:63;;43547:13;43530:4;:14;;:30;;;;43592:16;43575:4;:14;;:33;;;;43156:464;;;43682:1;43672:7;:11;43668:474;;;43700:19;43722:4;:10;;;;;;;;;;;;:20;;;43751:4;43722:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43700:57;;43772:63;43800:10;43820:4;43827:7;43772:4;:10;;;;;;;;;;;;:27;;;;:63;;;;;;:::i;:::-;43850:18;43871:4;:10;;;;;;;;;;;;:20;;;43900:4;43871:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43850:56;;43931:27;43946:11;43931:10;:14;;:27;;;;:::i;:::-;43921:37;;43988:1;43978:7;:11;43975:156;;;44024:24;44040:7;44024:4;:11;;;:15;;:24;;;;:::i;:::-;44010:4;:11;;:38;;;;44086:29;44107:7;44086:4;:16;;;:20;;:29;;;;:::i;:::-;44067:4;:16;;:48;;;;43975:156;43668:474;;;44185:25;44198:4;:10;;;;;;;;;;;;44185:4;:25::i;:::-;44269:46;44310:4;44269:36;44285:4;:19;;;44269:4;:11;;;:15;;:36;;;;:::i;:::-;:40;;:46;;;;:::i;:::-;44254:4;:12;;:61;;;;44341:46;44382:4;44341:36;44357:4;:19;;;44341:4;:11;;;:15;;:36;;;;:::i;:::-;:40;;:46;;;;:::i;:::-;44326:4;:12;;:61;;;;44423:4;44411:10;44403:34;;;44429:7;44403:34;;;;;;:::i;:::-;;;;;;;;26072:1;;42513:1932:::0;;:::o;38097:34::-;;;;:::o;26907:145::-;26968:7;:5;:7::i;:::-;26954:21;;:10;:21;;;:49;;;;26993:10;;;;;;;;;;;26979:24;;:10;:24;;;26954:49;26946:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;27038:6;;;;;;;;;;;27037:7;27028:6;;:16;;;;;;;;;;;;;;;;;;26907:145::o;38030:30::-;;;;:::o;39915:556::-;39982:7;39991;40011:21;40035:8;:14;40044:4;40035:14;;;;;;;;;;;:21;40050:5;40035:21;;;;;;;;;;;;;;;40011:45;;40067:21;40091:8;40100:4;40091:14;;;;;;;;;;;;;;;;;;40067:38;;40135:1;40120:4;:11;;;:16;:41;;;;40160:1;40140:4;:16;;;:21;40120:41;40116:88;;;40187:1;40190;40179:13;;;;;;;;40116:88;40242:19;40264:63;40288:38;40305:4;:20;;;40288:12;:16;;:38;;;;:::i;:::-;40264:4;:19;;;:23;;:63;;;;:::i;:::-;40242:85;;40338:14;40355:69;40368:4;40374;40380:43;40406:4;:16;;;40380:21;40396:4;40380:11;:15;;:21;;;;:::i;:::-;:25;;:43;;;;:::i;:::-;40355:12;:69::i;:::-;40338:86;;40443:6;40451:4;:11;;;40435:28;;;;;;;;39915:556;;;;;;:::o;44523:1990::-;26026:5;26016:15;;:6;;;;;;;;;;;:15;;;26008:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;44625:1:::1;44614:7;:12;;44606:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;44660:21;44684:8;44693:4;44684:14;;;;;;;;;;;;;;;;;;44660:38;;44709:21;44733:8;:14;44742:4;44733:14;;;;;;;;;;;:26;44748:10;44733:26;;;;;;;;;;;;;;;44709:50;;44793:7;44778:4;:11;;;:22;;44770:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;44846:16;44857:4;44846:10;:16::i;:::-;44875:22;44900:7;44875:32;;44946:1;44921:27;;:13;;;;;;;;;;;:27;;;44918:140;;44996:13;;;;;;;;;;;44981:38;;;45020:4;45026:7;45035:10;44981:65;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44964:82;;44918:140;45087:1;45073:4;:11;;;:15;45070:396;;;45157:21;45181:33;45194:4;45200;45211:1;45181:12;:33::i;:::-;45157:57;;45229:24;45256:36;45272:4;45278;45289:1;45256:15;:36::i;:::-;45229:63;;45324:1;45307:4;:14;;:18;;;;45357:1;45340:4;:14;;:18;;;;45373:81;45397:4;:10;;;;;;;;;;;;45410;45422:13;45437:16;45373:15;:81::i;:::-;45070:396;;;45517:1;45507:7;:11;45503:706;;;45535:19;45557:4;:10;;;;;;;;;;;;:20;;;45586:4;45557:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45535:57;;45624:7;45610:11;:21;45607:407;;;45736:10;;;;;;;;;;;45724:34;;;45767:4;:10;;;;;;;;;;;;45780:24;45792:11;45780:7;:11;;:24;;;;:::i;:::-;45724:81;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;45838:4;:10;;;;;;;;;;;;:20;;;45867:4;45838:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45824:49;;45966:7;45951:11;:22;;45943:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;45607:407;46044:24;46060:7;46044:4;:11;;;:15;;:24;;;;:::i;:::-;46030:4;:11;;:38;;;;46102:29;46123:7;46102:4;:16;;;:20;;:29;;;;:::i;:::-;46083:4;:16;;:48;;;;46146:51;46170:10;46182:14;46146:4;:10;;;;;;;;;;;;:23;;;;:51;;;;;:::i;:::-;45503:706;;46252:25;46265:4;:10;;;;;;;;;;;;46252:4;:25::i;:::-;46336:46;46377:4;46336:36;46352:4;:19;;;46336:4;:11;;;:15;;:36;;;;:::i;:::-;:40;;:46;;;;:::i;:::-;46321:4;:12;;:61;;;;46408:46;46449:4;46408:36;46424:4;:19;;;46408:4;:11;;;:15;;:36;;;;:::i;:::-;:40;;:46;;;;:::i;:::-;46393:4;:12;;:61;;;;46491:4;46479:10;46470:35;;;46497:7;46470:35;;;;;;:::i;:::-;;;;;;;;26072:1;;;44523:1990:::0;;:::o;3162:244::-;2439:12;:10;:12::i;:::-;2428:23;;:7;:5;:7::i;:::-;:23;;;2420:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3271:1:::1;3251:22;;:8;:22;;;;3243:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3361:8;3332:38;;3353:6;::::0;::::1;;;;;;;;3332:38;;;;;;;;;;;;3390:8;3381:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;3162:244:::0;:::o;50694:154::-;50764:9;50776:16;50786:5;50776:9;:16::i;:::-;50764:28;;50810:30;50826:4;50832:7;50810:15;:30::i;:::-;50803:37;50694:154;;:::o;27089:245::-;27207:7;27193:21;;27201:1;27193:21;;;;27185:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27253:17;:15;:17::i;:::-;27281:45;27309:7;27318;27288:6;27281:27;;;;:45;;;;;:::i;:::-;27089:245;;;:::o;25753:25::-;;;;;;;;;;;;;:::o;50883:205::-;50939:9;50951:16;50961:5;50951:9;:16::i;:::-;50939:28;;50978:21;51002:8;:14;51011:4;51002:14;;;;;;;;;;;:26;51017:10;51002:26;;;;;;;;;;;;;;;50978:50;;51046:34;51062:4;51068;:11;;;51046:15;:34::i;:::-;51039:41;;50883:205;:::o;48593:118::-;48640:17;48651:5;48640:10;:17::i;:::-;48680:10;;;;;;;;;;;48668:28;;;48697:5;48668:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48593:118;:::o;23068:622::-;23447:1;23438:5;:10;23437:62;;;;23497:1;23454:5;:15;;;23478:4;23485:7;23454:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;23437:62;23429:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;23592:90;23612:5;23642:22;;;23666:7;23675:5;23619:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23592:19;:90::i;:::-;23068:622;;;:::o;33683:147::-;33759:16;33744:5;32791:1;32774:19;;:5;:19;;;;:74;;;;;32843:5;32797:51;;32805:8;32814:10;:17;32825:5;32814:17;;;;;;;;;;;;;;;;32805:27;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;32797:51;;;32774:74;32766:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33795:8:::1;33804:10;:17;33815:5;33804:17;;;;;;;;;;;;;;;;33795:27;;;;;;;;;;;;;;;;;;33788:34;;33683:147:::0;;;;:::o;38620:601::-;38713:1;38690:4;:19;;;:24;;:49;;;;38738:1;38718:4;:16;;;:21;38690:49;38687:86;;;38755:7;;38687:86;38785:19;38807:63;38831:38;38848:4;:20;;;38831:12;:16;;:38;;;;:::i;:::-;38807:4;:19;;;:23;;:63;;;;:::i;:::-;38785:85;;38939:32;38959:11;38939:15;;:19;;:32;;;;:::i;:::-;38921:15;:50;;;;39038:33;39059:11;39038:4;:16;;;:20;;:33;;;;:::i;:::-;39019:4;:16;;:52;;;;39145:68;39193:4;:19;;;39145:43;39171:4;:16;;;39145:21;39161:4;39145:11;:15;;:21;;;;:::i;:::-;:25;;:43;;;;:::i;:::-;:47;;:68;;;;:::i;:::-;39123:4;:19;;:90;;;;38620:601;;;:::o;39246:606::-;39338:1;39315:4;:19;;;:24;;:49;;;;39363:1;39343:4;:16;;;:21;39315:49;39312:86;;;39380:7;;39312:86;39410:19;39432:63;39456:38;39473:4;:20;;;39456:12;:16;;:38;;;;:::i;:::-;39432:4;:19;;;:23;;:63;;;;:::i;:::-;39410:85;;39567:35;39590:11;39567:18;;:22;;:35;;;;:::i;:::-;39546:18;:56;;;;39669:33;39690:11;39669:4;:16;;;:20;;:33;;;;:::i;:::-;39650:4;:16;;:52;;;;39776:68;39824:4;:19;;;39776:43;39802:4;:16;;;39776:21;39792:4;39776:11;:15;;:21;;;;:::i;:::-;:25;;:43;;;;:::i;:::-;:47;;:68;;;;:::i;:::-;39754:4;:19;;:90;;;;39246:606;;;:::o;9495:158::-;9553:7;9586:1;9581;:6;;9573:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;9644:1;9640;:5;9633:12;;9495:158;;;;:::o;22409:177::-;22492:86;22512:5;22542:23;;;22567:2;22571:5;22519:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22492:19;:86::i;:::-;22409:177;;;:::o;9033:179::-;9091:7;9111:9;9127:1;9123;:5;9111:17;;9152:1;9147;:6;;9139:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;9203:1;9196:8;;;9033:179;;;;:::o;9912:220::-;9970:7;9999:1;9994;:6;9990:20;;;10009:1;10002:8;;;;9990:20;10021:9;10037:1;10033;:5;10021:17;;10066:1;10061;10057;:5;;;;;;:10;10049:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;10123:1;10116:8;;;9912:220;;;;;:::o;10610:153::-;10668:7;10700:1;10696;:5;10688:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;10754:1;10750;:5;;;;;;10743:12;;10610:153;;;;:::o;737:106::-;790:15;825:10;818:17;;737:106;:::o;41073:646::-;41185:4;41202:22;41255:1;41238:4;:14;;;:18;41235:201;;;41326:4;:14;;;41309:31;;41235:201;;;41388:36;41412:11;41388:4;:19;;;:23;;:36;;;;:::i;:::-;41371:53;;41235:201;41448:21;41484:17;41505:41;41541:4;41505:31;41521:14;41505:4;:11;;;:15;;:31;;;;:::i;:::-;:35;;:41;;;;:::i;:::-;41484:62;;41572:4;:12;;;41560:9;:24;41557:101;;;41619:27;41633:4;:12;;;41619:9;:13;;:27;;;;:::i;:::-;41600:46;;41557:101;41675:36;41696:4;:14;;;41675:16;:20;;:36;;;;:::i;:::-;41668:43;;;;;41073:646;;;;;:::o;41760:680::-;41869:4;41886:22;41939:1;41922:4;:14;;;:18;41919:247;;;42011:4;:14;;;41994:31;;41919:247;;;42118:36;42142:11;42118:4;:19;;;:23;;:36;;;;:::i;:::-;42101:53;;41919:247;42178:18;42211:17;42232:41;42268:4;42232:31;42248:14;42232:4;:11;;;:15;;:31;;;;:::i;:::-;:35;;:41;;;;:::i;:::-;42211:62;;42299:4;:12;;;42287:9;:24;42284:98;;;42343:27;42357:4;:12;;;42343:9;:13;;:27;;;;:::i;:::-;42327:43;;42284:98;42399:33;42417:4;:14;;;42399:13;:17;;:33;;;;:::i;:::-;42392:40;;;;;41760:680;;;;;:::o;22594:205::-;22695:96;22715:5;22745:27;;;22774:4;22780:2;22784:5;22722:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22695:19;:96::i;:::-;22594:205;;;;:::o;47815:486::-;47971:1;47950:18;:22;:51;;;;48000:1;47976:21;:25;47950:51;47947:347;;;48040:43;48064:18;48040:19;;:23;;:43;;;;:::i;:::-;48018:19;:65;;;;48123:49;48150:21;48123:22;;:26;;:49;;;;:::i;:::-;48098:22;:74;;;;48199:10;;;;;;;;;;;48187:39;;;48227:6;48235:3;48240:18;48260:21;48187:95;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47947:347;47815:486;;;;:::o;24714:761::-;25138:23;25164:69;25192:4;25164:69;;;;;;;;;;;;;;;;;25172:5;25164:27;;;;:69;;;;;:::i;:::-;25138:95;;25268:1;25248:10;:17;:21;25244:224;;;25390:10;25379:30;;;;;;;;;;;;:::i;:::-;25371:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;25244:224;24714:761;;;:::o;17398:195::-;17501:12;17533:52;17555:6;17563:4;17569:1;17572:12;17533:21;:52::i;:::-;17526:59;;17398:195;;;;;:::o;18450:530::-;18577:12;18635:5;18610:21;:30;;18602:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;18702:18;18713:6;18702:10;:18::i;:::-;18694:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;18828:12;18842:23;18869:6;:11;;18889:5;18897:4;18869:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18827:75;;;;18920:52;18938:7;18947:10;18959:12;18920:17;:52::i;:::-;18913:59;;;;18450:530;;;;;;:::o;14480:422::-;14540:4;14748:12;14859:7;14847:20;14839:28;;14893:1;14886:4;:8;14879:15;;;14480:422;;;:::o;20990:742::-;21105:12;21134:7;21130:595;;;21165:10;21158:17;;;;21130:595;21299:1;21279:10;:17;:21;21275:439;;;21542:10;21536:17;21603:15;21590:10;21586:2;21582:19;21575:44;21490:148;21685:12;21678:20;;;;;;;;;;;:::i;:::-;;;;;;;;20990:742;;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;:::i;:::-;57:78;;;;:::o;142:124::-;;219:6;206:20;197:29;;231:30;255:5;231:30;:::i;:::-;191:75;;;;:::o;273:128::-;;354:6;348:13;339:22;;366:30;390:5;366:30;:::i;:::-;333:68;;;;:::o;408:158::-;;502:6;489:20;480:29;;514:47;555:5;514:47;:::i;:::-;474:92;;;;:::o;573:130::-;;653:6;640:20;631:29;;665:33;692:5;665:33;:::i;:::-;625:78;;;;:::o;710:134::-;;794:6;788:13;779:22;;806:33;833:5;806:33;:::i;:::-;773:71;;;;:::o;851:241::-;;955:2;943:9;934:7;930:23;926:32;923:2;;;971:1;968;961:12;923:2;1006:1;1023:53;1068:7;1059:6;1048:9;1044:22;1023:53;:::i;:::-;1013:63;;985:97;917:175;;;;:::o;1099:366::-;;;1220:2;1208:9;1199:7;1195:23;1191:32;1188:2;;;1236:1;1233;1226:12;1188:2;1271:1;1288:53;1333:7;1324:6;1313:9;1309:22;1288:53;:::i;:::-;1278:63;;1250:97;1378:2;1396:53;1441:7;1432:6;1421:9;1417:22;1396:53;:::i;:::-;1386:63;;1357:98;1182:283;;;;;:::o;1472:605::-;;;;;1621:3;1609:9;1600:7;1596:23;1592:33;1589:2;;;1638:1;1635;1628:12;1589:2;1673:1;1690:53;1735:7;1726:6;1715:9;1711:22;1690:53;:::i;:::-;1680:63;;1652:97;1780:2;1798:53;1843:7;1834:6;1823:9;1819:22;1798:53;:::i;:::-;1788:63;;1759:98;1888:2;1906:50;1948:7;1939:6;1928:9;1924:22;1906:50;:::i;:::-;1896:60;;1867:95;1993:2;2011:50;2053:7;2044:6;2033:9;2029:22;2011:50;:::i;:::-;2001:60;;1972:95;1583:494;;;;;;;:::o;2084:491::-;;;;2222:2;2210:9;2201:7;2197:23;2193:32;2190:2;;;2238:1;2235;2228:12;2190:2;2273:1;2290:53;2335:7;2326:6;2315:9;2311:22;2290:53;:::i;:::-;2280:63;;2252:97;2380:2;2398:53;2443:7;2434:6;2423:9;2419:22;2398:53;:::i;:::-;2388:63;;2359:98;2488:2;2506:53;2551:7;2542:6;2531:9;2527:22;2506:53;:::i;:::-;2496:63;;2467:98;2184:391;;;;;:::o;2582:479::-;;;;2714:2;2702:9;2693:7;2689:23;2685:32;2682:2;;;2730:1;2727;2720:12;2682:2;2765:1;2782:53;2827:7;2818:6;2807:9;2803:22;2782:53;:::i;:::-;2772:63;;2744:97;2872:2;2890:50;2932:7;2923:6;2912:9;2908:22;2890:50;:::i;:::-;2880:60;;2851:95;2977:2;2995:50;3037:7;3028:6;3017:9;3013:22;2995:50;:::i;:::-;2985:60;;2956:95;2676:385;;;;;:::o;3068:366::-;;;3189:2;3177:9;3168:7;3164:23;3160:32;3157:2;;;3205:1;3202;3195:12;3157:2;3240:1;3257:53;3302:7;3293:6;3282:9;3278:22;3257:53;:::i;:::-;3247:63;;3219:97;3347:2;3365:53;3410:7;3401:6;3390:9;3386:22;3365:53;:::i;:::-;3355:63;;3326:98;3151:283;;;;;:::o;3441:485::-;;;;3576:2;3564:9;3555:7;3551:23;3547:32;3544:2;;;3592:1;3589;3582:12;3544:2;3627:1;3644:53;3689:7;3680:6;3669:9;3665:22;3644:53;:::i;:::-;3634:63;;3606:97;3734:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3713:98;3842:2;3860:50;3902:7;3893:6;3882:9;3878:22;3860:50;:::i;:::-;3850:60;;3821:95;3538:388;;;;;:::o;3933:257::-;;4045:2;4033:9;4024:7;4020:23;4016:32;4013:2;;;4061:1;4058;4051:12;4013:2;4096:1;4113:61;4166:7;4157:6;4146:9;4142:22;4113:61;:::i;:::-;4103:71;;4075:105;4007:183;;;;:::o;4197:765::-;;;;;;4380:3;4368:9;4359:7;4355:23;4351:33;4348:2;;;4397:1;4394;4387:12;4348:2;4432:1;4449:67;4508:7;4499:6;4488:9;4484:22;4449:67;:::i;:::-;4439:77;;4411:111;4553:2;4571:53;4616:7;4607:6;4596:9;4592:22;4571:53;:::i;:::-;4561:63;;4532:98;4661:2;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4640:98;4769:2;4787:53;4832:7;4823:6;4812:9;4808:22;4787:53;:::i;:::-;4777:63;;4748:98;4877:3;4896:50;4938:7;4929:6;4918:9;4914:22;4896:50;:::i;:::-;4886:60;;4856:96;4342:620;;;;;;;;:::o;4969:241::-;;5073:2;5061:9;5052:7;5048:23;5044:32;5041:2;;;5089:1;5086;5079:12;5041:2;5124:1;5141:53;5186:7;5177:6;5166:9;5162:22;5141:53;:::i;:::-;5131:63;;5103:97;5035:175;;;;:::o;5217:263::-;;5332:2;5320:9;5311:7;5307:23;5303:32;5300:2;;;5348:1;5345;5338:12;5300:2;5383:1;5400:64;5456:7;5447:6;5436:9;5432:22;5400:64;:::i;:::-;5390:74;;5362:108;5294:186;;;;:::o;5487:366::-;;;5608:2;5596:9;5587:7;5583:23;5579:32;5576:2;;;5624:1;5621;5614:12;5576:2;5659:1;5676:53;5721:7;5712:6;5701:9;5697:22;5676:53;:::i;:::-;5666:63;;5638:97;5766:2;5784:53;5829:7;5820:6;5809:9;5805:22;5784:53;:::i;:::-;5774:63;;5745:98;5570:283;;;;;:::o;5860:366::-;;;5981:2;5969:9;5960:7;5956:23;5952:32;5949:2;;;5997:1;5994;5987:12;5949:2;6032:1;6049:53;6094:7;6085:6;6074:9;6070:22;6049:53;:::i;:::-;6039:63;;6011:97;6139:2;6157:53;6202:7;6193:6;6182:9;6178:22;6157:53;:::i;:::-;6147:63;;6118:98;5943:283;;;;;:::o;6233:142::-;6324:45;6363:5;6324:45;:::i;:::-;6319:3;6312:58;6306:69;;:::o;6382:113::-;6465:24;6483:5;6465:24;:::i;:::-;6460:3;6453:37;6447:48;;:::o;6502:104::-;6579:21;6594:5;6579:21;:::i;:::-;6574:3;6567:34;6561:45;;:::o;6613:356::-;;6741:38;6773:5;6741:38;:::i;:::-;6791:88;6872:6;6867:3;6791:88;:::i;:::-;6784:95;;6884:52;6929:6;6924:3;6917:4;6910:5;6906:16;6884:52;:::i;:::-;6957:6;6952:3;6948:16;6941:23;;6721:248;;;;;:::o;6976:154::-;7073:51;7118:5;7073:51;:::i;:::-;7068:3;7061:64;7055:75;;:::o;7137:347::-;;7249:39;7282:5;7249:39;:::i;:::-;7300:71;7364:6;7359:3;7300:71;:::i;:::-;7293:78;;7376:52;7421:6;7416:3;7409:4;7402:5;7398:16;7376:52;:::i;:::-;7449:29;7471:6;7449:29;:::i;:::-;7444:3;7440:39;7433:46;;7229:255;;;;;:::o;7492:317::-;;7652:67;7716:2;7711:3;7652:67;:::i;:::-;7645:74;;7752:19;7748:1;7743:3;7739:11;7732:40;7800:2;7795:3;7791:12;7784:19;;7638:171;;;:::o;7818:325::-;;7978:67;8042:2;8037:3;7978:67;:::i;:::-;7971:74;;8078:27;8074:1;8069:3;8065:11;8058:48;8134:2;8129:3;8125:12;8118:19;;7964:179;;;:::o;8152:330::-;;8312:67;8376:2;8371:3;8312:67;:::i;:::-;8305:74;;8412:32;8408:1;8403:3;8399:11;8392:53;8473:2;8468:3;8464:12;8457:19;;8298:184;;;:::o;8491:375::-;;8651:67;8715:2;8710:3;8651:67;:::i;:::-;8644:74;;8751:34;8747:1;8742:3;8738:11;8731:55;8820:8;8815:2;8810:3;8806:12;8799:30;8857:2;8852:3;8848:12;8841:19;;8637:229;;;:::o;8875:323::-;;9035:67;9099:2;9094:3;9035:67;:::i;:::-;9028:74;;9135:25;9131:1;9126:3;9122:11;9115:46;9189:2;9184:3;9180:12;9173:19;;9021:177;;;:::o;9207:327::-;;9367:67;9431:2;9426:3;9367:67;:::i;:::-;9360:74;;9467:29;9463:1;9458:3;9454:11;9447:50;9525:2;9520:3;9516:12;9509:19;;9353:181;;;:::o;9543:326::-;;9703:67;9767:2;9762:3;9703:67;:::i;:::-;9696:74;;9803:28;9799:1;9794:3;9790:11;9783:49;9860:2;9855:3;9851:12;9844:19;;9689:180;;;:::o;9878:330::-;;10038:67;10102:2;10097:3;10038:67;:::i;:::-;10031:74;;10138:32;10134:1;10129:3;10125:11;10118:53;10199:2;10194:3;10190:12;10183:19;;10024:184;;;:::o;10217:375::-;;10377:67;10441:2;10436:3;10377:67;:::i;:::-;10370:74;;10477:34;10473:1;10468:3;10464:11;10457:55;10546:8;10541:2;10536:3;10532:12;10525:30;10583:2;10578:3;10574:12;10567:19;;10363:229;;;:::o;10601:326::-;;10761:67;10825:2;10820:3;10761:67;:::i;:::-;10754:74;;10861:28;10857:1;10852:3;10848:11;10841:49;10918:2;10913:3;10909:12;10902:19;;10747:180;;;:::o;10936:320::-;;11096:67;11160:2;11155:3;11096:67;:::i;:::-;11089:74;;11196:22;11192:1;11187:3;11183:11;11176:43;11247:2;11242:3;11238:12;11231:19;;11082:174;;;:::o;11265:308::-;;11425:66;11489:1;11484:3;11425:66;:::i;:::-;11418:73;;11524:11;11520:1;11515:3;11511:11;11504:32;11564:2;11559:3;11555:12;11548:19;;11411:162;;;:::o;11582:316::-;;11742:67;11806:2;11801:3;11742:67;:::i;:::-;11735:74;;11842:18;11838:1;11833:3;11829:11;11822:39;11889:2;11884:3;11880:12;11873:19;;11728:170;;;:::o;11907:370::-;;12067:67;12131:2;12126:3;12067:67;:::i;:::-;12060:74;;12167:34;12163:1;12158:3;12154:11;12147:55;12236:3;12231:2;12226:3;12222:12;12215:25;12268:2;12263:3;12259:12;12252:19;;12053:224;;;:::o;12286:332::-;;12446:67;12510:2;12505:3;12446:67;:::i;:::-;12439:74;;12546:34;12542:1;12537:3;12533:11;12526:55;12609:2;12604:3;12600:12;12593:19;;12432:186;;;:::o;12627:330::-;;12787:67;12851:2;12846:3;12787:67;:::i;:::-;12780:74;;12887:32;12883:1;12878:3;12874:11;12867:53;12948:2;12943:3;12939:12;12932:19;;12773:184;;;:::o;12966:320::-;;13126:67;13190:2;13185:3;13126:67;:::i;:::-;13119:74;;13226:22;13222:1;13217:3;13213:11;13206:43;13277:2;13272:3;13268:12;13261:19;;13112:174;;;:::o;13295:329::-;;13455:67;13519:2;13514:3;13455:67;:::i;:::-;13448:74;;13555:31;13551:1;13546:3;13542:11;13535:52;13615:2;13610:3;13606:12;13599:19;;13441:183;;;:::o;13633:318::-;;13793:67;13857:2;13852:3;13793:67;:::i;:::-;13786:74;;13893:20;13889:1;13884:3;13880:11;13873:41;13942:2;13937:3;13933:12;13926:19;;13779:172;;;:::o;13960:325::-;;14120:67;14184:2;14179:3;14120:67;:::i;:::-;14113:74;;14220:27;14216:1;14211:3;14207:11;14200:48;14276:2;14271:3;14267:12;14260:19;;14106:179;;;:::o;14294:379::-;;14454:67;14518:2;14513:3;14454:67;:::i;:::-;14447:74;;14554:34;14550:1;14545:3;14541:11;14534:55;14623:12;14618:2;14613:3;14609:12;14602:34;14664:2;14659:3;14655:12;14648:19;;14440:233;;;:::o;14682:391::-;;14842:67;14906:2;14901:3;14842:67;:::i;:::-;14835:74;;14942:34;14938:1;14933:3;14929:11;14922:55;15011:24;15006:2;15001:3;14997:12;14990:46;15064:2;15059:3;15055:12;15048:19;;14828:245;;;:::o;15081:113::-;15164:24;15182:5;15164:24;:::i;:::-;15159:3;15152:37;15146:48;;:::o;15201:271::-;;15354:93;15443:3;15434:6;15354:93;:::i;:::-;15347:100;;15464:3;15457:10;;15335:137;;;;:::o;15479:222::-;;15606:2;15595:9;15591:18;15583:26;;15620:71;15688:1;15677:9;15673:17;15664:6;15620:71;:::i;:::-;15577:124;;;;:::o;15708:238::-;;15843:2;15832:9;15828:18;15820:26;;15857:79;15933:1;15922:9;15918:17;15909:6;15857:79;:::i;:::-;15814:132;;;;:::o;15953:333::-;;16108:2;16097:9;16093:18;16085:26;;16122:71;16190:1;16179:9;16175:17;16166:6;16122:71;:::i;:::-;16204:72;16272:2;16261:9;16257:18;16248:6;16204:72;:::i;:::-;16079:207;;;;;:::o;16293:444::-;;16476:2;16465:9;16461:18;16453:26;;16490:71;16558:1;16547:9;16543:17;16534:6;16490:71;:::i;:::-;16572:72;16640:2;16629:9;16625:18;16616:6;16572:72;:::i;:::-;16655;16723:2;16712:9;16708:18;16699:6;16655:72;:::i;:::-;16447:290;;;;;;:::o;16744:556::-;;16955:3;16944:9;16940:19;16932:27;;16970:71;17038:1;17027:9;17023:17;17014:6;16970:71;:::i;:::-;17052:72;17120:2;17109:9;17105:18;17096:6;17052:72;:::i;:::-;17135;17203:2;17192:9;17188:18;17179:6;17135:72;:::i;:::-;17218;17286:2;17275:9;17271:18;17262:6;17218:72;:::i;:::-;16926:374;;;;;;;:::o;17307:333::-;;17462:2;17451:9;17447:18;17439:26;;17476:71;17544:1;17533:9;17529:17;17520:6;17476:71;:::i;:::-;17558:72;17626:2;17615:9;17611:18;17602:6;17558:72;:::i;:::-;17433:207;;;;;:::o;17647:210::-;;17768:2;17757:9;17753:18;17745:26;;17782:65;17844:1;17833:9;17829:17;17820:6;17782:65;:::i;:::-;17739:118;;;;:::o;17864:1370::-;;18286:3;18275:9;18271:19;18263:27;;18301:85;18383:1;18372:9;18368:17;18359:6;18301:85;:::i;:::-;18397:72;18465:2;18454:9;18450:18;18441:6;18397:72;:::i;:::-;18480;18548:2;18537:9;18533:18;18524:6;18480:72;:::i;:::-;18563;18631:2;18620:9;18616:18;18607:6;18563:72;:::i;:::-;18646:73;18714:3;18703:9;18699:19;18690:6;18646:73;:::i;:::-;18730;18798:3;18787:9;18783:19;18774:6;18730:73;:::i;:::-;18814;18882:3;18871:9;18867:19;18858:6;18814:73;:::i;:::-;18898;18966:3;18955:9;18951:19;18942:6;18898:73;:::i;:::-;18982;19050:3;19039:9;19035:19;19026:6;18982:73;:::i;:::-;19066;19134:3;19123:9;19119:19;19110:6;19066:73;:::i;:::-;19150:74;19219:3;19208:9;19204:19;19194:7;19150:74;:::i;:::-;18257:977;;;;;;;;;;;;;;:::o;19241:310::-;;19388:2;19377:9;19373:18;19365:26;;19438:9;19432:4;19428:20;19424:1;19413:9;19409:17;19402:47;19463:78;19536:4;19527:6;19463:78;:::i;:::-;19455:86;;19359:192;;;;:::o;19558:416::-;;19758:2;19747:9;19743:18;19735:26;;19808:9;19802:4;19798:20;19794:1;19783:9;19779:17;19772:47;19833:131;19959:4;19833:131;:::i;:::-;19825:139;;19729:245;;;:::o;19981:416::-;;20181:2;20170:9;20166:18;20158:26;;20231:9;20225:4;20221:20;20217:1;20206:9;20202:17;20195:47;20256:131;20382:4;20256:131;:::i;:::-;20248:139;;20152:245;;;:::o;20404:416::-;;20604:2;20593:9;20589:18;20581:26;;20654:9;20648:4;20644:20;20640:1;20629:9;20625:17;20618:47;20679:131;20805:4;20679:131;:::i;:::-;20671:139;;20575:245;;;:::o;20827:416::-;;21027:2;21016:9;21012:18;21004:26;;21077:9;21071:4;21067:20;21063:1;21052:9;21048:17;21041:47;21102:131;21228:4;21102:131;:::i;:::-;21094:139;;20998:245;;;:::o;21250:416::-;;21450:2;21439:9;21435:18;21427:26;;21500:9;21494:4;21490:20;21486:1;21475:9;21471:17;21464:47;21525:131;21651:4;21525:131;:::i;:::-;21517:139;;21421:245;;;:::o;21673:416::-;;21873:2;21862:9;21858:18;21850:26;;21923:9;21917:4;21913:20;21909:1;21898:9;21894:17;21887:47;21948:131;22074:4;21948:131;:::i;:::-;21940:139;;21844:245;;;:::o;22096:416::-;;22296:2;22285:9;22281:18;22273:26;;22346:9;22340:4;22336:20;22332:1;22321:9;22317:17;22310:47;22371:131;22497:4;22371:131;:::i;:::-;22363:139;;22267:245;;;:::o;22519:416::-;;22719:2;22708:9;22704:18;22696:26;;22769:9;22763:4;22759:20;22755:1;22744:9;22740:17;22733:47;22794:131;22920:4;22794:131;:::i;:::-;22786:139;;22690:245;;;:::o;22942:416::-;;23142:2;23131:9;23127:18;23119:26;;23192:9;23186:4;23182:20;23178:1;23167:9;23163:17;23156:47;23217:131;23343:4;23217:131;:::i;:::-;23209:139;;23113:245;;;:::o;23365:416::-;;23565:2;23554:9;23550:18;23542:26;;23615:9;23609:4;23605:20;23601:1;23590:9;23586:17;23579:47;23640:131;23766:4;23640:131;:::i;:::-;23632:139;;23536:245;;;:::o;23788:416::-;;23988:2;23977:9;23973:18;23965:26;;24038:9;24032:4;24028:20;24024:1;24013:9;24009:17;24002:47;24063:131;24189:4;24063:131;:::i;:::-;24055:139;;23959:245;;;:::o;24211:416::-;;24411:2;24400:9;24396:18;24388:26;;24461:9;24455:4;24451:20;24447:1;24436:9;24432:17;24425:47;24486:131;24612:4;24486:131;:::i;:::-;24478:139;;24382:245;;;:::o;24634:416::-;;24834:2;24823:9;24819:18;24811:26;;24884:9;24878:4;24874:20;24870:1;24859:9;24855:17;24848:47;24909:131;25035:4;24909:131;:::i;:::-;24901:139;;24805:245;;;:::o;25057:416::-;;25257:2;25246:9;25242:18;25234:26;;25307:9;25301:4;25297:20;25293:1;25282:9;25278:17;25271:47;25332:131;25458:4;25332:131;:::i;:::-;25324:139;;25228:245;;;:::o;25480:416::-;;25680:2;25669:9;25665:18;25657:26;;25730:9;25724:4;25720:20;25716:1;25705:9;25701:17;25694:47;25755:131;25881:4;25755:131;:::i;:::-;25747:139;;25651:245;;;:::o;25903:416::-;;26103:2;26092:9;26088:18;26080:26;;26153:9;26147:4;26143:20;26139:1;26128:9;26124:17;26117:47;26178:131;26304:4;26178:131;:::i;:::-;26170:139;;26074:245;;;:::o;26326:416::-;;26526:2;26515:9;26511:18;26503:26;;26576:9;26570:4;26566:20;26562:1;26551:9;26547:17;26540:47;26601:131;26727:4;26601:131;:::i;:::-;26593:139;;26497:245;;;:::o;26749:416::-;;26949:2;26938:9;26934:18;26926:26;;26999:9;26993:4;26989:20;26985:1;26974:9;26970:17;26963:47;27024:131;27150:4;27024:131;:::i;:::-;27016:139;;26920:245;;;:::o;27172:416::-;;27372:2;27361:9;27357:18;27349:26;;27422:9;27416:4;27412:20;27408:1;27397:9;27393:17;27386:47;27447:131;27573:4;27447:131;:::i;:::-;27439:139;;27343:245;;;:::o;27595:416::-;;27795:2;27784:9;27780:18;27772:26;;27845:9;27839:4;27835:20;27831:1;27820:9;27816:17;27809:47;27870:131;27996:4;27870:131;:::i;:::-;27862:139;;27766:245;;;:::o;28018:416::-;;28218:2;28207:9;28203:18;28195:26;;28268:9;28262:4;28258:20;28254:1;28243:9;28239:17;28232:47;28293:131;28419:4;28293:131;:::i;:::-;28285:139;;28189:245;;;:::o;28441:416::-;;28641:2;28630:9;28626:18;28618:26;;28691:9;28685:4;28681:20;28677:1;28666:9;28662:17;28655:47;28716:131;28842:4;28716:131;:::i;:::-;28708:139;;28612:245;;;:::o;28864:222::-;;28991:2;28980:9;28976:18;28968:26;;29005:71;29073:1;29062:9;29058:17;29049:6;29005:71;:::i;:::-;28962:124;;;;:::o;29093:333::-;;29248:2;29237:9;29233:18;29225:26;;29262:71;29330:1;29319:9;29315:17;29306:6;29262:71;:::i;:::-;29344:72;29412:2;29401:9;29397:18;29388:6;29344:72;:::i;:::-;29219:207;;;;;:::o;29433:460::-;;29624:2;29613:9;29609:18;29601:26;;29638:71;29706:1;29695:9;29691:17;29682:6;29638:71;:::i;:::-;29720:72;29788:2;29777:9;29773:18;29764:6;29720:72;:::i;:::-;29803:80;29879:2;29868:9;29864:18;29855:6;29803:80;:::i;:::-;29595:298;;;;;;:::o;29900:892::-;;30195:3;30184:9;30180:19;30172:27;;30210:71;30278:1;30267:9;30263:17;30254:6;30210:71;:::i;:::-;30292:72;30360:2;30349:9;30345:18;30336:6;30292:72;:::i;:::-;30375;30443:2;30432:9;30428:18;30419:6;30375:72;:::i;:::-;30458;30526:2;30515:9;30511:18;30502:6;30458:72;:::i;:::-;30541:73;30609:3;30598:9;30594:19;30585:6;30541:73;:::i;:::-;30625;30693:3;30682:9;30678:19;30669:6;30625:73;:::i;:::-;30709;30777:3;30766:9;30762:19;30753:6;30709:73;:::i;:::-;30166:626;;;;;;;;;;:::o;30799:121::-;;30892:5;30886:12;30876:22;;30857:63;;;:::o;30927:122::-;;31021:5;31015:12;31005:22;;30986:63;;;:::o;31057:144::-;;31192:3;31177:18;;31170:31;;;;:::o;31210:163::-;;31325:6;31320:3;31313:19;31362:4;31357:3;31353:14;31338:29;;31306:67;;;;:::o;31381:91::-;;31443:24;31461:5;31443:24;:::i;:::-;31432:35;;31426:46;;;:::o;31479:85::-;;31552:5;31545:13;31538:21;31527:32;;31521:43;;;:::o;31571:105::-;;31647:24;31665:5;31647:24;:::i;:::-;31636:35;;31630:46;;;:::o;31683:121::-;;31756:42;31749:5;31745:54;31734:65;;31728:76;;;:::o;31811:72::-;;31873:5;31862:16;;31856:27;;;:::o;31890:129::-;;31977:37;32008:5;31977:37;:::i;:::-;31964:50;;31958:61;;;:::o;32026:149::-;;32119:51;32164:5;32119:51;:::i;:::-;32106:64;;32100:75;;;:::o;32182:122::-;;32275:24;32293:5;32275:24;:::i;:::-;32262:37;;32256:48;;;:::o;32311:121::-;;32390:37;32421:5;32390:37;:::i;:::-;32377:50;;32371:61;;;:::o;32439:108::-;;32518:24;32536:5;32518:24;:::i;:::-;32505:37;;32499:48;;;:::o;32555:268::-;32620:1;32627:101;32641:6;32638:1;32635:13;32627:101;;;32717:1;32712:3;32708:11;32702:18;32698:1;32693:3;32689:11;32682:39;32663:2;32660:1;32656:10;32651:15;;32627:101;;;32743:6;32740:1;32737:13;32734:2;;;32808:1;32799:6;32794:3;32790:16;32783:27;32734:2;32604:219;;;;:::o;32831:97::-;;32919:2;32915:7;32910:2;32903:5;32899:14;32895:28;32885:38;;32879:49;;;:::o;32936:117::-;33005:24;33023:5;33005:24;:::i;:::-;32998:5;32995:35;32985:2;;33044:1;33041;33034:12;32985:2;32979:74;:::o;33060:111::-;33126:21;33141:5;33126:21;:::i;:::-;33119:5;33116:32;33106:2;;33162:1;33159;33152:12;33106:2;33100:71;:::o;33178:145::-;33261:38;33293:5;33261:38;:::i;:::-;33254:5;33251:49;33241:2;;33314:1;33311;33304:12;33241:2;33235:88;:::o;33330:117::-;33399:24;33417:5;33399:24;:::i;:::-;33392:5;33389:35;33379:2;;33438:1;33435;33428:12;33379:2;33373:74;:::o
Swarm Source
ipfs://9194bf3c55a4e30dd28be8c655c4441ba2158f0601b4634f116f816b5198b5b1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
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.