Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 391 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 19456313 | 114 days ago | IN | 0 ETH | 0.00375616 | ||||
Withdraw | 18964614 | 183 days ago | IN | 0 ETH | 0.00276646 | ||||
Withdraw | 18640015 | 229 days ago | IN | 0 ETH | 0.00152862 | ||||
Withdraw | 18601515 | 234 days ago | IN | 0 ETH | 0.00120628 | ||||
Withdraw | 18552416 | 241 days ago | IN | 0 ETH | 0.00259629 | ||||
Deposit | 18519805 | 245 days ago | IN | 0 ETH | 0.00218647 | ||||
Withdraw | 18509256 | 247 days ago | IN | 0 ETH | 0.00211632 | ||||
Withdraw | 18508019 | 247 days ago | IN | 0 ETH | 0.00240991 | ||||
Withdraw | 18474222 | 252 days ago | IN | 0 ETH | 0.00158183 | ||||
Withdraw | 18469458 | 252 days ago | IN | 0 ETH | 0.00122824 | ||||
Withdraw | 18468995 | 253 days ago | IN | 0 ETH | 0.00187072 | ||||
Deposit | 18468518 | 253 days ago | IN | 0 ETH | 0.00114142 | ||||
Deposit | 18456061 | 254 days ago | IN | 0 ETH | 0.00074876 | ||||
Withdraw | 18456059 | 254 days ago | IN | 0 ETH | 0.00203861 | ||||
Withdraw | 18426547 | 258 days ago | IN | 0 ETH | 0.00107109 | ||||
Deposit | 18426544 | 258 days ago | IN | 0 ETH | 0.00127283 | ||||
Withdraw | 18421833 | 259 days ago | IN | 0 ETH | 0.00264397 | ||||
Withdraw | 18418856 | 260 days ago | IN | 0 ETH | 0.00126968 | ||||
Withdraw | 18411828 | 261 days ago | IN | 0 ETH | 0.00083341 | ||||
Withdraw | 18411400 | 261 days ago | IN | 0 ETH | 0.00090062 | ||||
Withdraw | 18403657 | 262 days ago | IN | 0 ETH | 0.00061375 | ||||
Withdraw | 18401065 | 262 days ago | IN | 0 ETH | 0.00023489 | ||||
Withdraw | 18401064 | 262 days ago | IN | 0 ETH | 0.00080062 | ||||
Withdraw | 18387783 | 264 days ago | IN | 0 ETH | 0.00063575 | ||||
Withdraw | 18377816 | 265 days ago | IN | 0 ETH | 0.00143282 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
18126289 | 301 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
SmartChefInitializable
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-09-13 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; pragma abicoder v2; 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @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); } interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } interface IPancakeProfile { function createProfile( uint256 _teamId, address _nftAddress, uint256 _tokenId ) external; function increaseUserPoints( address _userAddress, uint256 _numberPoints, uint256 _campaignId ) external; function removeUserPoints(address _userAddress, uint256 _numberPoints) external; function addNftAddress(address _nftAddress) external; function addTeam(string calldata _teamName, string calldata _teamDescription) external; function getUserProfile(address _userAddress) external view returns ( uint256, uint256, uint256, address, uint256, bool ); function getUserStatus(address _userAddress) external view returns (bool); function getTeamProfile(uint256 _teamId) external view returns ( string memory, string memory, uint256, uint256, bool ); } contract SmartChefInitializable is Ownable, ReentrancyGuard { using SafeERC20 for IERC20Metadata; // The address of the smart chef factory address public immutable SMART_CHEF_FACTORY; // Whether a limit is set for users bool public userLimit; // Whether it is initialized bool public isInitialized; // Accrued token per share uint256 public accTokenPerShare; // The block timestamp when CAKE mining ends uint256 public endTimestamp; // The block timestamp when CAKE mining starts uint256 public startTimestamp; // The block timestamp of the last pool update uint256 public lastRewardTimestamp; // The pool limit (0 if none) uint256 public poolLimitPerUser; // Seconds available for user limit (after start timestamp) uint256 public numberSecondsForUserLimit; // Pancake profile address address public immutable pancakeProfile; // Pancake Profile is requested bool public pancakeProfileIsRequested; // Pancake Profile points threshold uint256 public pancakeProfileThresholdPoints; // CAKE tokens created per second uint256 public rewardPerSecond; // The precision factor uint256 public PRECISION_FACTOR; // The reward token IERC20Metadata public rewardToken; // The staked token IERC20Metadata public stakedToken; // Info of each user that stakes tokens (stakedToken) mapping(address => UserInfo) public userInfo; struct UserInfo { uint256 amount; // How many staked tokens the user has provided uint256 rewardDebt; } event Deposit(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); event NewStartAndEndTimestamp(uint256 startTimestamp, uint256 endTimestamp); event NewRewardPerSecond(uint256 rewardPerSecond); event NewPoolLimit(uint256 poolLimitPerUser); event RewardsStop(uint256 blockNumber); event TokenRecovery(address indexed token, uint256 amount); event Withdraw(address indexed user, uint256 amount); event UpdateProfileAndThresholdPointsRequirement(bool isProfileRequested, uint256 thresholdPoints); /** * @notice Constructor * @param _pancakeProfile: Pancake Profile address * @param _pancakeProfileIsRequested: Pancake Profile is requested * @param _pancakeProfileThresholdPoints: Pancake Profile need threshold points */ constructor( address _pancakeProfile, bool _pancakeProfileIsRequested, uint256 _pancakeProfileThresholdPoints ) { SMART_CHEF_FACTORY = msg.sender; pancakeProfile = _pancakeProfile; // It can be empty on Other chain if (_pancakeProfile != address(0)) { IPancakeProfile(_pancakeProfile).getTeamProfile(1); // if pancakeProfile is requested pancakeProfileIsRequested = _pancakeProfileIsRequested; // pancakeProfile threshold points when profile & points are requested pancakeProfileThresholdPoints = _pancakeProfileThresholdPoints; } else { pancakeProfileIsRequested = false; pancakeProfileThresholdPoints = 0; } } /* * @notice Initialize the contract * @param _stakedToken: staked token address * @param _rewardToken: reward token address * @param _rewardPerSecond: reward per second (in rewardToken) * @param _startTimestamp: start block timestamp * @param _endTimestamp: end block timestamp * @param _poolLimitPerUser: pool limit per user in stakedToken (if any, else 0) * @param _numberSecondsForUserLimit: seconds available for user limit (after start timestamp) * @param _admin: admin address with ownership */ function initialize( IERC20Metadata _stakedToken, IERC20Metadata _rewardToken, uint256 _rewardPerSecond, uint256 _startTimestamp, uint256 _endTimestamp, uint256 _poolLimitPerUser, uint256 _numberSecondsForUserLimit, address _admin ) external { require(!isInitialized, "Already initialized"); require(msg.sender == SMART_CHEF_FACTORY, "Not factory"); require(_startTimestamp < _endTimestamp, "New startTimestamp must be lower than new endTimestamp"); require(block.timestamp < _startTimestamp, "New startTimestamp must be higher than current block timestamp"); // Make this contract initialized isInitialized = true; stakedToken = _stakedToken; rewardToken = _rewardToken; rewardPerSecond = _rewardPerSecond; startTimestamp = _startTimestamp; endTimestamp = _endTimestamp; if (_poolLimitPerUser > 0) { userLimit = true; poolLimitPerUser = _poolLimitPerUser; numberSecondsForUserLimit = _numberSecondsForUserLimit; } uint256 decimalsRewardToken = uint256(rewardToken.decimals()); require(decimalsRewardToken < 36, "Must be inferior to 36"); PRECISION_FACTOR = uint256(10**(uint256(36) - decimalsRewardToken)); require(PRECISION_FACTOR * rewardPerSecond / (10**decimalsRewardToken) >= 100_000_000, "rewardPerSecond must be larger"); // Set the lastRewardBlock as the startTimestamp lastRewardTimestamp = startTimestamp; // Transfer ownership to the admin address who becomes owner of the contract transferOwnership(_admin); } /* * @notice Deposit staked tokens and collect reward tokens (if any) * @param _amount: amount to withdraw (in rewardToken) */ function deposit(uint256 _amount) external nonReentrant { UserInfo storage user = userInfo[msg.sender]; if (pancakeProfile != address(0)) { // Checks whether the user has an active profile require( (!pancakeProfileIsRequested && pancakeProfileThresholdPoints == 0) || IPancakeProfile(pancakeProfile).getUserStatus(msg.sender), "Deposit: Must have an active profile" ); uint256 numberUserPoints = 0; if (pancakeProfileThresholdPoints > 0) { require(pancakeProfile != address(0), "Deposit: PancakeProfile is not exist"); (, numberUserPoints, , , , ) = IPancakeProfile(pancakeProfile).getUserProfile(msg.sender); } require( pancakeProfileThresholdPoints == 0 || numberUserPoints >= pancakeProfileThresholdPoints, "Deposit: User is not get enough user points" ); } userLimit = hasUserLimit(); require(!userLimit || ((_amount + user.amount) <= poolLimitPerUser), "Deposit: Amount above limit"); _updatePool(); if (user.amount > 0) { uint256 pending = (user.amount * accTokenPerShare) / PRECISION_FACTOR - user.rewardDebt; if (pending > 0) { rewardToken.safeTransfer(address(msg.sender), pending); } } if (_amount > 0) { user.amount = user.amount + _amount; stakedToken.safeTransferFrom(address(msg.sender), address(this), _amount); } user.rewardDebt = (user.amount * accTokenPerShare) / PRECISION_FACTOR; emit Deposit(msg.sender, _amount); } /* * @notice Withdraw staked tokens and collect reward tokens * @param _amount: amount to withdraw (in rewardToken) */ function withdraw(uint256 _amount) external nonReentrant { UserInfo storage user = userInfo[msg.sender]; require(user.amount >= _amount, "Amount to withdraw too high"); _updatePool(); uint256 pending = (user.amount * accTokenPerShare) / PRECISION_FACTOR - user.rewardDebt; if (_amount > 0) { user.amount = user.amount - _amount; stakedToken.safeTransfer(address(msg.sender), _amount); } if (pending > 0) { rewardToken.safeTransfer(address(msg.sender), pending); } user.rewardDebt = (user.amount * accTokenPerShare) / PRECISION_FACTOR; emit Withdraw(msg.sender, _amount); } /* * @notice Withdraw staked tokens without caring about rewards rewards * @dev Needs to be for emergency. */ function emergencyWithdraw() external nonReentrant { UserInfo storage user = userInfo[msg.sender]; uint256 amountToTransfer = user.amount; user.amount = 0; user.rewardDebt = 0; if (amountToTransfer > 0) { stakedToken.safeTransfer(address(msg.sender), amountToTransfer); } emit EmergencyWithdraw(msg.sender, user.amount); } /* * @notice Stop rewards * @dev Only callable by owner. Needs to be for emergency. */ function emergencyRewardWithdraw(uint256 _amount) external onlyOwner { rewardToken.safeTransfer(address(msg.sender), _amount); } /** * @notice Allows the owner to recover tokens sent to the contract by mistake * @param _token: token address * @dev Callable by owner */ function recoverToken(address _token) external onlyOwner { require(_token != address(stakedToken), "Operations: Cannot recover staked token"); require(_token != address(rewardToken), "Operations: Cannot recover reward token"); uint256 balance = IERC20Metadata(_token).balanceOf(address(this)); require(balance != 0, "Operations: Cannot recover zero balance"); IERC20Metadata(_token).safeTransfer(address(msg.sender), balance); emit TokenRecovery(_token, balance); } /* * @notice Stop rewards * @dev Only callable by owner */ function stopReward() external onlyOwner { endTimestamp = block.timestamp; emit RewardsStop(endTimestamp); } /* * @notice Update pool limit per user * @dev Only callable by owner. * @param _userLimit: whether the limit remains forced * @param _poolLimitPerUser: new pool limit per user */ function updatePoolLimitPerUser(bool _userLimit, uint256 _poolLimitPerUser) external onlyOwner { require(userLimit, "Must be set"); if (_userLimit) { require(_poolLimitPerUser > poolLimitPerUser, "New limit must be higher"); poolLimitPerUser = _poolLimitPerUser; } else { userLimit = _userLimit; poolLimitPerUser = 0; } emit NewPoolLimit(poolLimitPerUser); } /* * @notice Update reward per block * @dev Only callable by owner. * @param _rewardPerSecond: the reward per second */ function updateRewardPerSecond(uint256 _rewardPerSecond) external onlyOwner { require(block.timestamp < startTimestamp, "Pool has started"); uint256 decimalsRewardToken = uint256(rewardToken.decimals()); require(PRECISION_FACTOR * _rewardPerSecond / (10**decimalsRewardToken) >= 100_000_000, "rewardPerSecond must be larger"); rewardPerSecond = _rewardPerSecond; emit NewRewardPerSecond(_rewardPerSecond); } /** * @notice It allows the admin to update start and end blocks * @dev This function is only callable by owner. * @param _startTimestamp: the new start block timestamp * @param _endTimestamp: the new end block timestamp */ function updateStartAndEndTimestamp(uint256 _startTimestamp, uint256 _endTimestamp) external onlyOwner { require(block.timestamp < startTimestamp, "Pool has started"); require(_startTimestamp < _endTimestamp, "New startTimestamp must be lower than new endTimestamp"); require(block.timestamp < _startTimestamp, "New startTimestamp must be higher than current block timestamp"); startTimestamp = _startTimestamp; endTimestamp = _endTimestamp; // Set the lastRewardTimestamp as the startTimestamp lastRewardTimestamp = startTimestamp; emit NewStartAndEndTimestamp(_startTimestamp, _endTimestamp); } /** * @notice It allows the admin to update profile and thresholdPoints' requirement. * @dev This function is only callable by owner. * @param _isRequested: the profile is requested * @param _thresholdPoints: the threshold points */ function updateProfileAndThresholdPointsRequirement(bool _isRequested, uint256 _thresholdPoints) external onlyOwner { require(pancakeProfile != address(0), "Pancake profile address is null"); require(_thresholdPoints >= 0, "Threshold points need to exceed 0"); pancakeProfileIsRequested = _isRequested; pancakeProfileThresholdPoints = _thresholdPoints; emit UpdateProfileAndThresholdPointsRequirement(_isRequested, _thresholdPoints); } /* * @notice View function to see pending reward on frontend. * @param _user: user address * @return Pending reward for a given user */ function pendingReward(address _user) external view returns (uint256) { UserInfo storage user = userInfo[_user]; uint256 stakedTokenSupply = stakedToken.balanceOf(address(this)); if (block.timestamp > lastRewardTimestamp && stakedTokenSupply != 0) { uint256 multiplier = _getMultiplier(lastRewardTimestamp, block.timestamp); uint256 cakeReward = multiplier * rewardPerSecond; uint256 adjustedTokenPerShare = accTokenPerShare + (cakeReward * PRECISION_FACTOR) / stakedTokenSupply; return (user.amount * adjustedTokenPerShare) / PRECISION_FACTOR - user.rewardDebt; } else { return (user.amount * accTokenPerShare) / PRECISION_FACTOR - user.rewardDebt; } } /* * @notice Update reward variables of the given pool to be up-to-date. */ function _updatePool() internal { if (block.timestamp <= lastRewardTimestamp) { return; } uint256 stakedTokenSupply = stakedToken.balanceOf(address(this)); if (stakedTokenSupply == 0) { lastRewardTimestamp = block.timestamp; return; } uint256 multiplier = _getMultiplier(lastRewardTimestamp, block.timestamp); uint256 cakeReward = multiplier * rewardPerSecond; accTokenPerShare = accTokenPerShare + (cakeReward * PRECISION_FACTOR) / stakedTokenSupply; lastRewardTimestamp = block.timestamp; } /* * @notice Return reward multiplier over the given _from to _to block. * @param _from: block to start * @param _to: block to finish */ function _getMultiplier(uint256 _from, uint256 _to) internal view returns (uint256) { if (_to <= endTimestamp) { return _to - _from; } else if (_from >= endTimestamp) { return 0; } else { return endTimestamp - _from; } } /* * @notice Return user limit is set or zero. */ function hasUserLimit() public view returns (bool) { if (!userLimit || (block.timestamp >= (startTimestamp + numberSecondsForUserLimit))) { return false; } return true; } } contract SmartChefFactory is Ownable { event NewSmartChefContract(address indexed smartChef); constructor() { // } /* * @notice Deploy the pool * @param _stakedToken: staked token address * @param _rewardToken: reward token address * @param _rewardPerSecond: reward per second (in rewardToken) * @param _startTimestamp: start block timestamp * @param _endTimestamp: end block timestamp * @param _poolLimitPerUser: pool limit per user in stakedToken (if any, else 0) * @param _numberSecondsForUserLimit: seconds available for user limit (after start block) * @param _pancakeProfile: Pancake Profile address * @param _pancakeProfileIsRequested: Pancake Profile is requested * @param _pancakeProfileThresholdPoints: Pancake Profile need threshold points * @param _admin: admin address with ownership * @return address of new smart chef contract */ function deployPool( IERC20Metadata _stakedToken, IERC20Metadata _rewardToken, uint256 _rewardPerSecond, uint256 _startTimestamp, uint256 _endTimestamp, uint256 _poolLimitPerUser, uint256 _numberSecondsForUserLimit, address _pancakeProfile, bool _pancakeProfileIsRequested, uint256 _pancakeProfileThresholdPoints, address _admin ) external onlyOwner { require(_stakedToken.totalSupply() >= 0); require(_rewardToken.totalSupply() >= 0); require(_stakedToken != _rewardToken, "Tokens must be be different"); bytes memory bytecode = type(SmartChefInitializable).creationCode; // pass constructor argument bytecode = abi.encodePacked( bytecode, abi.encode(_pancakeProfile, _pancakeProfileIsRequested, _pancakeProfileThresholdPoints) ); bytes32 salt = keccak256(abi.encodePacked(_stakedToken, _rewardToken, _startTimestamp)); address smartChefAddress; assembly { smartChefAddress := create2(0, add(bytecode, 32), mload(bytecode), salt) } SmartChefInitializable(smartChefAddress).initialize( _stakedToken, _rewardToken, _rewardPerSecond, _startTimestamp, _endTimestamp, _poolLimitPerUser, _numberSecondsForUserLimit, _admin ); emit NewSmartChefContract(smartChefAddress); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_pancakeProfile","type":"address"},{"internalType":"bool","name":"_pancakeProfileIsRequested","type":"bool"},{"internalType":"uint256","name":"_pancakeProfileThresholdPoints","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"poolLimitPerUser","type":"uint256"}],"name":"NewPoolLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardPerSecond","type":"uint256"}],"name":"NewRewardPerSecond","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTimestamp","type":"uint256"}],"name":"NewStartAndEndTimestamp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"RewardsStop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenRecovery","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isProfileRequested","type":"bool"},{"indexed":false,"internalType":"uint256","name":"thresholdPoints","type":"uint256"}],"name":"UpdateProfileAndThresholdPointsRequirement","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"PRECISION_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SMART_CHEF_FACTORY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accTokenPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasUserLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Metadata","name":"_stakedToken","type":"address"},{"internalType":"contract IERC20Metadata","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_rewardPerSecond","type":"uint256"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"},{"internalType":"uint256","name":"_poolLimitPerUser","type":"uint256"},{"internalType":"uint256","name":"_numberSecondsForUserLimit","type":"uint256"},{"internalType":"address","name":"_admin","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRewardTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberSecondsForUserLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pancakeProfile","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pancakeProfileIsRequested","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pancakeProfileThresholdPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLimitPerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20Metadata","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedToken","outputs":[{"internalType":"contract IERC20Metadata","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stopReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_userLimit","type":"bool"},{"internalType":"uint256","name":"_poolLimitPerUser","type":"uint256"}],"name":"updatePoolLimitPerUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isRequested","type":"bool"},{"internalType":"uint256","name":"_thresholdPoints","type":"uint256"}],"name":"updateProfileAndThresholdPointsRequirement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerSecond","type":"uint256"}],"name":"updateRewardPerSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTimestamp","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"}],"name":"updateStartAndEndTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"userLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b50604051620030e8380380620030e883398101604081905262000034916200023c565b6200003f3362000123565b6001805533606090811b60805283901b6001600160601b03191660a0526001600160a01b038316156200010a5760405163aee2f47f60e01b8152600160048201526001600160a01b0384169063aee2f47f9060240160006040518083038186803b158015620000ad57600080fd5b505afa158015620000c2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620000ec919081019062000288565b50506009805460ff1916861515179055505050600a8190556200011a565b6009805460ff191690556000600a555b5050506200032b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b805180151581146200018457600080fd5b919050565b600082601f8301126200019a578081fd5b81516001600160401b0380821115620001b757620001b762000315565b604051601f8301601f19908116603f01168101908282118183101715620001e257620001e262000315565b81604052838152602092508683858801011115620001fe578485fd5b8491505b8382101562000221578582018301518183018401529082019062000202565b838211156200023257848385830101525b9695505050505050565b60008060006060848603121562000251578283fd5b83516001600160a01b038116811462000268578384fd5b9250620002786020850162000173565b9150604084015190509250925092565b600080600080600060a08688031215620002a0578081fd5b85516001600160401b0380821115620002b7578283fd5b620002c589838a0162000189565b96506020880151915080821115620002db578283fd5b50620002ea8882890162000189565b9450506040860151925060608601519150620003096080870162000173565b90509295509295909350565b634e487b7160e01b600052604160045260246000fd5b60805160601c60a05160601c612d6762000381600039600081816103ee01528181610ef701528181611745015281816117c6015281816118ed01526119db0152600081816103c7015261053b0152612d676000f3fe608060405234801561001057600080fd5b506004361061020b5760003560e01c80638f6629151161012a578063cc356c59116100bd578063e6fd48bc1161008c578063f40f0f5211610071578063f40f0f5214610470578063f7c618c114610483578063f8077fae146104a357600080fd5b8063e6fd48bc14610454578063f2fde38b1461045d57600080fd5b8063cc356c5914610410578063cc7a262e14610423578063ccd34cd514610443578063db2e21bc1461044c57600080fd5b8063a85adeab116100f9578063a85adeab146103a6578063b6b55f25146103af578063bd617191146103c2578063c7d936ec146103e957600080fd5b80638f6629151461036f57806392e8990e146103785780639be65a6014610380578063a0b409051461039357600080fd5b80634a7c01ec116101a2578063715018a611610171578063715018a61461031757806380dc06721461031f5780638da5cb5b146103275780638f10369a1461036657600080fd5b80634a7c01ec146102e15780635a0b5f34146102ee57806366fe9f8a146102fb578063681096311461030457600080fd5b80632e1a7d4d116101de5780632e1a7d4d146102865780633279beab14610299578063392e53cd146102ac5780634004c8e7146102ce57600080fd5b80630ace6247146102105780631573ebdf1461022c5780631959a002146102355780632aa2c38114610271575b600080fd5b610219600a5481565b6040519081526020015b60405180910390f35b61021960085481565b61025c6102433660046128bf565b600f602052600090815260409020805460019091015482565b60408051928352602083019190915201610223565b61028461027f366004612922565b6104ac565b005b61028461029436600461299d565b610983565b6102846102a736600461299d565b610b6b565b6002546102be90610100900460ff1681565b6040519015158152602001610223565b6102846102dc36600461299d565b610c13565b6002546102be9060ff1681565b6009546102be9060ff1681565b61021960075481565b6102846103123660046128f7565b610e74565b610284610ffc565b610284611089565b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610223565b610219600b5481565b61021960035481565b6102be611145565b61028461038e3660046128bf565b61117a565b6102846103a13660046128f7565b6114f5565b61021960045481565b6102846103bd36600461299d565b6116c2565b6103417f000000000000000000000000000000000000000000000000000000000000000081565b6103417f000000000000000000000000000000000000000000000000000000000000000081565b61028461041e3660046129cd565b611cd0565b600e546103419073ffffffffffffffffffffffffffffffffffffffff1681565b610219600c5481565b610284611f1f565b61021960055481565b61028461046b3660046128bf565b61200d565b61021961047e3660046128bf565b61213a565b600d546103419073ffffffffffffffffffffffffffffffffffffffff1681565b61021960065481565b600254610100900460ff1615610523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146105c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4e6f7420666163746f7279000000000000000000000000000000000000000000604482015260640161051a565b838510610651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4e657720737461727454696d657374616d70206d757374206265206c6f77657260448201527f207468616e206e657720656e6454696d657374616d7000000000000000000000606482015260840161051a565b8442106106e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4e657720737461727454696d657374616d70206d75737420626520686967686560448201527f72207468616e2063757272656e7420626c6f636b2074696d657374616d700000606482015260840161051a565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055600e805473ffffffffffffffffffffffffffffffffffffffff808b167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600d8054928a1692909116919091179055600b8690556005859055600484905582156107ac57600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600783905560088290555b600d54604080517f313ce567000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163313ce567916004808301926020929190829003018186803b15801561081757600080fd5b505afa15801561082b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084f9190612a4c565b60ff169050602481106108be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d75737420626520696e666572696f7220746f20333600000000000000000000604482015260640161051a565b6108c9816024612c8f565b6108d490600a612b8c565b600c556305f5e1006108e782600a612b8c565b600b54600c546108f79190612c52565b6109019190612af2565b1015610969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f7265776172645065725365636f6e64206d757374206265206c61726765720000604482015260640161051a565b6005546006556109788261200d565b505050505050505050565b600260015414156109f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161051a565b6002600155336000908152600f602052604090208054821115610a6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f416d6f756e7420746f20776974686472617720746f6f20686967680000000000604482015260640161051a565b610a776122bf565b60008160010154600c546003548460000154610a939190612c52565b610a9d9190612af2565b610aa79190612c8f565b90508215610ae2578154610abc908490612c8f565b8255600e54610ae29073ffffffffffffffffffffffffffffffffffffffff1633856123ce565b8015610b0c57600d54610b0c9073ffffffffffffffffffffffffffffffffffffffff1633836123ce565b600c546003548354610b1e9190612c52565b610b289190612af2565b600183015560405183815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a250506001805550565b60005473ffffffffffffffffffffffffffffffffffffffff163314610bec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b600d54610c109073ffffffffffffffffffffffffffffffffffffffff1633836123ce565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b6005544210610cff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f506f6f6c20686173207374617274656400000000000000000000000000000000604482015260640161051a565b600d54604080517f313ce567000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163313ce567916004808301926020929190829003018186803b158015610d6a57600080fd5b505afa158015610d7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da29190612a4c565b60ff1690506305f5e100610db782600a612b8c565b83600c54610dc59190612c52565b610dcf9190612af2565b1015610e37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f7265776172645065725365636f6e64206d757374206265206c61726765720000604482015260640161051a565b600b8290556040518281527f3fca6699460f553eae31233dba0b41f635e80f5bd8132d7f2af5456c3e247be0906020015b60405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ef5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610f92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f50616e63616b652070726f66696c652061646472657373206973206e756c6c00604482015260640161051a565b600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016831515908117909155600a82905560408051918252602082018390527f915d08e0e89c58e352d7c1d66c942cb15dac8a7294d2ca80ddf46f1998f0512b9101610e68565b60005473ffffffffffffffffffffffffffffffffffffffff16331461107d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b61108760006124a7565b565b60005473ffffffffffffffffffffffffffffffffffffffff16331461110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b4260048190556040519081527ffed9fcb0ca3d1e761a4b929792bb24082fba92dca81252646ad306d3068065669060200160405180910390a1565b60025460009060ff16158061116957506008546005546111659190612ada565b4210155b156111745750600090565b50600190565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b600e5473ffffffffffffffffffffffffffffffffffffffff828116911614156112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4f7065726174696f6e733a2043616e6e6f74207265636f766572207374616b6560448201527f6420746f6b656e00000000000000000000000000000000000000000000000000606482015260840161051a565b600d5473ffffffffffffffffffffffffffffffffffffffff82811691161415611351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4f7065726174696f6e733a2043616e6e6f74207265636f76657220726577617260448201527f6420746f6b656e00000000000000000000000000000000000000000000000000606482015260840161051a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a082319060240160206040518083038186803b1580156113b957600080fd5b505afa1580156113cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f191906129b5565b905080611480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4f7065726174696f6e733a2043616e6e6f74207265636f766572207a65726f2060448201527f62616c616e636500000000000000000000000000000000000000000000000000606482015260840161051a565b6114a173ffffffffffffffffffffffffffffffffffffffff831633836123ce565b8173ffffffffffffffffffffffffffffffffffffffff167f14f11966a996e0629572e51064726d2057a80fbd34efc066682c06a71dbb6e98826040516114e991815260200190565b60405180910390a25050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b60025460ff166115e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4d75737420626520736574000000000000000000000000000000000000000000604482015260640161051a565b811561165d576007548111611653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4e6577206c696d6974206d757374206265206869676865720000000000000000604482015260640161051a565b600781905561168f565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001683151517905560006007555b7f241f67ee5f41b7a5cabf911367329be7215900f602ebfc47f89dce2a6bcd847c600754604051610e6891815260200190565b6002600154141561172f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161051a565b6002600155336000908152600f602052604090207f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615611b125760095460ff161580156117925750600a54155b8061185557506040517fea0d5dcd0000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063ea0d5dcd9060240160206040518083038186803b15801561181d57600080fd5b505afa158015611831573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185591906128db565b6118e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4465706f7369743a204d757374206861766520616e206163746976652070726f60448201527f66696c6500000000000000000000000000000000000000000000000000000000606482015260840161051a565b600a5460009015611a73577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166119ad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4465706f7369743a2050616e63616b6550726f66696c65206973206e6f74206560448201527f7869737400000000000000000000000000000000000000000000000000000000606482015260840161051a565b6040517f987ee1560000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063987ee1569060240160c06040518083038186803b158015611a3257600080fd5b505afa158015611a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6a91906129ee565b50929450505050505b600a541580611a845750600a548110155b611b10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4465706f7369743a2055736572206973206e6f742067657420656e6f7567682060448201527f7573657220706f696e7473000000000000000000000000000000000000000000606482015260840161051a565b505b611b1a611145565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515918217905560ff161580611b6457506007548154611b619084612ada565b11155b611bca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4465706f7369743a20416d6f756e742061626f7665206c696d69740000000000604482015260640161051a565b611bd26122bf565b805415611c375760008160010154600c546003548460000154611bf59190612c52565b611bff9190612af2565b611c099190612c8f565b90508015611c3557600d54611c359073ffffffffffffffffffffffffffffffffffffffff1633836123ce565b505b8115611c71578054611c4a908390612ada565b8155600e54611c719073ffffffffffffffffffffffffffffffffffffffff1633308561251c565b600c546003548254611c839190612c52565b611c8d9190612af2565b600182015560405182815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c906020015b60405180910390a2505060018055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b6005544210611dbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f506f6f6c20686173207374617274656400000000000000000000000000000000604482015260640161051a565b808210611e4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4e657720737461727454696d657374616d70206d757374206265206c6f77657260448201527f207468616e206e657720656e6454696d657374616d7000000000000000000000606482015260840161051a565b814210611eda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4e657720737461727454696d657374616d70206d75737420626520686967686560448201527f72207468616e2063757272656e7420626c6f636b2074696d657374616d700000606482015260840161051a565b60058290556004819055600682905560408051838152602081018390527f600b4644e23e4e5ac956d20c02417fc8385bd0324ce2ce012b91d812ad89024b9101610e68565b60026001541415611f8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161051a565b60026001908155336000908152600f60205260408120805482825592810191909155908015611fd957600e54611fd99073ffffffffffffffffffffffffffffffffffffffff1633836123ce565b815460405190815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd969590602001611cc0565b60005473ffffffffffffffffffffffffffffffffffffffff16331461208e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b73ffffffffffffffffffffffffffffffffffffffff8116612131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161051a565b610c10816124a7565b73ffffffffffffffffffffffffffffffffffffffff8181166000908152600f6020526040808220600e5491517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152929390928492909116906370a082319060240160206040518083038186803b1580156121ba57600080fd5b505afa1580156121ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f291906129b5565b90506006544211801561220457508015155b1561228c57600061221760065442612580565b90506000600b54826122299190612c52565b9050600083600c548361223c9190612c52565b6122469190612af2565b6003546122539190612ada565b90508460010154600c5482876000015461226d9190612c52565b6122779190612af2565b6122819190612c8f565b979650505050505050565b6001820154600c5460035484546122a39190612c52565b6122ad9190612af2565b6122b79190612c8f565b949350505050565b60065442116122ca57565b600e546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561233457600080fd5b505afa158015612348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236c91906129b5565b90508061237a575042600655565b600061238860065442612580565b90506000600b548261239a9190612c52565b905082600c54826123ab9190612c52565b6123b59190612af2565b6003546123c29190612ada565b60035550504260065550565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526124a29084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526125c1565b505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261257a9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612420565b50505050565b6000600454821161259c576125958383612c8f565b90506125bb565b60045483106125ad575060006125bb565b826004546125959190612c8f565b92915050565b6000612623826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166126cd9092919063ffffffff16565b8051909150156124a2578080602001905181019061264191906128db565b6124a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161051a565b60606126dc84846000856126e6565b90505b9392505050565b606082471015612778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161051a565b73ffffffffffffffffffffffffffffffffffffffff85163b6127f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161051a565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161281f9190612a6d565b60006040518083038185875af1925050503d806000811461285c576040519150601f19603f3d011682016040523d82523d6000602084013e612861565b606091505b50915091506122818282866060831561287b5750816126df565b82511561288b5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051a9190612a89565b6000602082840312156128d0578081fd5b81356126df81612d01565b6000602082840312156128ec578081fd5b81516126df81612d23565b60008060408385031215612909578081fd5b823561291481612d23565b946020939093013593505050565b600080600080600080600080610100898b03121561293e578384fd5b883561294981612d01565b9750602089013561295981612d01565b965060408901359550606089013594506080890135935060a0890135925060c0890135915060e089013561298c81612d01565b809150509295985092959890939650565b6000602082840312156129ae578081fd5b5035919050565b6000602082840312156129c6578081fd5b5051919050565b600080604083850312156129df578182fd5b50508035926020909101359150565b60008060008060008060c08789031215612a06578182fd5b8651955060208701519450604087015193506060870151612a2681612d01565b608088015160a08901519194509250612a3e81612d23565b809150509295509295509295565b600060208284031215612a5d578081fd5b815160ff811681146126df578182fd5b60008251612a7f818460208701612ca6565b9190910192915050565b6020815260008251806020840152612aa8816040850160208701612ca6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008219821115612aed57612aed612cd2565b500190565b600082612b26577f4e487b710000000000000000000000000000000000000000000000000000000081526012600452602481fd5b500490565b600181815b80851115612b8457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612b6a57612b6a612cd2565b80851615612b7757918102915b93841c9390800290612b30565b509250929050565b60006126df8383600082612ba2575060016125bb565b81612baf575060006125bb565b8160018114612bc55760028114612bcf57612beb565b60019150506125bb565b60ff841115612be057612be0612cd2565b50506001821b6125bb565b5060208310610133831016604e8410600b8410161715612c0e575081810a6125bb565b612c188383612b2b565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612c4a57612c4a612cd2565b029392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c8a57612c8a612cd2565b500290565b600082821015612ca157612ca1612cd2565b500390565b60005b83811015612cc1578181015183820152602001612ca9565b8381111561257a5750506000910152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c1057600080fd5b8015158114610c1057600080fdfea26469706673582212201a5409e2034e26b4f0830b9c0fe49adea1f46ded92befa46ca00ee816c1d242064736f6c63430008040033000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061020b5760003560e01c80638f6629151161012a578063cc356c59116100bd578063e6fd48bc1161008c578063f40f0f5211610071578063f40f0f5214610470578063f7c618c114610483578063f8077fae146104a357600080fd5b8063e6fd48bc14610454578063f2fde38b1461045d57600080fd5b8063cc356c5914610410578063cc7a262e14610423578063ccd34cd514610443578063db2e21bc1461044c57600080fd5b8063a85adeab116100f9578063a85adeab146103a6578063b6b55f25146103af578063bd617191146103c2578063c7d936ec146103e957600080fd5b80638f6629151461036f57806392e8990e146103785780639be65a6014610380578063a0b409051461039357600080fd5b80634a7c01ec116101a2578063715018a611610171578063715018a61461031757806380dc06721461031f5780638da5cb5b146103275780638f10369a1461036657600080fd5b80634a7c01ec146102e15780635a0b5f34146102ee57806366fe9f8a146102fb578063681096311461030457600080fd5b80632e1a7d4d116101de5780632e1a7d4d146102865780633279beab14610299578063392e53cd146102ac5780634004c8e7146102ce57600080fd5b80630ace6247146102105780631573ebdf1461022c5780631959a002146102355780632aa2c38114610271575b600080fd5b610219600a5481565b6040519081526020015b60405180910390f35b61021960085481565b61025c6102433660046128bf565b600f602052600090815260409020805460019091015482565b60408051928352602083019190915201610223565b61028461027f366004612922565b6104ac565b005b61028461029436600461299d565b610983565b6102846102a736600461299d565b610b6b565b6002546102be90610100900460ff1681565b6040519015158152602001610223565b6102846102dc36600461299d565b610c13565b6002546102be9060ff1681565b6009546102be9060ff1681565b61021960075481565b6102846103123660046128f7565b610e74565b610284610ffc565b610284611089565b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610223565b610219600b5481565b61021960035481565b6102be611145565b61028461038e3660046128bf565b61117a565b6102846103a13660046128f7565b6114f5565b61021960045481565b6102846103bd36600461299d565b6116c2565b6103417f000000000000000000000000feba328c15997b28b43708071ed3d22e2ffc972481565b6103417f000000000000000000000000000000000000000000000000000000000000000081565b61028461041e3660046129cd565b611cd0565b600e546103419073ffffffffffffffffffffffffffffffffffffffff1681565b610219600c5481565b610284611f1f565b61021960055481565b61028461046b3660046128bf565b61200d565b61021961047e3660046128bf565b61213a565b600d546103419073ffffffffffffffffffffffffffffffffffffffff1681565b61021960065481565b600254610100900460ff1615610523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000feba328c15997b28b43708071ed3d22e2ffc972416146105c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4e6f7420666163746f7279000000000000000000000000000000000000000000604482015260640161051a565b838510610651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4e657720737461727454696d657374616d70206d757374206265206c6f77657260448201527f207468616e206e657720656e6454696d657374616d7000000000000000000000606482015260840161051a565b8442106106e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4e657720737461727454696d657374616d70206d75737420626520686967686560448201527f72207468616e2063757272656e7420626c6f636b2074696d657374616d700000606482015260840161051a565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055600e805473ffffffffffffffffffffffffffffffffffffffff808b167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600d8054928a1692909116919091179055600b8690556005859055600484905582156107ac57600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600783905560088290555b600d54604080517f313ce567000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163313ce567916004808301926020929190829003018186803b15801561081757600080fd5b505afa15801561082b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084f9190612a4c565b60ff169050602481106108be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d75737420626520696e666572696f7220746f20333600000000000000000000604482015260640161051a565b6108c9816024612c8f565b6108d490600a612b8c565b600c556305f5e1006108e782600a612b8c565b600b54600c546108f79190612c52565b6109019190612af2565b1015610969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f7265776172645065725365636f6e64206d757374206265206c61726765720000604482015260640161051a565b6005546006556109788261200d565b505050505050505050565b600260015414156109f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161051a565b6002600155336000908152600f602052604090208054821115610a6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f416d6f756e7420746f20776974686472617720746f6f20686967680000000000604482015260640161051a565b610a776122bf565b60008160010154600c546003548460000154610a939190612c52565b610a9d9190612af2565b610aa79190612c8f565b90508215610ae2578154610abc908490612c8f565b8255600e54610ae29073ffffffffffffffffffffffffffffffffffffffff1633856123ce565b8015610b0c57600d54610b0c9073ffffffffffffffffffffffffffffffffffffffff1633836123ce565b600c546003548354610b1e9190612c52565b610b289190612af2565b600183015560405183815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a250506001805550565b60005473ffffffffffffffffffffffffffffffffffffffff163314610bec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b600d54610c109073ffffffffffffffffffffffffffffffffffffffff1633836123ce565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b6005544210610cff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f506f6f6c20686173207374617274656400000000000000000000000000000000604482015260640161051a565b600d54604080517f313ce567000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163313ce567916004808301926020929190829003018186803b158015610d6a57600080fd5b505afa158015610d7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da29190612a4c565b60ff1690506305f5e100610db782600a612b8c565b83600c54610dc59190612c52565b610dcf9190612af2565b1015610e37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f7265776172645065725365636f6e64206d757374206265206c61726765720000604482015260640161051a565b600b8290556040518281527f3fca6699460f553eae31233dba0b41f635e80f5bd8132d7f2af5456c3e247be0906020015b60405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ef5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610f92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f50616e63616b652070726f66696c652061646472657373206973206e756c6c00604482015260640161051a565b600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016831515908117909155600a82905560408051918252602082018390527f915d08e0e89c58e352d7c1d66c942cb15dac8a7294d2ca80ddf46f1998f0512b9101610e68565b60005473ffffffffffffffffffffffffffffffffffffffff16331461107d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b61108760006124a7565b565b60005473ffffffffffffffffffffffffffffffffffffffff16331461110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b4260048190556040519081527ffed9fcb0ca3d1e761a4b929792bb24082fba92dca81252646ad306d3068065669060200160405180910390a1565b60025460009060ff16158061116957506008546005546111659190612ada565b4210155b156111745750600090565b50600190565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b600e5473ffffffffffffffffffffffffffffffffffffffff828116911614156112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4f7065726174696f6e733a2043616e6e6f74207265636f766572207374616b6560448201527f6420746f6b656e00000000000000000000000000000000000000000000000000606482015260840161051a565b600d5473ffffffffffffffffffffffffffffffffffffffff82811691161415611351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4f7065726174696f6e733a2043616e6e6f74207265636f76657220726577617260448201527f6420746f6b656e00000000000000000000000000000000000000000000000000606482015260840161051a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a082319060240160206040518083038186803b1580156113b957600080fd5b505afa1580156113cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f191906129b5565b905080611480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4f7065726174696f6e733a2043616e6e6f74207265636f766572207a65726f2060448201527f62616c616e636500000000000000000000000000000000000000000000000000606482015260840161051a565b6114a173ffffffffffffffffffffffffffffffffffffffff831633836123ce565b8173ffffffffffffffffffffffffffffffffffffffff167f14f11966a996e0629572e51064726d2057a80fbd34efc066682c06a71dbb6e98826040516114e991815260200190565b60405180910390a25050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b60025460ff166115e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4d75737420626520736574000000000000000000000000000000000000000000604482015260640161051a565b811561165d576007548111611653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4e6577206c696d6974206d757374206265206869676865720000000000000000604482015260640161051a565b600781905561168f565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001683151517905560006007555b7f241f67ee5f41b7a5cabf911367329be7215900f602ebfc47f89dce2a6bcd847c600754604051610e6891815260200190565b6002600154141561172f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161051a565b6002600155336000908152600f602052604090207f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1615611b125760095460ff161580156117925750600a54155b8061185557506040517fea0d5dcd0000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063ea0d5dcd9060240160206040518083038186803b15801561181d57600080fd5b505afa158015611831573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185591906128db565b6118e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4465706f7369743a204d757374206861766520616e206163746976652070726f60448201527f66696c6500000000000000000000000000000000000000000000000000000000606482015260840161051a565b600a5460009015611a73577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166119ad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4465706f7369743a2050616e63616b6550726f66696c65206973206e6f74206560448201527f7869737400000000000000000000000000000000000000000000000000000000606482015260840161051a565b6040517f987ee1560000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063987ee1569060240160c06040518083038186803b158015611a3257600080fd5b505afa158015611a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6a91906129ee565b50929450505050505b600a541580611a845750600a548110155b611b10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4465706f7369743a2055736572206973206e6f742067657420656e6f7567682060448201527f7573657220706f696e7473000000000000000000000000000000000000000000606482015260840161051a565b505b611b1a611145565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515918217905560ff161580611b6457506007548154611b619084612ada565b11155b611bca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4465706f7369743a20416d6f756e742061626f7665206c696d69740000000000604482015260640161051a565b611bd26122bf565b805415611c375760008160010154600c546003548460000154611bf59190612c52565b611bff9190612af2565b611c099190612c8f565b90508015611c3557600d54611c359073ffffffffffffffffffffffffffffffffffffffff1633836123ce565b505b8115611c71578054611c4a908390612ada565b8155600e54611c719073ffffffffffffffffffffffffffffffffffffffff1633308561251c565b600c546003548254611c839190612c52565b611c8d9190612af2565b600182015560405182815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c906020015b60405180910390a2505060018055565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b6005544210611dbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f506f6f6c20686173207374617274656400000000000000000000000000000000604482015260640161051a565b808210611e4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4e657720737461727454696d657374616d70206d757374206265206c6f77657260448201527f207468616e206e657720656e6454696d657374616d7000000000000000000000606482015260840161051a565b814210611eda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4e657720737461727454696d657374616d70206d75737420626520686967686560448201527f72207468616e2063757272656e7420626c6f636b2074696d657374616d700000606482015260840161051a565b60058290556004819055600682905560408051838152602081018390527f600b4644e23e4e5ac956d20c02417fc8385bd0324ce2ce012b91d812ad89024b9101610e68565b60026001541415611f8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161051a565b60026001908155336000908152600f60205260408120805482825592810191909155908015611fd957600e54611fd99073ffffffffffffffffffffffffffffffffffffffff1633836123ce565b815460405190815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd969590602001611cc0565b60005473ffffffffffffffffffffffffffffffffffffffff16331461208e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051a565b73ffffffffffffffffffffffffffffffffffffffff8116612131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161051a565b610c10816124a7565b73ffffffffffffffffffffffffffffffffffffffff8181166000908152600f6020526040808220600e5491517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152929390928492909116906370a082319060240160206040518083038186803b1580156121ba57600080fd5b505afa1580156121ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f291906129b5565b90506006544211801561220457508015155b1561228c57600061221760065442612580565b90506000600b54826122299190612c52565b9050600083600c548361223c9190612c52565b6122469190612af2565b6003546122539190612ada565b90508460010154600c5482876000015461226d9190612c52565b6122779190612af2565b6122819190612c8f565b979650505050505050565b6001820154600c5460035484546122a39190612c52565b6122ad9190612af2565b6122b79190612c8f565b949350505050565b60065442116122ca57565b600e546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561233457600080fd5b505afa158015612348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236c91906129b5565b90508061237a575042600655565b600061238860065442612580565b90506000600b548261239a9190612c52565b905082600c54826123ab9190612c52565b6123b59190612af2565b6003546123c29190612ada565b60035550504260065550565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526124a29084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526125c1565b505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261257a9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612420565b50505050565b6000600454821161259c576125958383612c8f565b90506125bb565b60045483106125ad575060006125bb565b826004546125959190612c8f565b92915050565b6000612623826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166126cd9092919063ffffffff16565b8051909150156124a2578080602001905181019061264191906128db565b6124a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161051a565b60606126dc84846000856126e6565b90505b9392505050565b606082471015612778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161051a565b73ffffffffffffffffffffffffffffffffffffffff85163b6127f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161051a565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161281f9190612a6d565b60006040518083038185875af1925050503d806000811461285c576040519150601f19603f3d011682016040523d82523d6000602084013e612861565b606091505b50915091506122818282866060831561287b5750816126df565b82511561288b5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051a9190612a89565b6000602082840312156128d0578081fd5b81356126df81612d01565b6000602082840312156128ec578081fd5b81516126df81612d23565b60008060408385031215612909578081fd5b823561291481612d23565b946020939093013593505050565b600080600080600080600080610100898b03121561293e578384fd5b883561294981612d01565b9750602089013561295981612d01565b965060408901359550606089013594506080890135935060a0890135925060c0890135915060e089013561298c81612d01565b809150509295985092959890939650565b6000602082840312156129ae578081fd5b5035919050565b6000602082840312156129c6578081fd5b5051919050565b600080604083850312156129df578182fd5b50508035926020909101359150565b60008060008060008060c08789031215612a06578182fd5b8651955060208701519450604087015193506060870151612a2681612d01565b608088015160a08901519194509250612a3e81612d23565b809150509295509295509295565b600060208284031215612a5d578081fd5b815160ff811681146126df578182fd5b60008251612a7f818460208701612ca6565b9190910192915050565b6020815260008251806020840152612aa8816040850160208701612ca6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008219821115612aed57612aed612cd2565b500190565b600082612b26577f4e487b710000000000000000000000000000000000000000000000000000000081526012600452602481fd5b500490565b600181815b80851115612b8457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612b6a57612b6a612cd2565b80851615612b7757918102915b93841c9390800290612b30565b509250929050565b60006126df8383600082612ba2575060016125bb565b81612baf575060006125bb565b8160018114612bc55760028114612bcf57612beb565b60019150506125bb565b60ff841115612be057612be0612cd2565b50506001821b6125bb565b5060208310610133831016604e8410600b8410161715612c0e575081810a6125bb565b612c188383612b2b565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612c4a57612c4a612cd2565b029392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c8a57612c8a612cd2565b500290565b600082821015612ca157612ca1612cd2565b500390565b60005b83811015612cc1578181015183820152602001612ca9565b8381111561257a5750506000910152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610c1057600080fd5b8015158114610c1057600080fdfea26469706673582212201a5409e2034e26b4f0830b9c0fe49adea1f46ded92befa46ca00ee816c1d242064736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _pancakeProfile (address): 0x0000000000000000000000000000000000000000
Arg [1] : _pancakeProfileIsRequested (bool): False
Arg [2] : _pancakeProfileThresholdPoints (uint256): 0
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
19743:15616:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20826:44;;;;;;;;;15416:25:1;;;15404:2;15389:18;20826:44:0;;;;;;;;20573:40;;;;;;21219:44;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;15626:25:1;;;15682:2;15667:18;;15660:34;;;;15599:18;21219:44:0;15581:119:1;23623:1746:0;;;;;;:::i;:::-;;:::i;:::-;;27453:718;;;;;;:::i;:::-;;:::i;28837:142::-;;;;;;:::i;:::-;;:::i;20056:25::-;;;;;;;;;;;;;;;4767:14:1;;4760:22;4742:41;;4730:2;4715:18;20056:25:0;4697:92:1;30746:457:0;;;;;;:::i;:::-;;:::i;19992:21::-;;;;;;;;;20739:37;;;;;;;;;20468:31;;;;;;32425:500;;;;;;:::i;:::-;;:::i;12734:103::-;;;:::i;29775:131::-;;;:::i;12083:87::-;12129:7;12156:6;;;12083:87;;;3842:42:1;3830:55;;;3812:74;;3800:2;3785:18;12083:87:0;3767:125:1;20918:30:0;;;;;;20122:31;;;;;;35139:217;;;:::i;29155:530::-;;;;;;:::i;:::-;;:::i;30129:460::-;;;;;;:::i;:::-;;:::i;20212:27::-;;;;;;25527:1776;;;;;;:::i;:::-;;:::i;19899:43::-;;;;;20654:39;;;;;31470:679;;;;;;:::i;:::-;;:::i;21118:33::-;;;;;;;;;20986:31;;;;;;28312:407;;;:::i;20300:29::-;;;;;;12992:201;;;;;;:::i;:::-;;:::i;33098:768::-;;;;;;:::i;:::-;;:::i;21051:33::-;;;;;;;;;20390:34;;;;;;23623:1746;23962:13;;;;;;;23961:14;23953:46;;;;;;;13605:2:1;23953:46:0;;;13587:21:1;13644:2;13624:18;;;13617:30;13683:21;13663:18;;;13656:49;13722:18;;23953:46:0;;;;;;;;;24018:10;:32;24032:18;24018:32;;24010:56;;;;;;;15132:2:1;24010:56:0;;;15114:21:1;15171:2;15151:18;;;15144:30;15210:13;15190:18;;;15183:41;15241:18;;24010:56:0;15104:161:1;24010:56:0;24103:13;24085:15;:31;24077:98;;;;;;;12468:2:1;24077:98:0;;;12450:21:1;12507:2;12487:18;;;12480:30;12546:34;12526:18;;;12519:62;12617:24;12597:18;;;12590:52;12659:19;;24077:98:0;12440:244:1;24077:98:0;24212:15;24194;:33;24186:108;;;;;;;10575:2:1;24186:108:0;;;10557:21:1;10614:2;10594:18;;;10587:30;10653:34;10633:18;;;10626:62;10724:32;10704:18;;;10697:60;10774:19;;24186:108:0;10547:252:1;24186:108:0;24350:13;:20;;;;;;;;24383:11;:26;;;;;;;;;;;;;;24420:11;:26;;;;;;;;;;;;;;;24457:15;:34;;;24502:14;:32;;;24545:12;:28;;;24590:21;;24586:190;;24628:9;:16;;;;24640:4;24628:16;;;24659;:36;;;24710:25;:54;;;24586:190;24826:11;;:22;;;;;;;;24788:27;;24826:11;;;:20;;:22;;;;;;;;;;;;;;:11;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24818:31;;24788:61;;24890:2;24868:19;:24;24860:59;;;;;;;9817:2:1;24860:59:0;;;9799:21:1;9856:2;9836:18;;;9829:30;9895:24;9875:18;;;9868:52;9937:18;;24860:59:0;9789:172:1;24860:59:0;24964:33;24978:19;24972:2;24964:33;:::i;:::-;24959:39;;:2;:39;:::i;:::-;24932:16;:67;25084:11;25056:23;25060:19;25056:2;:23;:::i;:::-;25037:15;;25018:16;;:34;;;;:::i;:::-;:62;;;;:::i;:::-;:77;;25010:120;;;;;;;9458:2:1;25010:120:0;;;9440:21:1;9497:2;9477:18;;;9470:30;9536:32;9516:18;;;9509:60;9586:18;;25010:120:0;9430:180:1;25010:120:0;25223:14;;25201:19;:36;25336:25;25354:6;25336:17;:25::i;:::-;23623:1746;;;;;;;;;:::o;27453:718::-;14435:1;15033:7;;:19;;15025:63;;;;;;;14772:2:1;15025:63:0;;;14754:21:1;14811:2;14791:18;;;14784:30;14850:33;14830:18;;;14823:61;14901:18;;15025:63:0;14744:181:1;15025:63:0;14435:1;15166:7;:18;27554:10:::1;27521:21;27545:20:::0;;;:8:::1;:20;::::0;;;;27584:11;;:22;-1:-1:-1;27584:22:0::1;27576:62;;;::::0;::::1;::::0;;12891:2:1;27576:62:0::1;::::0;::::1;12873:21:1::0;12930:2;12910:18;;;12903:30;12969:29;12949:18;;;12942:57;13016:18;;27576:62:0::1;12863:177:1::0;27576:62:0::1;27651:13;:11;:13::i;:::-;27677:15;27749:4;:15;;;27730:16;;27710;;27696:4;:11;;;:30;;;;:::i;:::-;27695:51;;;;:::i;:::-;:69;;;;:::i;:::-;27677:87:::0;-1:-1:-1;27781:11:0;;27777:148:::1;;27823:11:::0;;:21:::1;::::0;27837:7;;27823:21:::1;:::i;:::-;27809:35:::0;;27859:11:::1;::::0;:54:::1;::::0;:11:::1;;27892:10;27905:7:::0;27859:24:::1;:54::i;:::-;27941:11:::0;;27937:98:::1;;27969:11;::::0;:54:::1;::::0;:11:::1;;28002:10;28015:7:::0;27969:24:::1;:54::i;:::-;28100:16;::::0;28080::::1;::::0;28066:11;;:30:::1;::::0;28080:16;28066:30:::1;:::i;:::-;28065:51;;;;:::i;:::-;28047:15;::::0;::::1;:69:::0;28134:29:::1;::::0;15416:25:1;;;28143:10:0::1;::::0;28134:29:::1;::::0;15404:2:1;15389:18;28134:29:0::1;;;;;;;-1:-1:-1::0;;14391:1:0;15345:22;;-1:-1:-1;27453:718:0:o;28837:142::-;12129:7;12156:6;12303:23;12156:6;11537:10;12303:23;12295:68;;;;;;;11006:2:1;12295:68:0;;;10988:21:1;;;11025:18;;;11018:30;11084:34;11064:18;;;11057:62;11136:18;;12295:68:0;10978:182:1;12295:68:0;28917:11:::1;::::0;:54:::1;::::0;:11:::1;;28950:10;28963:7:::0;28917:24:::1;:54::i;:::-;28837:142:::0;:::o;30746:457::-;12129:7;12156:6;12303:23;12156:6;11537:10;12303:23;12295:68;;;;;;;11006:2:1;12295:68:0;;;10988:21:1;;;11025:18;;;11018:30;11084:34;11064:18;;;11057:62;11136:18;;12295:68:0;10978:182:1;12295:68:0;30859:14:::1;;30841:15;:32;30833:61;;;::::0;::::1;::::0;;9113:2:1;30833:61:0::1;::::0;::::1;9095:21:1::0;9152:2;9132:18;;;9125:30;9191:18;9171;;;9164:46;9227:18;;30833:61:0::1;9085:166:1::0;30833:61:0::1;30943:11;::::0;:22:::1;::::0;;;;;;;30905:27:::1;::::0;30943:11:::1;;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:11;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30935:31;;::::0;-1:-1:-1;31052:11:0::1;31024:23;30935:31:::0;31024:2:::1;:23;:::i;:::-;31004:16;30985;;:35;;;;:::i;:::-;:63;;;;:::i;:::-;:78;;30977:121;;;::::0;::::1;::::0;;9458:2:1;30977:121:0::1;::::0;::::1;9440:21:1::0;9497:2;9477:18;;;9470:30;9536:32;9516:18;;;9509:60;9586:18;;30977:121:0::1;9430:180:1::0;30977:121:0::1;31109:15;:34:::0;;;31159:36:::1;::::0;15416:25:1;;;31159:36:0::1;::::0;15404:2:1;15389:18;31159:36:0::1;;;;;;;;12374:1;30746:457:::0;:::o;32425:500::-;12129:7;12156:6;12303:23;12156:6;11537:10;12303:23;12295:68;;;;;;;11006:2:1;12295:68:0;;;10988:21:1;;;11025:18;;;11018:30;11084:34;11064:18;;;11057:62;11136:18;;12295:68:0;10978:182:1;12295:68:0;32575:14:::1;:28;;32567:72;;;::::0;::::1;::::0;;7585:2:1;32567:72:0::1;::::0;::::1;7567:21:1::0;7624:2;7604:18;;;7597:30;7663:33;7643:18;;;7636:61;7714:18;;32567:72:0::1;7557:181:1::0;32567:72:0::1;32728:25;:40:::0;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;32779:29:::1;:48:::0;;;32843:74:::1;::::0;;4962:41:1;;;5034:2;5019:18;;5012:34;;;32843:74:0::1;::::0;4935:18:1;32843:74:0::1;4917:135:1::0;12734:103:0;12129:7;12156:6;12303:23;12156:6;11537:10;12303:23;12295:68;;;;;;;11006:2:1;12295:68:0;;;10988:21:1;;;11025:18;;;11018:30;11084:34;11064:18;;;11057:62;11136:18;;12295:68:0;10978:182:1;12295:68:0;12799:30:::1;12826:1;12799:18;:30::i;:::-;12734:103::o:0;29775:131::-;12129:7;12156:6;12303:23;12156:6;11537:10;12303:23;12295:68;;;;;;;11006:2:1;12295:68:0;;;10988:21:1;;;11025:18;;;11018:30;11084:34;11064:18;;;11057:62;11136:18;;12295:68:0;10978:182:1;12295:68:0;29842:15:::1;29827:12;:30:::0;;;29873:25:::1;::::0;15416::1;;;29873::0::1;::::0;15404:2:1;15389:18;29873:25:0::1;;;;;;;29775:131::o:0;35139:217::-;35206:9;;35184:4;;35206:9;;35205:10;;:79;;;35257:25;;35240:14;;:42;;;;:::i;:::-;35220:15;:63;;35205:79;35201:124;;;-1:-1:-1;35308:5:0;;35139:217::o;35201:124::-;-1:-1:-1;35344:4:0;;35139:217::o;29155:530::-;12129:7;12156:6;12303:23;12156:6;11537:10;12303:23;12295:68;;;;;;;11006:2:1;12295:68:0;;;10988:21:1;;;11025:18;;;11018:30;11084:34;11064:18;;;11057:62;11136:18;;12295:68:0;10978:182:1;12295:68:0;29249:11:::1;::::0;::::1;29231:30:::0;;::::1;29249:11:::0;::::1;29231:30;;29223:82;;;::::0;::::1;::::0;;13953:2:1;29223:82:0::1;::::0;::::1;13935:21:1::0;13992:2;13972:18;;;13965:30;14031:34;14011:18;;;14004:62;14102:9;14082:18;;;14075:37;14129:19;;29223:82:0::1;13925:229:1::0;29223:82:0::1;29342:11;::::0;::::1;29324:30:::0;;::::1;29342:11:::0;::::1;29324:30;;29316:82;;;::::0;::::1;::::0;;12060:2:1;29316:82:0::1;::::0;::::1;12042:21:1::0;12099:2;12079:18;;;12072:30;12138:34;12118:18;;;12111:62;12209:9;12189:18;;;12182:37;12236:19;;29316:82:0::1;12032:229:1::0;29316:82:0::1;29429:47;::::0;;;;29470:4:::1;29429:47;::::0;::::1;3812:74:1::0;29411:15:0::1;::::0;29429:32:::1;::::0;::::1;::::0;::::1;::::0;3785:18:1;;29429:47:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29411:65:::0;-1:-1:-1;29495:12:0;29487:64:::1;;;::::0;::::1;::::0;;6765:2:1;29487:64:0::1;::::0;::::1;6747:21:1::0;6804:2;6784:18;;;6777:30;6843:34;6823:18;;;6816:62;6914:9;6894:18;;;6887:37;6941:19;;29487:64:0::1;6737:229:1::0;29487:64:0::1;29564:65;:35;::::0;::::1;29608:10;29621:7:::0;29564:35:::1;:65::i;:::-;29661:6;29647:30;;;29669:7;29647:30;;;;15416:25:1::0;;15404:2;15389:18;;15371:76;29647:30:0::1;;;;;;;;12374:1;29155:530:::0;:::o;30129:460::-;12129:7;12156:6;12303:23;12156:6;11537:10;12303:23;12295:68;;;;;;;11006:2:1;12295:68:0;;;10988:21:1;;;11025:18;;;11018:30;11084:34;11064:18;;;11057:62;11136:18;;12295:68:0;10978:182:1;12295:68:0;30243:9:::1;::::0;::::1;;30235:33;;;::::0;::::1;::::0;;11367:2:1;30235:33:0::1;::::0;::::1;11349:21:1::0;11406:2;11386:18;;;11379:30;11445:13;11425:18;;;11418:41;11476:18;;30235:33:0::1;11339:161:1::0;30235:33:0::1;30283:10;30279:257;;;30338:16;;30318:17;:36;30310:73;;;::::0;::::1;::::0;;11707:2:1;30310:73:0::1;::::0;::::1;11689:21:1::0;11746:2;11726:18;;;11719:30;11785:26;11765:18;;;11758:54;11829:18;;30310:73:0::1;11679:174:1::0;30310:73:0::1;30398:16;:36:::0;;;30279:257:::1;;;30467:9;:22:::0;;;::::1;::::0;::::1;;;::::0;;-1:-1:-1;30504:16:0::1;:20:::0;30279:257:::1;30551:30;30564:16;;30551:30;;;;15416:25:1::0;;15404:2;15389:18;;15371:76;25527:1776:0;14435:1;15033:7;;:19;;15025:63;;;;;;;14772:2:1;15025:63:0;;;14754:21:1;14811:2;14791:18;;;14784:30;14850:33;14830:18;;;14823:61;14901:18;;15025:63:0;14744:181:1;15025:63:0;14435:1;15166:7;:18;25627:10:::1;25594:21;25618:20:::0;;;:8:::1;:20;::::0;;;;25655:14:::1;25618:20;25655:28;::::0;25651:894:::1;;25790:25;::::0;::::1;;25789:26;:64:::0;::::1;;;-1:-1:-1::0;25819:29:0::1;::::0;:34;25789:64:::1;25788:144;;;-1:-1:-1::0;25875:57:0::1;::::0;;;;25921:10:::1;25875:57;::::0;::::1;3812:74:1::0;25891:14:0::1;25875:45;;::::0;::::1;::::0;3785:18:1;;25875:57:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25762:242;;;::::0;::::1;::::0;;6360:2:1;25762:242:0::1;::::0;::::1;6342:21:1::0;6399:2;6379:18;;;6372:30;6438:34;6418:18;;;6411:62;6509:6;6489:18;;;6482:34;6533:19;;25762:242:0::1;6332:226:1::0;25762:242:0::1;26070:29;::::0;26021:24:::1;::::0;26070:33;26066:259:::1;;26132:14;:28;;26124:77;;;::::0;::::1;::::0;;8708:2:1;26124:77:0::1;::::0;::::1;8690:21:1::0;8747:2;8727:18;;;8720:30;8786:34;8766:18;;;8759:62;8857:6;8837:18;;;8830:34;8881:19;;26124:77:0::1;8680:226:1::0;26124:77:0::1;26251:58;::::0;;;;26298:10:::1;26251:58;::::0;::::1;3812:74:1::0;26267:14:0::1;26251:46;;::::0;::::1;::::0;3785:18:1;;26251:58:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;26220:89:0;;-1:-1:-1;;;;;26066:259:0::1;26367:29;::::0;:34;;:87:::1;;;26425:29;;26405:16;:49;;26367:87;26341:192;;;::::0;::::1;::::0;;7173:2:1;26341:192:0::1;::::0;::::1;7155:21:1::0;7212:2;7192:18;;;7185:30;7251:34;7231:18;;;7224:62;7322:13;7302:18;;;7295:41;7353:19;;26341:192:0::1;7145:233:1::0;26341:192:0::1;25651:894;;26569:14;:12;:14::i;:::-;26557:9;:26:::0;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;::::1;26605:9:::0;26604:10:::1;::::0;:59:::1;;-1:-1:-1::0;26646:16:0::1;::::0;26630:11;;26620:21:::1;::::0;:7;:21:::1;:::i;:::-;26619:43;;26604:59;26596:99;;;::::0;::::1;::::0;;7945:2:1;26596:99:0::1;::::0;::::1;7927:21:1::0;7984:2;7964:18;;;7957:30;8023:29;8003:18;;;7996:57;8070:18;;26596:99:0::1;7917:177:1::0;26596:99:0::1;26708:13;:11;:13::i;:::-;26738:11:::0;;:15;26734:255:::1;;26770:15;26842:4;:15;;;26823:16;;26803;;26789:4;:11;;;:30;;;;:::i;:::-;26788:51;;;;:::i;:::-;:69;;;;:::i;:::-;26770:87:::0;-1:-1:-1;26876:11:0;;26872:106:::1;;26908:11;::::0;:54:::1;::::0;:11:::1;;26941:10;26954:7:::0;26908:24:::1;:54::i;:::-;26734:255;;27005:11:::0;;27001:167:::1;;27047:11:::0;;:21:::1;::::0;27061:7;;27047:21:::1;:::i;:::-;27033:35:::0;;27083:11:::1;::::0;:73:::1;::::0;:11:::1;;27120:10;27141:4;27148:7:::0;27083:28:::1;:73::i;:::-;27233:16;::::0;27213::::1;::::0;27199:11;;:30:::1;::::0;27213:16;27199:30:::1;:::i;:::-;27198:51;;;;:::i;:::-;27180:15;::::0;::::1;:69:::0;27267:28:::1;::::0;15416:25:1;;;27275:10:0::1;::::0;27267:28:::1;::::0;15404:2:1;15389:18;27267:28:0::1;;;;;;;;-1:-1:-1::0;;14391:1:0;15345:22;;25527:1776::o;31470:679::-;12129:7;12156:6;12303:23;12156:6;11537:10;12303:23;12295:68;;;;;;;11006:2:1;12295:68:0;;;10988:21:1;;;11025:18;;;11018:30;11084:34;11064:18;;;11057:62;11136:18;;12295:68:0;10978:182:1;12295:68:0;31610:14:::1;;31592:15;:32;31584:61;;;::::0;::::1;::::0;;9113:2:1;31584:61:0::1;::::0;::::1;9095:21:1::0;9152:2;9132:18;;;9125:30;9191:18;9171;;;9164:46;9227:18;;31584:61:0::1;9085:166:1::0;31584:61:0::1;31682:13;31664:15;:31;31656:98;;;::::0;::::1;::::0;;12468:2:1;31656:98:0::1;::::0;::::1;12450:21:1::0;12507:2;12487:18;;;12480:30;12546:34;12526:18;;;12519:62;12617:24;12597:18;;;12590:52;12659:19;;31656:98:0::1;12440:244:1::0;31656:98:0::1;31791:15;31773;:33;31765:108;;;::::0;::::1;::::0;;10575:2:1;31765:108:0::1;::::0;::::1;10557:21:1::0;10614:2;10594:18;;;10587:30;10653:34;10633:18;;;10626:62;10724:32;10704:18;;;10697:60;10774:19;;31765:108:0::1;10547:252:1::0;31765:108:0::1;31886:14;:32:::0;;;31929:12:::1;:28:::0;;;32032:19:::1;:36:::0;;;32086:55:::1;::::0;;15626:25:1;;;15682:2;15667:18;;15660:34;;;32086:55:0::1;::::0;15599:18:1;32086:55:0::1;15581:119:1::0;28312:407:0;14435:1;15033:7;;:19;;15025:63;;;;;;;14772:2:1;15025:63:0;;;14754:21:1;14811:2;14791:18;;;14784:30;14850:33;14830:18;;;14823:61;14901:18;;15025:63:0;14744:181:1;15025:63:0;14435:1;15166:7;:18;;;28407:10:::1;28374:21;28398:20:::0;;;:8:::1;:20;::::0;;;;28456:11;;28478:15;;;28504;;::::1;:19:::0;;;;28398:20;28540;;28536:116:::1;;28577:11;::::0;:63:::1;::::0;:11:::1;;28610:10;28623:16:::0;28577:24:::1;:63::i;:::-;28699:11:::0;;28669:42:::1;::::0;15416:25:1;;;28687:10:0::1;::::0;28669:42:::1;::::0;15404:2:1;15389:18;28669:42:0::1;15371:76:1::0;12992:201:0;12129:7;12156:6;12303:23;12156:6;11537:10;12303:23;12295:68;;;;;;;11006:2:1;12295:68:0;;;10988:21:1;;;11025:18;;;11018:30;11084:34;11064:18;;;11057:62;11136:18;;12295:68:0;10978:182:1;12295:68:0;13081:22:::1;::::0;::::1;13073:73;;;::::0;::::1;::::0;;8301:2:1;13073:73:0::1;::::0;::::1;8283:21:1::0;8340:2;8320:18;;;8313:30;8379:34;8359:18;;;8352:62;8450:8;8430:18;;;8423:36;8476:19;;13073:73:0::1;8273:228:1::0;13073:73:0::1;13157:28;13176:8;13157:18;:28::i;33098:768::-:0;33203:15;;;;33159:7;33203:15;;;:8;:15;;;;;;33257:11;;:36;;;;;33287:4;33257:36;;;3812:74:1;33159:7:0;;33203:15;;33159:7;;33257:11;;;;:21;;3785:18:1;;33257:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33229:64;;33326:19;;33308:15;:37;:63;;;;-1:-1:-1;33349:22:0;;;33308:63;33304:555;;;33388:18;33409:52;33424:19;;33445:15;33409:14;:52::i;:::-;33388:73;;33476:18;33510:15;;33497:10;:28;;;;:::i;:::-;33476:49;;33540:29;33625:17;33605:16;;33592:10;:29;;;;:::i;:::-;33591:51;;;;:::i;:::-;33572:16;;:70;;;;:::i;:::-;33540:102;;33723:4;:15;;;33704:16;;33679:21;33665:4;:11;;;:35;;;;:::i;:::-;33664:56;;;;:::i;:::-;:74;;;;:::i;:::-;33657:81;33098:768;-1:-1:-1;;;;;;;33098:768:0:o;33304:555::-;33832:15;;;;33813:16;;33793;;33779:11;;:30;;33793:16;33779:30;:::i;:::-;33778:51;;;;:::i;:::-;:69;;;;:::i;:::-;33771:76;33098:768;-1:-1:-1;;;;33098:768:0:o;33967:623::-;34033:19;;34014:15;:38;34010:77;;33967:623::o;34010:77::-;34127:11;;:36;;;;;34157:4;34127:36;;;3812:74:1;34099:25:0;;34127:11;;;:21;;3785:18:1;;34127:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34099:64;-1:-1:-1;34180:22:0;34176:113;;-1:-1:-1;34241:15:0;34219:19;:37;33967:623::o;34176:113::-;34301:18;34322:52;34337:19;;34358:15;34322:14;:52::i;:::-;34301:73;;34385:18;34419:15;;34406:10;:28;;;;:::i;:::-;34385:49;;34517:17;34497:16;;34484:10;:29;;;;:::i;:::-;34483:51;;;;:::i;:::-;34464:16;;:70;;;;:::i;:::-;34445:16;:89;-1:-1:-1;;34567:15:0;34545:19;:37;-1:-1:-1;33967:623:0:o;15441:211::-;15585:58;;4504:42:1;4492:55;;15585:58:0;;;4474:74:1;4564:18;;;4557:34;;;15558:86:0;;15578:5;;15608:23;;4447:18:1;;15585:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15558:19;:86::i;:::-;15441:211;;;:::o;13353:191::-;13427:16;13446:6;;;13463:17;;;;;;;;;;13496:40;;13446:6;;;;;;;13496:40;;13427:16;13496:40;13353:191;;:::o;15660:248::-;15831:68;;4109:42:1;4178:15;;;15831:68:0;;;4160:34:1;4230:15;;4210:18;;;4203:43;4262:18;;;4255:34;;;15804:96:0;;15824:5;;15854:27;;4072:18:1;;15831:68:0;4054:241:1;15804:96:0;15660:248;;;;:::o;34764:300::-;34839:7;34870:12;;34863:3;:19;34859:198;;34906:11;34912:5;34906:3;:11;:::i;:::-;34899:18;;;;34859:198;34948:12;;34939:5;:21;34935:122;;-1:-1:-1;34984:1:0;34977:8;;34935:122;35040:5;35025:12;;:20;;;;:::i;34935:122::-;34764:300;;;;:::o;17990:716::-;18414:23;18440:69;18468:4;18440:69;;;;;;;;;;;;;;;;;18448:5;18440:27;;;;:69;;;;;:::i;:::-;18524:17;;18414:95;;-1:-1:-1;18524:21:0;18520:179;;18621:10;18610:30;;;;;;;;;;;;:::i;:::-;18602:85;;;;;;;14361:2:1;18602:85:0;;;14343:21:1;14400:2;14380:18;;;14373:30;14439:34;14419:18;;;14412:62;14510:12;14490:18;;;14483:40;14540:19;;18602:85:0;14333:232:1;6899:229:0;7036:12;7068:52;7090:6;7098:4;7104:1;7107:12;7068:21;:52::i;:::-;7061:59;;6899:229;;;;;;:::o;8019:510::-;8189:12;8247:5;8222:21;:30;;8214:81;;;;;;;10168:2:1;8214:81:0;;;10150:21:1;10207:2;10187:18;;;10180:30;10246:34;10226:18;;;10219:62;10317:8;10297:18;;;10290:36;10343:19;;8214:81:0;10140:228:1;8214:81:0;4449:19;;;;8306:60;;;;;;;13247:2:1;8306:60:0;;;13229:21:1;13286:2;13266:18;;;13259:30;13325:31;13305:18;;;13298:59;13374:18;;8306:60:0;13219:179:1;8306:60:0;8380:12;8394:23;8421:6;:11;;8440:5;8447:4;8421:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8379:73;;;;8470:51;8487:7;8496:10;8508:12;10855;10884:7;10880:530;;;-1:-1:-1;10915:10:0;10908:17;;10880:530;11029:17;;:21;11025:374;;11227:10;11221:17;11288:15;11275:10;11271:2;11267:19;11260:44;11175:148;11370:12;11363:20;;;;;;;;;;;:::i;14:257:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:255::-;343:6;396:2;384:9;375:7;371:23;367:32;364:2;;;417:6;409;402:22;364:2;454:9;448:16;473:28;495:5;473:28;:::i;536:319::-;601:6;609;662:2;650:9;641:7;637:23;633:32;630:2;;;683:6;675;668:22;630:2;727:9;714:23;746:28;768:5;746:28;:::i;:::-;793:5;845:2;830:18;;;;817:32;;-1:-1:-1;;;620:235:1:o;860:926::-;1024:6;1032;1040;1048;1056;1064;1072;1080;1133:3;1121:9;1112:7;1108:23;1104:33;1101:2;;;1155:6;1147;1140:22;1101:2;1199:9;1186:23;1218:31;1243:5;1218:31;:::i;:::-;1268:5;-1:-1:-1;1325:2:1;1310:18;;1297:32;1338:33;1297:32;1338:33;:::i;:::-;1390:7;-1:-1:-1;1444:2:1;1429:18;;1416:32;;-1:-1:-1;1495:2:1;1480:18;;1467:32;;-1:-1:-1;1546:3:1;1531:19;;1518:33;;-1:-1:-1;1598:3:1;1583:19;;1570:33;;-1:-1:-1;1650:3:1;1635:19;;1622:33;;-1:-1:-1;1707:3:1;1692:19;;1679:33;1721;1679;1721;:::i;:::-;1773:7;1763:17;;;1091:695;;;;;;;;;;;:::o;1791:190::-;1850:6;1903:2;1891:9;1882:7;1878:23;1874:32;1871:2;;;1924:6;1916;1909:22;1871:2;-1:-1:-1;1952:23:1;;1861:120;-1:-1:-1;1861:120:1:o;1986:194::-;2056:6;2109:2;2097:9;2088:7;2084:23;2080:32;2077:2;;;2130:6;2122;2115:22;2077:2;-1:-1:-1;2158:16:1;;2067:113;-1:-1:-1;2067:113:1:o;2185:258::-;2253:6;2261;2314:2;2302:9;2293:7;2289:23;2285:32;2282:2;;;2335:6;2327;2320:22;2282:2;-1:-1:-1;;2363:23:1;;;2433:2;2418:18;;;2405:32;;-1:-1:-1;2272:171:1:o;2448:636::-;2560:6;2568;2576;2584;2592;2600;2653:3;2641:9;2632:7;2628:23;2624:33;2621:2;;;2675:6;2667;2660:22;2621:2;2709:9;2703:16;2693:26;;2759:2;2748:9;2744:18;2738:25;2728:35;;2803:2;2792:9;2788:18;2782:25;2772:35;;2850:2;2839:9;2835:18;2829:25;2863:31;2888:5;2863:31;:::i;:::-;2958:3;2943:19;;2937:26;3008:3;2993:19;;2987:26;2913:5;;-1:-1:-1;2937:26:1;-1:-1:-1;3022:30:1;2987:26;3022:30;:::i;:::-;3071:7;3061:17;;;2611:473;;;;;;;;:::o;3089:293::-;3157:6;3210:2;3198:9;3189:7;3185:23;3181:32;3178:2;;;3231:6;3223;3216:22;3178:2;3268:9;3262:16;3318:4;3311:5;3307:16;3300:5;3297:27;3287:2;;3343:6;3335;3328:22;3387:274;3516:3;3554:6;3548:13;3570:53;3616:6;3611:3;3604:4;3596:6;3592:17;3570:53;:::i;:::-;3639:16;;;;;3524:137;-1:-1:-1;;3524:137:1:o;5309:442::-;5458:2;5447:9;5440:21;5421:4;5490:6;5484:13;5533:6;5528:2;5517:9;5513:18;5506:34;5549:66;5608:6;5603:2;5592:9;5588:18;5583:2;5575:6;5571:15;5549:66;:::i;:::-;5667:2;5655:15;5672:66;5651:88;5636:104;;;;5742:2;5632:113;;5430:321;-1:-1:-1;;5430:321:1:o;15705:128::-;15745:3;15776:1;15772:6;15769:1;15766:13;15763:2;;;15782:18;;:::i;:::-;-1:-1:-1;15818:9:1;;15753:80::o;15838:274::-;15878:1;15904;15894:2;;15939:77;15936:1;15929:88;16040:4;16037:1;16030:15;16068:4;16065:1;16058:15;15894:2;-1:-1:-1;16097:9:1;;15884:228::o;16117:482::-;16206:1;16249:5;16206:1;16263:330;16284:7;16274:8;16271:21;16263:330;;;16403:4;16335:66;16331:77;16325:4;16322:87;16319:2;;;16412:18;;:::i;:::-;16462:7;16452:8;16448:22;16445:2;;;16482:16;;;;16445:2;16561:22;;;;16521:15;;;;16263:330;;;16267:3;16181:418;;;;;:::o;16604:131::-;16664:5;16693:36;16720:8;16714:4;16789:5;16819:8;16809:2;;-1:-1:-1;16860:1:1;16874:5;;16809:2;16908:4;16898:2;;-1:-1:-1;16945:1:1;16959:5;;16898:2;16990:4;17008:1;17003:59;;;;17076:1;17071:130;;;;16983:218;;17003:59;17033:1;17024:10;;17047:5;;;17071:130;17108:3;17098:8;17095:17;17092:2;;;17115:18;;:::i;:::-;-1:-1:-1;;17171:1:1;17157:16;;17186:5;;16983:218;;17285:2;17275:8;17272:16;17266:3;17260:4;17257:13;17253:36;17247:2;17237:8;17234:16;17229:2;17223:4;17220:12;17216:35;17213:77;17210:2;;;-1:-1:-1;17322:19:1;;;17354:5;;17210:2;17401:34;17426:8;17420:4;17401:34;:::i;:::-;17531:6;17463:66;17459:79;17450:7;17447:92;17444:2;;;17542:18;;:::i;:::-;17580:20;;16799:807;-1:-1:-1;;;16799:807:1:o;17611:228::-;17651:7;17777:1;17709:66;17705:74;17702:1;17699:81;17694:1;17687:9;17680:17;17676:105;17673:2;;;17784:18;;:::i;:::-;-1:-1:-1;17824:9:1;;17663:176::o;17844:125::-;17884:4;17912:1;17909;17906:8;17903:2;;;17917:18;;:::i;:::-;-1:-1:-1;17954:9:1;;17893:76::o;17974:258::-;18046:1;18056:113;18070:6;18067:1;18064:13;18056:113;;;18146:11;;;18140:18;18127:11;;;18120:39;18092:2;18085:10;18056:113;;;18187:6;18184:1;18181:13;18178:2;;;-1:-1:-1;;18222:1:1;18204:16;;18197:27;18027:205::o;18237:184::-;18289:77;18286:1;18279:88;18386:4;18383:1;18376:15;18410:4;18407:1;18400:15;18426:154;18512:42;18505:5;18501:54;18494:5;18491:65;18481:2;;18570:1;18567;18560:12;18585:118;18671:5;18664:13;18657:21;18650:5;18647:32;18637:2;;18693:1;18690;18683:12
Swarm Source
ipfs://1a5409e2034e26b4f0830b9c0fe49adea1f46ded92befa46ca00ee816c1d2420
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.